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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章