1. 程式人生 > >r語言決策樹

r語言決策樹

決策樹演算法
決策樹的建立
建立決策樹的問題可以用遞迴的形式表示:
1、首先選擇一個屬性放置在根節點,為每一個可能的屬性值產生一個分支:將樣本拆分為多個子集,一個子集對應一種屬性值;
2、在每一個分支上遞迴地重複這個過程,選出真正達到這個分支的例項;
3、如果在一個節點上的所有例項擁有相同的類別,停止該部分樹的擴充套件。


問題:對於給定樣本集,如何判斷應該在哪個屬性上進行拆分?每次拆分都存在多種可能,哪個才是較好的選擇呢?
理想情況:在拆分過程中,當葉節點只擁有單一類別時,將不必繼續拆分。
目標時尋找較小的樹,希望遞迴儘早停止。
當前最好的拆分屬性產生的拆分中目標類的分佈應該儘可能地單一,多數類佔優。
如果能測量每一個節點的純度,就可以選擇能產生最純子節點的那個屬性進行拆分;
決策樹演算法通常按照純度的增加來選擇拆分屬性。


純度的概念
純度度量:
當樣本中沒有兩項屬於同一類:0;當樣本中所有項都屬於同一類:1。
最佳拆分可以轉化為選擇拆分屬性使純度度量最大化的優化問題。


純度的度量:
拆分增加了純度,但如何將這種緩增加量化呢,或者如何與其他拆分進行比較呢?
用於評價拆分分類目標變數的純度度量包括:
基尼(Gini,總體發散性) CART
熵(entropy,資訊量)
資訊增益(Gain)
資訊增益率 ID3,C4.5,C5.0
改變拆分準則(splitting criteria)導致樹的外觀互不相同


決策樹的停止:
決策樹是通過遞迴分割建立而成,遞迴分割是一種把資料分割成不同小的部分的迭代過程。
如果有以下情況發生,決策樹將停止分割:
該群資料的每一批資料都已經歸類到同一類別。
該群資料已經沒有辦法再找到新的屬性來進行節點分割。
該群資料已經沒有任何尚未處理的資料。




決策樹剪枝
決策樹學習可能遭遇模型過度擬合的問題,過度擬合是指模型過度訓練,導致模型記住的不是訓練集的一般性,反而是訓練集的區域性特性。
樹的修剪有幾種解決的方法,主要為先剪枝和後剪枝方法。


先剪枝的方法
在先剪枝方法中,通過提前停止樹的構造而對樹“剪枝”。一旦停止,節點成為樹葉。
確定閾值法,測試組修剪法。


後剪枝的方法
後剪枝方法是由“完全生長”的樹剪去分枝。通過刪除節點的分支,剪掉葉節點。
案例數修剪,成本複雜性修剪法。


決策樹1:
install.packages("rpart")
library(rpart)
trIn <- c(sample(1:50,40),     #訓練集序號
          sample(51:100,40),
          sample(101:150,40))
traiD <- iris[trIn,]   #訓練集樣本
textD <- iris[-trIn,]  #測試集樣本
#fit = rpart(Species~., traid, method='class')
fit <- rpart(Species~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,
             data=traiD,method="class")


re <- predict(fit,textD)
re <- cbind(re,rep(1,nrow(re)))
tab <- colnames(re)
for(i in 1:nrow(re)){
  re[i,4] <- tab[which.max(re[i,1:3])]
}
result <- re[,4]
table(textD[,5],result)






決策樹2:
library(rpart)
par(family='STXihei')#圖形設定,以免出現中文亂碼
#fit <- rpart(Species~Sepal.Length + Sepal.Width + Petal.Length
#                   data = iris,method="class")
fit = rpart(Species~.,iris,method = 'class')
#method:根據樹末端因變數的資料型別選擇分割方法
par(mfrow=c(1,2))
plot(fit,uniform=T,branch=0,margin=0.2,main='Classificat')
text(fit,use.n=T,fancy=F,col="blue")
#這種會更漂亮一些
install.packages("rpart.plot")
library(rpart.plot)
rpart.plot(fit,branch=1,branch.type=2,type=1,extra=102,
           shadow.col="gray",box.col="green",
           border.col="blue",split.col="red",
           split.cex=1.2,main="Kyphosis決策樹")


printcp(fit)


par(mfrow=c(1,1))
#第二種方式
install.packages("rattle")
install.packages("RColorBrewer")
library(rpart)
library(rattle)
library(rpart.plot)
library(RColorBrewer)
model <- rpart(Species ~ Sepal.Length + 
                 Sepal.Width + Petal.Length +
                 Petal.Width,data = iris, method = "class")
fancyRpartPlot(model)