R語言之Random Forest隨機森林

什麼是隨機森林?node

隨機森林就是經過集成學習的思想將多棵樹集成的一種算法,它的基本單元是決策樹,而它的本質屬於機器學習的一大分支——集成學習(Ensemble Learning)方法。隨機森林的名稱中有兩個關鍵詞,一個是「隨機」,一個就是「森林」。「森林」咱們很好理解,一棵叫作樹,那麼成百上千棵就能夠叫作森林了,這樣的比喻仍是很貼切的,其實這也是隨機森林的主要思想--集成思想的體現。git

 

隨機森林算法的實質是基於決策樹的分類器集成算法,其中每一棵樹都依賴於一個隨機向量,隨機森林的全部向量都是獨立同分布的。隨機森林就是對數據集的列變量和行觀測進行隨機化,生成多個分類數,最終將分類樹結果進行彙總。github

隨機森林相比於神經網絡,下降了運算量的同時也提升了預測精度,並且該算法對多元共線性不敏感以及對缺失數據和非平衡數據比較穩健,能夠很好地適應多達幾千個解釋變量數據集。算法

 

隨機森林的組成bootstrap

隨機森林是由多個CART分類決策樹構成,在構建決策樹過程當中,不進行任何剪枝動做,經過隨機挑選觀測(行)和變量(列)造成每一棵樹。對於分類模型,隨機森林將根據投票法爲待分類樣本進行分類;對於預測模型,隨機森林將使用單棵樹的簡單平均值來預測樣本的Y值。網絡

 

隨機森林的估計過程dom

1)指定m值,即隨機產生m個變量用於節點上的二叉樹,二叉樹變量的選擇仍然知足節點不純度最小原則;機器學習

2)應用Bootstrap自助法在原數據集中有放回地隨機抽取k個樣本集,組成k棵決策樹,而對於未被抽取的樣本用於單棵決策樹的預測;函數

3)根據k個決策樹組成的隨機森林對待分類樣本進行分類或預測,分類的原則是投票法,預測的原則是簡單平均。性能

 

隨機森林的兩個重要參數: 

1.樹節點預選的變量個數:單棵決策樹決策樹的狀況。 

2.隨機森林中樹的個數:隨機森林的整體規模。 

 

隨機森林模型評價因素

1)每棵樹生長越茂盛,組成森林的分類性能越好;

2)每棵樹之間的相關性越差,或樹之間是獨立的,則森林的分類性能越好。

減少特徵選擇個數m,樹的相關性和分類能力也會相應的下降;增大m,二者也會隨之增大。因此關鍵問題是如何選擇最優的m(或者是範圍),這也是隨機森林惟一的一個參數。 

  對於分類問題(將某個樣本劃分到某一類),也就是離散變量問題,CART使用Gini值做爲評判標準。定義爲Gini=1-∑(P(i)*P(i)),P(i)爲當前節點上數據集中第i類樣本的比例。例如:分爲2類,當前節點上有100個樣本,屬於第一類的樣本有70個,屬於第二類的樣本有30個,則Gini=1-0.7×07-0.3×03=0.42,能夠看出,類別分佈越平均,Gini值越大,類分佈越不均勻,Gini值越小。

在尋找最佳的分類特徵和閾值時,評判標準爲:argmax(Gini-GiniLeft-GiniRight),即尋找最佳的特徵f和閾值th,使得當前節點的Gini值減去左子節點的Gini和右子節點的Gini值最大。

主要函數

R語言中的randomForest包能夠實現隨機森林算法的應用,該包中主要涉及5個重要函數,關於這5個函數的語法和參數請見下方:

1)randomForest()函數用於構建隨機森林模型

randomForest(formula, data=NULL, ..., subset, na.action=na.fail)

randomForest(x, y=NULL, xtest=NULL, ytest=NULL, ntree=500,

mtry=if (!is.null(y) && !is.factor(y))

max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x))),

replace=TRUE, classwt=NULL, cutoff, strata,

sampsize = if (replace) nrow(x) else ceiling(.632*nrow(x)),

nodesize = if (!is.null(y) && !is.factor(y)) 5 else 1,

maxnodes = NULL,

importance=FALSE, localImp=FALSE, nPerm=1,

proximity, oob.prox=proximity,

norm.votes=TRUE, do.trace=FALSE,

keep.forest=!is.null(y) && is.null(xtest), corr.bias=FALSE,

keep.inbag=FALSE, ...)

formula指定模型的公式形式,相似於y~x1+x2+x3...;

data指定分析的數據集;

subset以向量的形式肯定樣本數據集;

na.action指定數據集中缺失值的處理方法,默認爲na.fail,即不容許出現缺失值,也能夠指定爲na.omit,即刪除缺失樣本;

x指定模型的解釋變量,能夠是矩陣,也能夠是數據框;y指定模型的因變量,能夠是離散的因子,也能夠是連續的數值,分別對應於隨機森林的分類模型和預測模型。這裏須要說明的是,若是不指定y值,則隨機森林將是一個無監督的模型;

xtestytest用於預測的測試集;

ntree指定隨機森林所包含的決策樹數目,默認爲500;

mtry指定節點中用於二叉樹的變量個數,默認狀況下數據集變量個數的二次方根(分類模型)或三分之一(預測模型)。通常是須要進行人爲的逐次挑選,肯定最佳的m值;

replace指定Bootstrap隨機抽樣的方式,默認爲有放回的抽樣;

classwt指定分類水平的權重,對於迴歸模型,該參數無效;

strata爲因子向量,用於分層抽樣;

sampsize用於指定樣本容量,通常與參數strata聯合使用,指定分層抽樣中層的樣本量;

nodesize指定決策樹節點的最小個數,默認狀況下,判別模型爲1,迴歸模型爲5;

maxnodes指定決策樹節點的最大個數;

importance邏輯參數,是否計算各個變量在模型中的重要性,默認不計算,該參數主要結合importance()函數使用;

proximity邏輯參數,是否計算模型的臨近矩陣,主要結合MDSplot()函數使用;

oob.prox是否基於OOB數據計算臨近矩陣;

norm.votes顯示投票格式,默認以百分比的形式展現投票結果,也能夠採用絕對數的形式;

do.trace是否輸出更詳細的隨機森林模型運行過程,默認不輸出;

keep.forest是否保留模型的輸出對象,對於給定xtest值後,默認將不保留算法的運算結果。

 

2)importance()函數用於計算模型變量的重要性

importance(x, type=NULL, class="NULL", scale=TRUE, ...)

x爲randomForest對象;

type能夠是1,也能夠是2,用於判別計算變量重要性的方法,1表示使用精度平均較少值做爲度量標準;2表示採用節點不純度的平均減小值最爲度量標準。值越大說明變量的重要性越強;

scale默認對變量的重要性值進行標準化。

 

3)MDSplot()函數用於實現隨機森林的可視化

MDSplot(rf, fac, k=2, palette=NULL, pch=20, ...)

rf爲randomForest對象,須要說明的是,在構建隨機森林模型時必須指定計算臨近矩陣,即設置proximity參數爲TRUE;

fac指定隨機森林模型中所使用到的因子向量(因變量);

palette指定所繪圖形中各個類別的顏色;

pch指定所繪圖形中各個類別形狀;

還能夠經過R自帶的plot函數繪製隨機森林決策樹的數目與模型偏差的折線圖

 

4)rfImpute()函數可爲存在缺失值的數據集進行插補(隨機森林法),獲得最優的樣本擬合值

rfImpute(x, y, iter=5, ntree=300, ...)

rfImpute(x, data, ..., subset)

x爲存在缺失值的數據集;

y爲因變量,不能夠存在缺失狀況;

iter指定插值過程當中迭代次數;

ntree指定每次迭代生成的隨機森林中決策樹數量;

subset以向量的形式指定樣本集。

 

5)treesize()函數用於計算隨機森林中每棵樹的節點個數

treesize(x, terminal=TRUE)

x爲randomForest對象;

terminal指定計算節點數目的方式,默認只計算每棵樹的根節點,設置爲FALSE時將計算全部節點(根節點+葉節點)。

通常treesize()函數生成的結果用於繪製直方圖,方面查看隨機森林中樹的節點分佈狀況。

 

bagging簡介

在bagging方法裏,從數據裏抽取出自舉樣本(有放回的隨機樣本),根據每個樣本,能夠創建一個決策樹模型,最終的模型是全部單個決策樹結果的平均。bagging決策樹算法經過下降方差獲得穩定的最終模型,這種方法提升了精度,也不太可能過擬合。

應用

在隨機森林算法的函數randomForest()中有兩個很是重要的參數,而這兩個參數又將影響模型的準確性,它們分別是mtry和ntree通常對mtry的選擇是逐一嘗試,直到找到比較理想的值,ntree的選擇可經過圖形大體判斷模型內偏差穩定時的值。


#將數據集分爲訓練集和測試集,並查看數據集基本屬性。數據爲R自帶IRIS數據

#選取randomforest –mtry節點值,對應偏差最小爲2,通常可默認。一般也是2記得。mtry指定節點中用於二叉樹的變量個數,默認狀況下數據集變量個數的二次方根(分類模型)或三分之一(預測模型)。

#以後選擇ntree值,ntree指定隨機森林所包含的決策樹數目,默認爲500;.在400左右時,模型內偏差基本穩定,故取ntree=400。

> set.seed(100)

> ntree_fit<-randomForest(Species~.,data=train,mtry=2,ntree=1000)

> plot(ntree_fit)

#看結果

由上圖的結果可知,OOB偏差爲2.8%,同時在隨機森林中,第二類和第三類仍然有偏差,會被誤判,也能夠經過輸入plot(rf)繪製每一棵樹的誤判率的圖。

#看重要性

> set.seed(100)

> varImpPlot(rf)

#最後驗證並預測

> pred1<-predict(rf,data=train)

> Freq1<-table(pred1,train$Species)

#驗證矩陣中跡佔總體狀況,

精度=0.97。

#margin參數無main,爲了展現而寫,不報錯

plot(margin(rf,test$Species),main=觀測值被判斷正確的機率圖)

總結

  • bagging經過減小方差來穩定決策樹並提升精度。
  • bagging下降泛化偏差。
  • 隨機森林經過去除bagging集合中的個體樹之間的相關性來進一步提升決策樹的性能。
  • 隨機森林的變量重要性度量能夠幫助肯定哪些變量對模型的貢獻度最大。
  • 因爲隨機森林的集合中的樹是未剪枝的而且每每很是深,還有過擬合的危險,所以,必定要確保在保留數據上使用簡單交叉驗證來評估模型,從而更好地評價模型的性能。

  隨機森林是一種集成學習+決策樹的分類模型,它能夠利用集成的思想(投票選擇的策略)來提高單顆決策樹的分類性能(通俗來說就是「三個臭皮匠,頂一個諸葛亮」)。

  集集成學習和決策樹於一身,隨機森林算法具備衆多的優勢,其中最爲重要的就是在隨機森林算法中每棵樹都盡最大程度的生長,而且沒有剪枝過程。

  隨機森林引入了兩個隨機性——隨機選擇樣本(bootstrap sample)和隨機選擇特徵進行訓練。兩個隨機性的引入對隨機森林的分類性能相當重要。因爲它們的引入,使得隨機森林不容易陷入過擬合,而且具備很好得抗噪能力(好比:對缺省值不敏感)。

參考:http://www.36dsj.com/archives/21036

   http://blog.csdn.net/hhtnan/article/details/54580747

     http://zzanswer.github.io/

相關文章
相關標籤/搜索