1. 程式人生 > >R語言專題,如何使用party包構建決策樹?

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

r語言

下面將在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建立一棵新的決策樹,並根據測試集中分類變量的水平值顯式地設置訓練數據。


本文出自 “中科院計算所培訓” 博客,謝絕轉載!

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