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

決策樹模型(R語言)

R語言中最常用於實現決策樹的有兩個包,分別是rpart包和party包,其區別如下:

rpart包的處理方式:首先對所有自變數和所有分割點進行評估,最佳的選擇是使分割後組內的資料更為“一致”(pure)。這裡的“一致”是指組內資料的因變數取值變異較小。rpart包對這種“一致”性的預設度量是Gini值。確定停止劃分的引數有很多(參見rpart.control),確定這些引數是非常重要而微妙的,因為劃分越細,模型越複雜,越容易出現過度擬合的情況,而劃分過粗,又會出現擬合不足。處理這個問題通常是使用“剪枝”(prune)方法。即先建立一個劃分較細較為複雜的樹模型,再根據交叉檢驗(Cross-Validation)的方法來估計不同“剪枝”條件下,各模型的誤差,選擇誤差最小的樹模型。

party包的處理方式:它的背景理論是“條件推斷決策樹”(conditional inference trees):它根據統計檢驗來確定自變數和分割點的選擇。即先假設所有自變數與因變數均獨立。再對它們進行卡方獨立檢驗,檢驗P值小於閥值的自變數加入模型,相關性最強的自變數作為第一次分割的自變數。自變數選擇好後,用置換檢驗來選擇分割點。用party包建立的決策樹不需要剪枝,因為閥值就決定了模型的複雜程度。所以如何決定閥值引數是非常重要的(參見ctree_control)。較為流行的做法是取不同的引數值進行交叉檢驗,選擇誤差最小的模型引數。

R語言中有許多包都要自己安裝:

install.packages("包名”)

library(包名) #可以檢測是否安裝成功並且呼叫

下面以資料集kyphosis為例進行決策樹建模,kyphosis資料集是rpart自帶的資料集,kyphosis是描述兒童糾正脊柱手術資料集,一共有4個變數。根據變數的英文名稱,可以瞭解到這是以駝背、年齡、編號、開始時間為變數的資料集,一共有81行資料。

先來了解rpart包中的函式rpart:

rpart(formula, data, weights, subset, na.action = na.rpart, method, model = FALSE, x = FALSE, y = TRUE, parms, control, cost, ...)

formula 模型公式,類似迴歸中y~x1+x2+x3
data 資料框形式的資料集
weights, 選擇權重
subset 選擇資料集中的指定行
na.action 缺失值處理方式,預設刪除y丟失的所有觀察值,而那些缺少一個或多個自變數的觀測值則保留
method 預設自動選擇最佳的方法。主要方法有: 連續性"anova", 泊松型"poisson", 類別"class"和 指數型"exp",程式會根據因變數的型別自動選擇方法,但一般情況下最好還是指明本引數
model 是否在結果中保留模型資料框
x 結果中是否顯示自變數
y 結果中是否顯示因變數
parms 用來設定三個引數:先驗概率 (component prior),損失矩陣 (component loss) 和分裂指數 (component split)
control

對樹進行設定的一些引數,包括

最小分支節點數(minsplit);葉節點的最少觀測數(minbucket);樹的深度(maxdepth);交叉驗證的次數(xval);

複雜度引數(cp),用來修剪樹的,當複雜度超過一定程度後,隨著複雜度的提高,測試集的分類精度會降低,因此建立的決策樹不宜太複雜,需進行剪枝。該剪枝演算法依賴於cp,cp隨樹複雜度的增加而減小,當增加一個節點引起的分類精確度變化量小於樹複雜度變化的cp倍時,則需剪去該節點

cost 成本矩陣

檢視資料集某些行:

data()                       #列出已載入的包中的資料集

head(kyphosis)         # 前6行 head(kyphosis,n=5)  # 前5行 kyphosis[1:3,]            # 前3行 tail(kyphosis)             # 後6行

library(rpart)
library(rpart.plot)
library(rattle)
#資料
data(kyphosis)
head(kyphosis)
#引數
control <- rpart.control(minsplit=10,minbucket=5,xval=10,cp=0.1) 
#最小分支數,葉節點最小觀測數,交叉驗證數,複雜度引數(complexity parameter)
#決策樹模型
model<- rpart(Kyphosis ~ Age + Number + Start, data = kyphosis,
              method="class",control=control,  
              parms = list(prior = c(0.6,0.4), split = "information"))
#檢視模型結果
summary(model) #檢視模型的詳細過程,見圖1
asRules(model) #asRules(model, compact=FALSE, ... )  列出對應規則,是否緊湊型輸出,見圖2
#給出2種繪製決策樹圖,可以從圖中看到每一類的觀測數及佔總數的比例
rpartplot(model)         #見圖3
fancyRpartPlot(model)    #見圖4,更美觀

model$cptable    #檢視交叉驗證結果,見圖5
plotcp(model)    #檢視交叉驗證結果圖,見圖6
grid()           #加網格線,在這裡不執行

#根據交叉驗證結果,找出估計誤差最小時的cp值,並重新建立模型。
xerr <-model$cptable[,"xerror"]
minxerr <- which.min(xerr)
mincp <-model$cptable[minxerr, "CP"] #選擇交叉驗證的估計誤差最小時對應的cp
#新模型
model.prune <- prune(model,cp=mincp) 
fancyRpartPlot(model.prune)   #見圖7

圖1:#檢視模型的詳細過程,只顯示部分

圖2:列出對應規則

圖3:作出決策樹圖

圖4:更美觀的決策樹圖

圖5:交叉驗證結果,可看到 交叉驗證的估計誤差(“xerror”),以及標準誤差(“xstd”),平均相對誤差=xerror±xstd 

圖6:交叉驗證結果圖

圖7:剪枝後的新模型(沒有變化啊??)