1. 程式人生 > >R語言——決策樹模型

R語言——決策樹模型

        決策樹(Tree Nodels)是一種建立樹狀模型的方法,它使用‘基尼不純度’(Gini Impurity)或資訊增益(Information Gain)等標準對節點進行遞迴分割,以建立樹狀模型。決策樹看起來像是以樹狀形式排列的一系列的if-else語句,易於理解,執行速度快。並且,它能夠很好地表現多個特徵之間的相互作用,適用於多種資料型別。(樹狀模型中,隨機森林效能表現卓越)

        主要用到的包:rpart、party、randomForest

決策樹模型   

         決策樹演算法中,會對資料特徵不斷提問,然後根據每次回答逐步對資料進行分類。

        節點(Node)的分類:節點分為根節點(Root Node)與葉節點(Leaf Node)。其中根節點位於決策樹最頂部,它是分類的起始點,位於最底端且沒有子節點的節點成為葉節點。

        在決策樹中,對各節點提問題,並根據回答對節點進行分叉,從而實現分類資料的目的。‘不純度’(impurity)用作評估資料分離程度的標準,將一個節點資料劃分為2個子節點時,最好的提問能夠使子節點的不純度降至最低。

        節點中含有的分類越多,不純度越高。反之,只有一個分類的時候,不純度最低。

分類與迴歸樹

        用於建立決策樹的包有很多,此處使用rpart包,它實現了比較有名的分類與迴歸樹(Classification and Regression Trees,CART)

        以下示例中,使用rpart()函式為鳶尾花資料建立決策樹:

library(rpart)
m<-rpart(Species~.,data=iris)

檢視m

結果中的n=150代表有150個數據。結果底部顯示的就是決策樹,縮排表示分支,*表示葉節點,loss表示誤差數量。

從中可以得到結果:

鳶尾花資料中共有三個品種,各節點後括號裡的資料代表了各個品種的比例

1節點為根節點

2節點的分類標準為Petal.Length<2.45,數量50,全是setosa品種

3節點的分類標準為Petal.Length>=2.45,數量100

6和 7節點都是由3節點劃分的,標準為Petal.Width與1.75的關係

這種結果看起來不夠直觀,可以用plot()函式繪製決策樹:

plot(m,compress=T,margin=0.2)#compress引數指定以更稠密的方式繪製決策樹
text(m,cex=1.5)

這個圖雖然可以很容易地知道決策樹的含義,但沒有具體的數量關係

利用rpart.plot包中的prp()函式可以很好地解決這個問題:

library(rpart.plot)
prp(m,type=4,extra=2,digits=3)#此處type引數為0~5

從圖中可以很清楚地看到分類和數量關係,其中品種下方的分數A/B表示B個數據中有A個屬於該類(即上述loss誤差)。

使用predict()函式可以用建立好的決策樹模型對新資料進行預測。

條件推斷決策樹

        條件推斷決策樹(Conditional Inference Tree)用於解決CART(上述rpart實現的決策樹演算法)等決策樹的兩種問題:第一種是不判斷統計的顯著性,而在分割節點時產生的過度擬合問題;第二種是可分割為多種值得變數比其他變數更受偏愛的問題。

        條件推斷決策樹中,會根據條件分佈(Conditional Distribution)測量變數與響應值(分類)之間的相關關係,選擇分割節點中要使用的變數。此外,條件推斷決策樹中也會充分考慮決策樹中重複分割節點時發生的多重假設檢驗(Multiple Testing)問題,並在適當的時間點停止節點分割。(多重比較問題(Multiple Testing Problem)指的是向多個物件同時統計推論時,置信區間不包含真值或錯誤否定零假設,這種現象發生的可能性變得很大。比如,為了判斷是否分割節點,執行擁有95%置信度的假設檢驗。使用該檢驗分割3次節點時,置信度為95%*95%*95%=85.7%。因此,進行多重比較時,若不作適當修正,則置信度就會降低,置信區間與假設檢驗就不正確。)

        使用rpart因過度擬合而無法得到很好的效能時,使用條件推斷決策樹能夠得到明顯的改善。此外,與rpart相比,條件推斷決策樹提供了更易理解的圖形功能。

下面的例子對鳶尾花資料應用ctree()函式,建立Species預測模型:

install.packages('party')
library(party)
m<-ctree(Species~.,data=iris)

檢視m

結果中顯示(第一行):這是一個有四個葉節點(terminal nodes)的條件推斷決策樹

1節點根據Petal.Length是否大於1.9分類

2節點是Petal.Length<=1.9的分類

3節點是Petal.Length>1.9的分類

在3節點下又根據Petal.Width是否大於1.7進行分類

使用plot()函式繪製決策樹模型:

plot(m)

生成的影象視覺化效果比較好,可以看到四個葉節點,但是這四個葉節點各有三個分類,圖上只顯示setosa一個,另外兩個可以手動檢視:

levels(iris$Species)

[1] "setosa"     "versicolor" "virginica" 

隨機森林

        隨機森林是一種使用整合學習(Ensemble Learning)技術的模型。整合學習中,先從給定資料學習多個模型,然後在預測時綜合使用多個模型的預測結果,從而獲得更高的準確度。

        隨機森林使用兩種方法建立多種決策樹。第一種方法是在建立決策樹時採用‘放回抽樣’抽取一部分資料,然後只根據這些資料建立決策樹,即在建立決策樹時只使用一部分資料;第二種方法是指從節點資料中確定分割位元組點的標準時,並不針對全體變數,而僅以部分變數為物件尋找分叉標準。

        預測新資料時,對多個決策樹產生的預測結果採用投票(voting)方式決定最終結果。(比如,5個決策樹中,預測為Y的有3個,預測為N的有2個,那麼最終結果就確定為Y。)

        隨機森林的效能通常都很優秀,它使用多個而非一個決策樹進行預測,所以避免了過度擬合問題。

  • 使用隨機森林建模

        仍使用鳶尾花資料:

library(randomForest)
m<-randomForest(Species~.,data=iris)

檢視m

如前所述,隨機森林由多個決策樹實現(建立500個決策樹),每個決策樹只使用一部分資料。輸出隨機森林模型時,使用未在模型訓練中用到的資料而得到錯誤推斷值,並顯示到OOB estimate of error rate專案。鳶尾花模型中,OOB錯誤為4%,versicolor被預測為virginica的情形有3個,virginica被預測為versicolor的情形有三個,而setosa則沒有錯誤出現。

可以使用predict()函式對其他資料進行預測

  • 通過直接指定X與Y快速建模

        隨機森林建立500個決策樹,建模時間會大大增加,資料量也會大幅增長。

        為了避免這種情況,可以使用快速建模方法。

        快速建模的方法有很多,其中一種是不使用公式,直接指定自變數X和因變數Y進行建模。雖然使用公式比較方便,但它比直接指定(X,Y)佔用更多的記憶體,執行速度也比較慢。

        randomForest()等幾個建模函式支援通過直接指定變數的方式(不使用公式)進行建模,但並非所有建模函式都支援這種方式。

        以iris為例,直接將Species指定為Y,將其他變數指定為X:

m<-randomForest(iris[,1:4],iris[,5])
  • 評估變數的重要性

        randomForest()函式的變數重要性由變數對準確度與階段不純度改善的貢獻程度進行衡量。這樣計算得到的變數重要性可以用於選擇要在其他模型(比如線性迴歸)中使用的變數。

        呼叫randomForest()函式建模時,必須設定importance=T,才能獲得變數的重要性。然後使用importance()、varImpPlot()函式顯示結果。

        以iris資料集為例:

m<-randomForest(Species~.,data=iris,importance=T)
importance(m)

結果中的MeanDecreaseAccuracy和MeanDecreaseGini分別代表準確度和節點不純度的改善影響。由於要根據多個決策樹評估變數對準確度與不純度改善的貢獻率,所以使用了平均值(Mean)。        

使用varImpPlot()函式繪製視覺化圖形:

varImpPlot(m)