1.介紹
如前文所述,随機森林目前擁有比較好的正确率,在各種資料中表現位于前列。随機森林顧名思義,是用随機的方式建立一個森林,森林裡面有很多的決策樹組成,随機森林的每一棵決策樹之間是沒有關聯的。在得到森林之後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分别進行一下判斷,看看這個樣本應該屬于哪一類(對于分類算法),然後看看哪一類被選擇最多,就預測這個樣本為那一類。在建立每一棵決策樹的過程中,有兩點需要注意 - 采樣與完全分裂。對于行采樣,采用有放回的方式,也就是在采樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本為N個,那麼采樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting。
然後進行列采樣。之後就是對采樣之後的資料使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裡面的所有樣本的都是指向的同一個分類。
按這種算法得到的随機森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。我覺得可以這樣比喻随機森林算法:每一棵決策樹就是一個精通于某一個窄領域的專家,這樣在随機森林中就有了很多個精通不同領域的專家,對一個新的問題(新的輸入資料),可以用不同的角度去看待它,最終由各個專家,投票得到結果。
主要函數
R語言中的randomForest包可以實作随機森林算法的應用,該包中主要涉及5個重要函數,關于這5個函數的文法和參數請見下方:
- formula指定模型的公式形式,類似于y~x1+x2+x3...;
- data指定分析的資料集;
- subset以向量的形式确定樣本資料集;
- na.action指定資料集中缺失值的處理方法,預設為na.fail,即不允許出現缺失值,也可以指定為na.omit,即删除缺失樣本;
- x指定模型的解釋變量,可以是矩陣,也可以是資料框;y指定模型的因變量,可以是離散的因子,也可以是連續的數值,分别對應于随機森林的分類模型和預測模型。這裡需要說明的是,如果不指定y值,則随機森林将是一個無監督的模型;
- xtest和ytest用于預測的測試集;
- ntree指定随機森林所包含的決策樹數目,預設為500;
- mtry指定節點中用于二叉樹的變量個數,預設情況下資料集變量個數的二次方根(分類模型)或三分之一(預測模型)。一般是需要進行人為的逐次挑選,确定最佳的m值;
- replace指定Bootstrap随機抽樣的方式,預設為有放回的抽樣;
- nodesize指定決策樹節點的最小個數,預設情況下,判别模型為1,回歸模型為5;
- maxnodes指定決策樹節點的最大個數;
- norm.votes顯示投票格式,預設以百分比的形式展示投票結果,也可以采用絕對數的形式;
- do.trace是否輸出更詳細的随機森林模型運作過程,預設不輸出;
importance()函數
用于計算模型變量的重要性
importance(x, type=NULL, class="NULL", scale=TRUE, ...)
- x為randomForest對象;
- type可以是1,也可以是2,用于判别計算變量重要性的方法,1表示使用精度平均較少值作為度量标準;2表示采用節點不純度的平均減少值最為度量标準。值越大說明變量的重要性越強;
- scale預設對變量的重要性值進行标準化。
MDSplot()函數
用于實作随機森林的可視化
MDSplot(rf, fac, k=2, palette=NULL, pch=20, ...)
- rf為randomForest對象,需要說明的是,在建構随機森林模型時必須指定計算臨近矩陣,即設定proximity參數為TRUE;
- fac指定随機森林模型中所使用到的因子向量(因變量);
- palette指定所繪圖形中各個類别的顔色;
- pch指定所繪圖形中各個類别形狀;還可以通過R自帶的plot函數繪制随機森林決策樹的數目與模型誤差的折線圖
rfImpute()函數
可為存在缺失值的資料集進行插補(随機森林法),得到最優的樣本拟合值
- rfImpute(x, y, iter=5, ntree=300, ...)
- rfImpute(x, data, ..., subset)
- x為存在缺失值的資料集;
- y為因變量,不可以存在缺失情況;
- iter指定插值過程中疊代次數;
- ntree指定每次疊代生成的随機森林中決策樹數量;
- subset以向量的形式指定樣本集。
應用
- 将資料集分為訓練集和測試集,并檢視資料集基本屬性。資料為R自帶IRIS資料
setwd("E:\\Rwork")
library(randomForest)
data("iris")
index <- sample(nrow(iris),0.75*nrow(iris))
train <- iris[index,]
test <- iris[index,]
- 選取randomforest –mtry節點值,對應誤差最小為2,一般可預設。通常也是2記得。mtry指定節點中用于二叉樹的變量個數,預設情況下資料集變量個數的二次方根(分類模型)或三分之一(預測模型)。
n <- length(names(train))
set.seed(100)
library(tcltk)
pb<-tkProgressBar("進度","已完成 %",0,400)
for (i in 1:(n-1)){
info<- sprintf("已完成 %d%%", round(i*100/length(n)))
setTkProgressBar(pb, i*100/length(n), sprintf("進度 (%s)", info),info)
mtry_fit <- randomForest(Species~.,data = train,mtry = i)
error <- mean(mtry_fit$err.rate)
print(error)
}
[1] 0.04328544
[1] 0.04293262
[1] 0.04588242
[1] 0.04616312
- 選擇最佳mtry
set.seed(100)
ntree_fit<-randomForest(Species~.,data=train,mtry=2,ntree=1000)
plot(ntree_fit)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEzN4MjM1MWM2ETMmNzY4YDM3YDOxYmMxMzYmRTMjBjMfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
- 選擇ntree=200
rf <- randomForest(Species~., data = train ,mtry = 2 ,
ntree = 200,importance= TRUE)
)
rf
Call:
randomForest(formula = Species ~ ., data = train, mtry = 2, ntree = 200, importance = TRUE)
Type of random forest: classification
Number of trees: 200
No. of variables tried at each split: 2
OOB estimate of error rate: 4.44%
Confusion matrix:
setosa versicolor virginica class.error
setosa 32 0 0 0.00000000
versicolor 0 29 2 0.06451613
virginica 0 2 25 0.07407407
- 建立随機森林模型
importance <- importance(rf)
importance
importance
setosa versicolor virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 4.268225 0.2564647 7.822284 6.792504 7.123898
Sepal.Width 2.409402 -0.7655617 2.686758 2.304386 0.750602
Petal.Length 12.652948 15.2819119 17.274815 19.071343 23.149037
Petal.Width 14.672686 18.1435246 18.742883 21.238528 28.105741
varImpPlot(rf)
pred1<-predict(rf,data=train)
Freq1<-table(pred1,train$Species)
sum(diag(Freq1))/sum(Freq1)
[1] 0.9555556
- 重要性排名
- 測試
table(actual=test$Species,predicted=predict(rf,newdata = test,type = "class"))
predicted
actual setosa versicolor virginica
setosa 30 0 0
versicolor 0 30 0
virginica 0 0 30