分類分析--決策樹(經典決策樹、條件推斷樹)


分類分析--決策樹

決策樹是數據挖掘領域中的常用模型。其基本思想是對預測變量進行二元分離,從而構造一棵可用於預測新樣本單元所屬類別的樹。兩類決策樹:經典樹和條件推斷樹。

 1  經典決策樹

經典決策樹以一個二元輸出變量(對應威斯康星州乳腺癌數據集中的良性/惡性)和一組預測變量(對應九個細胞特征)為基礎。具體算法如下:

(1) 選定一個最佳預測變量將全部樣本單元分為兩類,實現兩類中的純度最大化(即一類中良性樣本單元盡可能多,另一類中惡性樣本單元盡可能多)。如果預測變量連續,則選定一個分割點進行分類,使得兩類純度最大化;如果預測變量為分類變量(本例中未體現),則對各類別進行合並再分類。

(2) 對每一個子類別繼續執行步驟(1)

(3) 重復步驟(1)~(2),直到子類別中所含的樣本單元數過少,或者沒有分類法能將不純度下降到一個給定閾值以下。最終集中的子類別即終端節點(terminal node)。根據每一個終端節點中樣本單元的類別數眾數來判別這一終端節點的所屬類別。

(4) 對任一樣本單元執行決策樹,得到其終端節點,即可根據步驟3得到模型預測的所屬類別。

上述算法通常會得到一棵過大的樹,從而出現過擬合現象。結果就是,對於訓練集外單元的分類性能較差。為解決這一問題,可采用10折交叉驗證法選擇預測誤差最小的樹。這一剪

枝后的樹即可用於預測。

R中的rpart包支持rpart()函數構造決策樹,prune()函數對決策樹進行剪枝。下面給出判別細胞為良性或惡性的決策樹算法實現。

1)使用rpart()函數創建分類決策樹:

#生成樹:rpart()函數可用於生成決策樹

library(rpart)

set.seed(1234)

dtree <- rpart(class ~ ., data=df.train, method="class",

                 parms=list(split="information"))

#rpart() 返回的cptable值中包括不同大小的樹對應的預測誤差,因此可用於輔助設定最終的樹的大小

dtree$cptable

 

結果分析: 復雜度參數(cp)用於懲罰過大的樹。樹的大小即分支數(nsplit),有n個分支的樹將有n+1個終端節點;rel error欄即訓練集中各種樹對應的誤差;交叉驗證誤差(xerror)即基於訓練樣本所得的10折交叉驗證誤差;xstd欄為交叉驗證誤差的標准差。

#剪枝:print(dtree)summary(dtree)可用於觀測所得模型,此時所得的樹可能過大,需要剪枝。

plotcp(dtree)   

 

結果分析:借助plotcp()函數可畫出交叉驗證誤差與復雜度參數的關系圖(如圖所示)。對於所有交叉驗證誤差在最小交叉驗證誤差一個標准差范圍內的樹,最小的樹即最優的樹。虛線是基於一個標准差准則得到的上限(0.12+1×0.0264=0.15)。從圖像來看,應選擇虛線下最左側cp值對應的樹。

本例中,最小的交叉驗證誤差xerror0.12,標准誤差xstd0.0264,則最優的樹為交叉驗證誤差在0.12±0.02640.0940.15)之間的樹。由代碼cptable表可知,四個終端節點(即三次分割)的樹滿足要求(交叉驗證誤差為0.1588235);根據圖也可以選得最優樹,即三次分割(四個節點)對應的樹。

dtree.pruned <- prune(dtree, cp=.0176)   

#在完整樹的基礎上,prune()函數根據復雜度參數剪掉最不重要的枝,從而將樹的大小控制在理想范圍內,從代碼的cptable中可以看到,三次分割對應的復雜度參數為0.0176,從而prune(dtree, cp=0.0176)可得到一個理想大小的樹。

install.packages("partykit")

library(partykit)

plot(as.party(dtree.pruned))      #畫出生成的決策樹

結果分析:每個節點中的陰影區域代表這個節點對應的惡性腫瘤比例。

library(rpart.plot)

prp(dtree.pruned, type = 2, extra = 104,

      fallen.leaves = TRUE, main="Decision Tree")

 

結果分析:rpart.plot包中的prp()函數可用於畫出最終的決策樹,如圖所示。prp()函數中有許多可供選擇的參數(詳見?prp),如type=2可畫出每個節點下分割的標簽,extra=104可畫出每一類的概率以及每個節點處的樣本占比,fallen.leaves=TRUE可在圖的底端顯示終端節點。對觀測點分類時,從樹的頂端開始,若滿足條件則從左枝往下,否則從右枝往下,重復這個過程直到碰到一個終端節點為止。該終端節點即為這一觀測點的所屬類別。

#對訓練集外樣本單元分類

dtree.pred <- predict(dtree.pruned, df.validate, type="class")

#predict()函數用來對驗證集中的觀測點分類

dtree.perf <- table(df.validate$class, dtree.pred, dnn=c("Actual", "Predicted"))

#生成實際類別與預測類別的交叉表

dtree.perf

 

結果分析:整體來看,驗證集中的准確率達到了(129+69/210=94%

2  條件推斷樹

在介紹隨機森林之前,我們先介紹傳統決策樹的一種重要變體,即條件推斷樹(conditional inference tree)。條件推斷樹與傳統決策樹類似,但變量和分割的選取是基於顯著性檢驗的,而不是純凈度或同質性一類的度量。顯著性檢驗是置換檢驗。條件推斷樹的算法如下:

(1) 對輸出變量與每個預測變量間的關系計算p值。

(2) 選取p值最小的變量。

(3) 在因變量與被選中的變量間嘗試所有可能的二元分割(通過排列檢驗),並選取最顯著的分割。

(4) 將數據集分成兩群,並對每個子群重復上述步驟。

(5) 重復直至所有分割都不顯著或已到達最小節點為止。

條件推斷樹可由party包中的ctree()函數獲得。如下代碼是對乳腺癌數據生成條件推斷樹

1)使用ctree()函數創建條件推斷樹

library(party)

fit.ctree <- ctree(class~., data=df.train)     #ctree()函數可用於條件推斷樹

plot(fit.ctree, main="Conditional Inference Tree")      #畫出生成的條件推斷樹

 

結果分析:每個節點中的陰影區域代表這個節點對應的惡性腫瘤比例。

ctree.pred <- predict(fit.ctree, df.validate, type="response")

#predict()函數用來對驗證集中的觀測點分類

ctree.perf <- table(df.validate$class, ctree.pred, dnn=c("Actual", "Predicted"))

#生成實際類別與預測類別的交叉表

ctree.perf

 

結果分析:整體來看,驗證集中的准確率達到了(131+67/210=94%


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM