R語言-分類之隨機森林篇
隨機森林演算法涉及對樣本單元和變數進行抽樣,從而生成大量決策樹。
對於每個樣本單元,所有決策樹依次對其進行分類,所有決策樹預測類別中的眾數類別即為隨機森林所預測的這一樣本單元的類別。
假設訓練集中共有N個樣本單元,M個變數,則隨機森林演算法如下:
(1)從訓練集中隨機有放回地抽取N個樣本單元,生成大量決策樹;
(2)在每一個節點隨機抽取m < M個變數,將其作為分割該節點的候選變數。每一個節點處的變數數應一致;
(3)完整生成所有決策樹,無需剪枝(最小節點為1);
(4)終端節點的所屬類別由節點對應的眾數類別決定;
(5)對於新的觀測點,用所有的樹對其分類,其類別由多數原則生成。
下面直接上程式碼,資料還是威斯康乳腺癌資料集= =。。。
library
(
randomForest
)
set
。
seed
(
666
)
ez
。
forest
<-
randomForest
(
class
~。
,
data
=
df
。
train
,
na
。
action
=
na
。
roughfix
,
#變數缺失值替換成對應列的中位數
importance
=
TRUE
)
#生成森林
ez
。
forest
# 結果為
Call
:
randomForest
(
formula
=
class
~ 。,
data
=
df
。
train
,
importance
=
TRUE
,
na
。
action
=
na
。
roughfix
)
Type
of
random
forest
:
classification
Number
of
trees
:
500
No
。
of
variables
tried
at
each
split
:
3
(
每次拆分時嘗試的變數數量
:
3
,
總變數數為9
)
OOB
estimate
of
error
rate
:
2。25
%
Confusion
matrix
:
benign
malignant
class
。
error
benign
310
9
0。02821317
malignant
2
168
0。01176471
randomForest包中的randomForest()函式可用於生成隨機森林,預設生成500棵決策樹,並且預設在每個節點處抽取sqrt(M)個變數,最小節點為1
importance(ez。forest,type=2) #變數重要性
#結果為
MeanDecreaseGini
clumpThickness 11。628535
sizeUniformity 61。818745
shapeUniformity 49。774635
maginalAdhesion 5。088972
singleEptheliacellsize 24。022331
bareNuclei 28。984569
blandChromatin 19。140633
normalNucleoli 19。388180
mitosis 1。574714
type=2引數得到的某個變數的相對重要性就是分割該變數時節點不純度的下降總量(所有決策樹)取平均(/決策樹的數量)。
從結果可看出,sizeUniformity是相對最重要的變數,mitosis是相對最不重要的變數。
最後再用隨機森林對驗證集進行分類,看看其準確率:
importance(ez。forest,type=2) #變數重要性
forest。pred <- predict(ez。forest,df。validate)
forest。perf <- table(df。validate$class,forest。pred,
dnn = c(‘Actual’,‘Predicted’))
forest。perf
#結果為:
Predicted
Actual benign malignant
benign 132 4
malignant 3 67
本例的隨機森林是用randomForest包的randomForest()函式基於傳統決策樹生成的,也可以用party包中的cforest()函式來基於條件推斷樹生成隨機森林。
缺點:分類方法(即隨機森林中的所有決策樹)較難理解和表達。
優點:分類準確率更高。(與單棵決策樹相比更明顯)