R語言專題,如何使用party包構建決策樹?
下面將在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包構建決策樹?