決策樹的分類模型及對重要變數的選擇及R操作

決策樹的分類模型以及對重要變數的選擇及R操作
何為決策樹,比方說下面這種。

當然這個判斷依據是我瞎畫的,真實情況可能不是這樣,看看就好別較真……總之在這個非常時期,好好聽黨和政府的話,儘可能不要外出就可以了。
儘管內心OS
好了回到正題,上述就展示了一個簡單的決策樹,根據某人是否有發熱症狀或者有無接觸可疑人員等,是否需要被強制隔離。在每個節點處都有一個二元判別項,根據是否滿足條件被劃分到不同的情況中。
決策樹(Decision Tree)是一種機器學習方法,是資料探勘領域中的常用模型。其基本思想是對預測變數進行二元分離,從而構造一棵可用於預測新樣本單元所屬類別的樹。
決策樹即可作為分類器,基於一組預測變數預測一個分類結果,透過識別物件屬性劃分其歸屬;也可作為變數選擇模型來使用,它的層次化結構可以在擬合出的樹結構中揭示出每個被選中的變數的相對重要性。
本篇展示使用R構建決策樹,實現物件分類,以及選擇重要變數的方法。
資料集
威斯康星州乳腺癌資料集,包含699個細胞組織樣本,由空心細針在皮下腫瘤組織中抽得。其中458個(65.5%)為良性樣本,241個(34.5%)為惡性樣本。
#威斯康星州乳腺癌資料集

breast <- read.csv('http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',na.strings = '?', header = FALSE)

names(breast) <- c('ID', 'clumpThickness', 'sizeUniformity', 'shapeUniformity', 'maginalAdhesion',

    'singleEpithelialCellSize', 'bareNuclei', 'blandChromatin', 'normalNucleoli', 'mitosis', 'class')
str(breast)

資料集中共有11個變數,包括:
ID:樣本ID
clumpThickness:腫瘤厚度;
sizeUniformity:細胞大小的均勻性;
shapeUniformity:細胞形狀的均勻性;
maginalAdhesion:邊際附著力;
singleEpithelialCellSize:單個上皮細胞大小;
bareNuclei:裸核,其中有16個樣本中有缺失資料並用“?”表示;
blandChromatin:乏味染色質
normalNucleoli:正常核;
mitosis:有絲分裂;
class:樣本類別,2代表良性樣本(共458個),4代表為惡性樣本(共241個)。
除樣本ID和樣本類別外,其餘9個變數均可視為與判別惡性腫瘤相關的細胞特徵,特徵以得分為1(最接近良性)至10(最接近病變)之間的整數來表示。
任一變數都不能單獨作為判別良性或惡性腫瘤的標準,因此接下來綜合考慮這9種細胞特徵並進行建模,目的是找到一種合適的變數組合用以判斷被檢者是否患有乳腺癌,實現對惡性腫瘤的準確預測。
#將總資料集分為訓練集和測試集

set.seed(123)

select_train <- sample(699, 699*0.7)
breast_train <- breast[select_train, ]

breast_test <- breast[-select_train, ]

首先將總資料集分為兩部分,70%的樣本(行)用作訓練集構建預測模型,30%的樣本(行)作為測試集評估模型效能。
經典決策樹
決策樹模型構建
rpart包的經典決策樹以一個二元輸出變數(良性或惡性腫瘤類別)和一組預測變數(對應9種細胞特徵)為基礎,執行如下過程。
1)綜合衡量各變數,選定一個最佳判別值(分割點)將所有物件分為兩類,使兩類中的純度最大化。對於上述資料而言,則需保證一類中良性樣本儘可能多,另一類中惡性樣本儘可能多;
2)對於獲得的每一個子類別,繼續執行(1);
3)重複(1)(2)過程,直到子類別所含樣本數過低無法繼續細分,或者類間邊間模糊使得無法確定分類的最佳分割點為止,獲得最終集;
4)最終集中的子類別即終端節點(terminal node),可用於判斷物件歸屬:對示例資料集中的任一樣本執行決策樹劃分到終端節點,即可預測其所屬類別。
#rpart 包的決策樹方法

library(rpart)
#生成樹,詳情 ?rpart

#~. 是使用所有變數的簡寫,等同於 clumpThickness+sizeUniformity+…+normalNucleoli+mitosis

#選項 method='class' 是指擬合一個分類模型,

set.seed(123)

tree <- rpart(class ~ ., data = breast_train, method = 'class', parms = list(split = 'information'))

tree
#視覺化決策樹

plot(tree, margin = 0.1)

text(tree, cex = 0.5)
#決策樹劃分細節概要,各個分支結構等

summary(tree)

樹狀圖顯示了決策樹的結構。
在模型公式中使用了全部的9個預測變數,透過擬合模型,7個保留在決策樹中。可知這7個變數是相對而言比較重要的。
在決策樹中,同一變數可以多次出現在不同的節點處,以不同的判別條件存在。

最頂端處的根節點代表的是整個資料集,每個節點位置處,給出了將父節點劃分為兩個子節點時的變數和標準。對於任意的物件,利用分解標準判別各變數的觀測值,引導從根節點出發最終導向某個終端節點,最終實現物件的分類。
例如,根據變數sizeUniformity的值在2.5閾值處,將預測集分為兩個子集合;對於sizeUniformity<2.5的情形,繼續以變數bareNuclei是否小於2.5為標準進一步劃分;以此類推,最終確定樣本來源於良性(2)或惡性(4)腫瘤。
決策樹修剪
有些情況下,所得的樹可能過大,也就是模型過於複雜,導致分類識別困難且會帶來較高錯誤率,此時需要剪枝。
換句話說,並非所有變數都有助於預測模型。就本文的示例而言,可能某些細胞特徵在良性或腫瘤樣本之間相差並不是很明顯,它們對區分樣本的腫瘤類別的貢獻度並不高。這些變數也通常位於樹的末端分支中,可以考慮將它們去除,使用更顯著更重要的細胞特徵就足以預測腫瘤類別,實現樣本分類。
因此基於樹的模型也可作為一種選擇重要變數的方法。
CP表中彙總了不同大小的樹對應的預測誤差,可用於輔助設定最終的樹的大小。
#CP 表,顯示了不同大小的樹對應的預測誤差

#names(tree)

tree$cptable

模型複雜度引數(CP)用於懲罰過大的樹。CP值越小模型越複雜,模型的複雜性與樹模型的大小直接相關,模型越複雜樹枝越多。樹的大小即分支數(nsplit),有n個分支的樹將有n+1個終端節點。
rel error為訓練集中各種樹對應的誤差。要評價樹模型對資料的擬合程度,根節點誤差(響應變數資料的平均的離差平方和)可作為參考。模型的相對誤差定義為模型的平均剩餘離差平方和與根節點誤差的比值。例如一個只分解了一次的模型,它的相對誤差為0.1989,意味著剩餘方差只佔根節點誤差的19.89%,即模型可以解釋響應變數資料中80.11%的總離差平方和。
xerror為基於訓練樣本所得的10折交叉驗證誤差,xstd欄為交叉驗證誤差的標準差,可用於衡量模型預測的準確性。所謂10折,即將原始資料隨機劃分為10個(預設值)子集合的模擬過程來完成:9個子集合用於擬合模型,1個子集合作為檢驗資料集評估模型,重複10次該過程,每次採用不同的檢驗集合。
接下來畫出交叉驗證誤差與複雜度引數的關係圖,對於所有交叉驗證誤差在最小交叉驗證誤差一個標準差範圍內的樹,最小的樹即最優的樹。
#交叉驗證誤差與複雜度引數的關係圖

plotcp(tree)

最優樹的選擇通常考慮兩點。
1)誤差首先會隨樹的分支增加而減少,開始時下降非常明顯,但到了特定範圍處,下降幅度將不再有顯著變化,甚至有所增加。首先需要明確一段顯著的“拐點”區域,例如上圖,大約在5個分支時出現一段“拐點”。
2)也並非一定要選擇具有最小誤差的樹,模型通常會考慮簡約性原則。上圖顯示儘管在分支為7時具有最小誤差,但這種精度在分支4後提升空間甚微。
綜合衡量上述兩點,分支(即終端節點)為4時是最合適的,即3次分割後的樹可作為最優樹來看待。此時的複雜度引數(CP)值約0.0249,可據此剪掉不重要的枝,將樹的大小控制在理想範圍內。
#剪掉不重要的枝

tree_cut <- prune(tree, cp = 0.0249)

tree_cut

summary(tree_cut)
plot(tree_cut, margin = 0.1)

text(tree_cut, cex = 0.5)

#決策樹視覺化的其它方法,例如

library(rpart.plot)
prp(tree_cut, type = 2, extra = 104, fallen.leaves = TRUE, main = 'Decision Tree')

最後也可得到,sizeUniformity(細胞大小的均勻性)、bareNuclei(裸核)、maginalAdhesion(邊際附著力)這3個變數組合是最重要的。
決策樹效能評估
使用構建好的模型,返回來對訓練集樣本進行預測,根據預測結果評估模型精度。
#訓練集自身的預測

pred_train <- predict(tree_cut, breast_train, type = 'class')

tree_accuracy <- table(breast_train$class, pred_train, dnn = c('Actual', 'Predicted'))

tree_accuracy

錯誤分類的樣本約(15+4)/(304+166+15+4)≈3.89%,分類準確度是很可觀的。
然後再使用一開始分離出的測試集樣本(佔原始資料集總樣本的30%),代入使用訓練集構建的模型中,進一步評估模型的預測效能。
#使用測試集樣本進行評估

pred_test <- predict(tree_cut, breast_test, type = 'class')

tree_accuracy <- table(breast_test$class, pred_test, dnn = c('Actual', 'Predicted'))

tree_accuracy

對外源資料預測分類的結果顯示,分類錯誤約率(5+7)/(143+55+5+7)≈5.71%,分類準確度也是很可觀。
考慮到構建的決策樹模型中使用到bareNuclei(裸核)這一變數,而原資料集中有部分樣本缺失了這一部分資料,因此不難推測,若資料集更完整則準確度將會更好。
條件推斷樹
決策樹模型構建
party包的條件推斷樹(conditional inference tree)是經典決策樹的變體,整體結構與經典決策樹類似,但變數和分割點的選取基於顯著性檢驗(由置換檢驗獲得p值),而不再使用純度或同質性一類的度量。
1)計算每個響應變數與預測變數間關係的p值,選擇其中最小p值的變數;
2)嘗試響應變數與選中的預測變數間所有可能的二元分割,並選取最顯著的分割將資料集分為兩個子類別;
3)對每個子類別重複(1)(2)過程,直到所有分割都不顯著或已到達最小節點為止。
接下來使用該包的決策樹方法實現對上文腫瘤示例資料的分類。
#條件推斷樹

library(party)
#生成樹,詳情 ?ctree

#~. 是使用所有變數的簡寫,等同於 clumpThickness+sizeUniformity+…+normalNucleoli+mitosis

set.seed(123)

tree <- ctree(class~., data = breast_train)

tree
#視覺化決策樹

plot(tree, main = 'Conditional Inference Tree')

預設繪製的條件推斷樹圖中,每個節點中的陰影區域代表這個節點對應的惡性腫瘤比例。
決策樹效能評估
使用構建好的模型,分別對訓練集和測試集進行預測,評估模型精度。
#訓練集自身的預測

pred_train <- predict(tree, breast_train, type = 'response')

tree_accuracy <- table(breast_train$class, pred_train, dnn = c('Actual', 'Predicted'))

tree_accuracy

#使用測試集樣本進行評估

pred_test <- predict(tree, breast_test, type = 'response')

tree_accuracy <- table(breast_test$class, pred_test, dnn = c('Actual', 'Predicted'))

tree_accuracy

結果顯示分類準確度是很可觀的。
連結

相關文章