隨機森林演算法涉及對樣本單元和變數進行抽樣,從而生成大量決策樹。

對於每個樣本單元,所有決策樹依次對其進行分類,所有決策樹預測類別中的眾數類別即為隨機森林所預測的這一樣本單元的類別。

假設訓練集中共有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()函式來基於條件推斷樹生成隨機森林。

缺點:分類方法(即隨機森林中的所有決策樹)較難理解和表達。

優點:分類準確率更高。(與單棵決策樹相比更明顯)