R語言實現隨機森林的方法示例

隨機森林算法介紹

算法介紹:

簡單的說,隨機森林就是用隨機的方式建立一個森林,森林裡面有很多的決策樹,並且每棵樹之間是沒有關聯的。得到一個森林後,當有一個新的樣本輸入,森林中的每一棵決策樹會分別進行一下判斷,進行類別歸類(針對分類算法),最後比較一下被判定哪一類最多,就預測該樣本為哪一類。
隨機森林算法有兩個主要環節:決策樹的生長和投票過程。

決策樹生長步驟:

  • 從容量為N的原始訓練樣本數據中采取放回抽樣方式(即bootstrap取樣)隨機抽取自助樣本集,重復k(樹的數目為k)次形成一個新的訓練集N,以此生成一棵分類樹;
  • 每個自助樣本集生長為單棵分類樹,該自助樣本集是單棵分類樹的全部訓練數據。設有M個輸入特征,則在樹的每個節點處從M個特征中隨機挑選m(m < M)個特征,按照節點不純度最小的原則從這m個特征中選出一個特征進行分枝生長,然後再分別遞歸調用上述過程構造各個分枝,直到這棵樹能準確地分類訓練集或所有屬性都已被使用過。在整個森林的生長過程中m將保持恒定;
  • 分類樹為瞭達到低偏差和高差異而要充分生長,使每個節點的不純度達到最小,不進行通常的剪枝操作。

投票過程:

隨機森林采用Bagging方法生成多個決策樹分類器。

基本思想:

  • 給定一個弱學習算法和一個訓練集,單個弱學習算法準確率不高,可以視為一個窄領域專傢;
  • 將該學習算法使用多次,得出預測函數序列,進行投票,將多個窄領域專傢評估結果匯總,最後結果準確率將大幅提升。

隨機森林的優點:

  • 可以處理大量的輸入變量;
  • 對於很多種資料,可以產生高準確度的分類器;
  • 可以在決定類別時,評估變量的重要性;
  • 在建造森林時,可以在內部對於一般化後的誤差產生不偏差的估計;
  • 包含一個好方法可以估計遺失的資料,並且,如果有很大一部分的資料遺失,仍可以維持準確度;
  • 提供一個實驗方法,可以去偵測 variable interactions;
  • 對於不平衡的分類資料集來說,可以平衡誤差;
  • 計算各例中的親近度,對於數據挖掘、偵測偏離者(outlier)和將資料視覺化非常有用;
  • 使用上述。可被延伸應用在未標記的資料上,這類資料通常是使用非監督式聚類。也可偵測偏離者和觀看資料;
  • 學習過程很快速。

缺點

  • 隨機森林已經被證明在某些噪音較大的分類或回歸問題上會過擬合;
  • 對於有不同級別的屬性的數據,級別劃分較多的屬性會對隨機森林產生更大的影響,所以隨機森林在這種數據上產出的屬性權值是不可信的。

R語言實現

尋找最優參數mtry,即指定節點中用於二叉樹的最佳變量個數

library("randomForest")
n<-length(names(train_data))     #計算數據集中自變量個數,等同n=ncol(train_data)
rate=1     #設置模型誤判率向量初始值

for(i in 1:(n-1)){
  set.seed(1234)
  rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=i,ntree=1000)
  rate[i]<-mean(rf_train$err.rate)   #計算基於OOB數據的模型誤判率均值
  print(rf_train)    
}

rate     #展示所有模型誤判率的均值
plot(rate)

尋找最佳參數ntree,即指定隨機森林所包含的最佳決策樹數目

set.seed(100)
rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntree=1000)
plot(rf_train)    #繪制模型誤差與決策樹數量關系圖  
legend(800,0.02,"IS_LIUSHI=0",cex=0.9,bty="n")    
legend(800,0.0245,"total",cex=0.09,bty="n")    

隨機森林模型搭建

set.seed(100)
rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntree=400,importance=TRUE,proximity=TRUE)    
  • importance設定是否輸出因變量在模型中的重要性,如果移除某個變量,模型方差增加的比例是它判斷變量重要性的標準之一;
  • proximity參數用於設定是否計算模型的臨近矩陣;
  • ntree用於設定隨機森林的樹數。

輸出變量重要性:分別從精確度遞減和均方誤差遞減的角度來衡量重要程度。

importance<-importance(rf_train) 
write.csv(importance,file="E:/模型搭建/importance.csv",row.names=T,quote=F)
barplot(rf_train$importance[,1],main="輸入變量重要性測度指標柱形圖")
box()

提取隨機森林模型中以準確率遞減方法得到維度重要性值。type=2為基尼系數方法

importance(rf_train,type=1)
 
varImpPlot(x=rf_train,sort=TRUE,n.var=nrow(rf_train$importance),main="輸入變量重要性測度散點圖")

信息展示

print(rf_train)    #展示隨機森林模型簡要信息
hist(treesize(rf_train))   #展示隨機森林模型中每棵決策樹的節點數
max(treesize(rf_train));min(treesize(rf_train))
MDSplot(rf_train,train_data$IS_OFF_USER,palette=rep(1,2),pch=as.numeric(train_data$IS_LIUSHI))    #展示數據集在二維情況下各類別的具體分佈情況

檢測

pred<-predict(rf_train,newdata=test_data)  
pred_out_1<-predict(object=rf_train,newdata=test_data,type="prob")  #輸出概率
table <- table(pred,test_data$IS_LIUSHI)  
sum(diag(table))/sum(table)  #預測準確率
plot(margin(rf_train,test_data$IS_LIUSHI),main=觀測值被判斷正確的概率圖)

randomForest包可以實現隨機森林算法的應用,主要涉及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值,則隨機森林將是一個無監督的模型;
  • xtest和ytest用於預測的測試集;
  • 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()函數生成的結果用於繪制直方圖,方面查看隨機森林中樹的節點分佈情況。

到此這篇關於R語言實現隨機森林的方法示例的文章就介紹到這瞭,更多相關R語言 隨機森林內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: