決策樹是數據挖掘領域中的經常使用模型,其基本思想是對預測變量進行二元分離,從而構造一顆可用於預測新樣本單元所屬類別的樹node
針對乳腺癌數據集中的良性/惡性,和一組預測變量對應9個細胞特徵爲基礎算法
(1) 選定一個最佳預測變量將所有樣本單元分爲兩類,實現兩類中的純度最大化(即一類中良性樣本單元儘量多,另外一類中惡性樣本儘量的多)tcp
a、若是預測變量連續,則選定一個分割點進行分類,使得兩類純度最大化;函數
b、若是預測變量爲分類變量,則對各種別進行合併再分類性能
(2)對每個子類分別繼續執行比步驟(1)spa
(3)重複步驟(1)~(2),直到子類別中所含的樣本單元數過少,或者沒有分類法能將不純度下線到一個給定閾值如下,最終集中的子類別即終端節點(terminal node)。根據每個終端節點中樣本單元數衆數來判別這一終端節點的屬性類別code
(4)對任同樣本單元執行決策樹,獲得其終端節點,便可根據步驟3獲得模型預測的所屬類別,orm
不過,上述算法一般會獲得一棵過大的樹,從而出現過分 擬合現象,致使對於訓練集外單元的分類性能較差,可用 10折交叉驗證法,這一 剪枝後的樹用於預測。ci
R中的 repart() 函數構造決策樹,prune() 函數對決策樹進行減枝terminal
#使用rpart()函數建立分類決策樹 > library(rpart) > set.seed(1234) > dtree <- rpart(class ~.,data = df.train,method="class",parms = list(split="information")) #生成樹
rpart()返回的cptable值中包括不一樣大小的樹對應的預測偏差,所以可用於輔助設定最終的樹的大小
a、複雜度參數(cp)用於懲罰過大的樹
b、樹的大小即分支數(nsplit),有 n 個分支的樹將有 n+1 個終端節點
c、rel eeror欄中即各類樹對應的偏差
d、xerror即基於訓練樣本所得的10折交叉驗證偏差
e、xstd欄爲交叉驗證偏差的標準差
> dtree$cptable CP nsplit rel error xerror xstd 1 0.800000 0 1.00000 1.00000 0.06484605 2 0.046875 1 0.20000 0.30625 0.04150018 3 0.012500 3 0.10625 0.20625 0.03467089 4 0.010000 4 0.09375 0.18125 0.03264401
plotcp()函數可畫出交叉驗證偏差與複雜度參數的關係圖,對於全部交叉驗證偏差在最小交叉驗證偏差一個標準差範圍內的樹,最小的樹即最優的樹
本例子中 最小交叉偏差(xerror)爲0.18125,它標準差(xstd)爲0.03264401,因此最優的樹在 0.18 +- 0.0326 (0.15和0.21)之間的樹
> plotcp(dtree) #繪製交叉驗證偏差與複雜度參數的關係圖,藉助關係圖能夠肯定最優的樹
圖1 複雜度參數
複雜度參數與交叉驗證偏差,虛線是基於一個標準差準則獲得上限(0.18+1*0.0326=0.21),從圖像來卡,應選擇虛線最左側 cp 值對應的樹
由 cptable 的結果可知,四個終端節點(即三次分割)的樹知足要求(交叉驗證偏差爲0.20625),根據圖能夠選的最優樹,即三次分隔(四個節點)對應的樹
prune()函數根據複雜度參數剪掉最不重要的枝,從而將樹的大小控制在理想範圍內,從上述cptale中獲得,三次分割對應的複雜度參數爲0.0125,因此剪枝獲得一個理想大小的樹
prune(dtree,cp = 0.0125)
prp()z中有不少的參數(詳見?prp),
type=2:畫出每一個節點下分隔的標籤
extra = 104:畫出每一類的機率以及每一個節點處的樣本佔比
fallen.leaves:可在圖的底端顯示終端節點
對觀測點分類時,從樹的頂端開始,若知足條件則從左枝往下,不然從右枝往下,重複這個過程知道碰到一個終端節點爲止,該終端節點即爲這一觀測點的所屬類別
> dtree.pruned <- prune(dtree, cp=.0125) > library(rpart.plot) #導入rpart.polt包中的prp()函數 > prp(dtree.pruned, type = 2, extra = 104, + fallen.leaves = TRUE, main="Decision Tree")
圖2 用剪枝後的傳統決策樹預測癌症狀態,從樹的頂端開始若是條件成立則從左枝往下,否者從右枝往下,當觀測點到達終端節點時,分類結束。每個節點處都有對應類別的機率以及樣本單元的佔比
predict()函數用來驗證集中的觀測點分類
> dtree.pred <- predict(dtree.pruned, df.validate, type="class") > dtree.perf <- table(df.validate$class, dtree.pred, #實際類別與預測類別的交叉表 + dnn=c("Actual", "Predicted")) > dtree.perf Predicted Actual benign malignant benign 122 7 malignant 2 79
從總體來看,驗證集中的準確率達到96%,與邏輯迴歸不一樣的是,驗證集中的210個樣本單元均可由最終樹來分類。
值得注意的是,對於水平數不少或者缺失值不少的預測變量決策樹可能會有偏