天天看點

R 內建算法③ 随機森林

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)
           
R 內建算法③ 随機森林
  • 選擇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
           
R 內建算法③ 随機森林
  • 重要性排名
  • 測試
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
           

繼續閱讀