R語言專題,如何使用party包構建決策樹?

shenmanli發表於2017-09-12
下面將在iris資料集上,演示如何使用party包中的函式ctree來建立一棵決策樹。


iris資料集中的Sepal.Length、Sepal.Width、Petal.Length和Petal.Width,都將用來預測鳶尾花的種類。
party包中的函式ctree用來建立決策樹,函式predict用來對新資料進行預測。


建模之前,將iris資料集劃分為兩個子集:其中70%的資料用於訓練,剩下的30%做測試,為了獲得可重現的結果,隨機種子設定為固定值。


str(iris)
set.seed(1234) 
ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.7, 0.3))
trainData <- iris[ind==1,]
testData <- iris[ind==2,]
下面先載入party包,並建立一棵決策樹,然後檢視預測結果。
函式ctree用於控制決策樹訓練的幾個引數是,minSplit、MinBusket、Maxsurrogate和MaxDepth。


決策樹,使用這幾個引數的預設設定來建立一棵決策樹。


程式碼中,myFormula指定了Species為目標變數,其餘的所有變數為自變數。
library(party)
myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
iris_ctree <- ctree(myFormula, data=trainData)
# check the prediction
table(predict(iris_ctree), trainData$Species)
再輸出規則並繪製已經構建好的決策樹,並檢視
print(iris_ctree)
plot(iris_ctree)


決策樹圖


圖中,每一個葉子節點的條形圖,顯示了一個例項被劃分到某個種類的概率



簡化決策樹


plot(iris_ctree, type="simple")
圖中表現為葉子節點中的“y”。

例如,節點2中的標記“n=40,y=(1,0,0)”,表明該節點包含40個訓練例項,並且所有例項都屬於“setosa”這一種類。




測試決策樹


使用測試資料對構建好的決策樹進行測試。
# predict on test data
testPred <- predict(iris_ctree, newdata = testData)
table(testPred, testData$Species)


決策樹演算法存在的問題


ctree目前版本不能很好地處理缺失值,因此含有缺失值的例項有時會被劃分到左子樹中,有時會被劃分到右子樹中,這是由替代規則決定的。
另外還存在一個問題,如果訓練集中的一個變數在使用函式ctree構建決策樹後被剔除,那麼在對測試集進行預測時也必須包含該變數,否則呼叫函式predict會失敗。
此外,如果測試集與訓練集的分類變數水平值不同,對測試集的預測也會失敗。


解決方法


解決此類問題的方法是,使用訓練集構建了一棵決策樹後,再利用第一棵決策樹中包含的所有變數重新呼叫ctree建立一棵新的決策樹,並根據測試集中分類變數的水平值顯式地設定訓練資料。

相關文章