r語言決策樹

2021-08-03 18:32:16 字數 2910 閱讀 9920

決策樹演算法

決策樹的建立

建立決策樹的問題可以用遞迴的形式表示:

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))

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)

決策樹與R語言 RPART

關於決策樹理論方面的介紹,李航的 統計機器學習 第五章有很好的講解。傳統的id3和c4.5一般用於分類問題,其中id3使用資訊增益進行特徵選擇,即遞迴的選擇分類能力最強的特徵對資料進行分割,c4.5唯一不同的是使用資訊增益比進行特徵選擇。特徵a對訓練資料d的資訊增益g d,a 集合d的經驗熵h d ...

R語言 決策樹 party包

1 首先解釋下熵和吉尼係數在決策樹的功用 決策樹學習的關鍵是如何選擇最優的劃分屬性。通常,隨著劃分過程的不斷進行,我們希望決策樹的內部分支節點所包含的樣本盡可能屬於同一類別,即節點的 純度 越來越高。熵 是衡量樣本資料集純度最常用的一種指標。熵值越小,則樣本的純度越高,或者說樣本的雜亂程度越小。吉尼...

R語言 決策樹及其實現

一顆決策樹包含乙個根結點 若干個內部結點和若干個葉結點 葉結點對應於決策結果,其他每個結點則對應於乙個屬性測試 每個結點包含的樣本集合根據屬性測試的結果被劃分到子結點中 根結點包含樣本全集。從根結點到葉結點的路徑對應於了乙個判定測試序列。目的 為了產生一顆泛化能力強,即處理未見示例能力強的據決策樹。...