決策樹與隨機森林算法


決策樹

決策樹模型是一種樹形結構,基於特征對實例進行分類或回歸的過程。即根據某個特征把數據分划分到若干個子區域(子樹),再對子區域遞歸划分,直到滿足某個條件則停止划分並作為葉子節點,不滿足條件則繼續遞歸划分。

一個簡單的決策樹分類模型:紅色框出的是特征。

 

這里寫圖片描述

 

決策樹模型學習過程通常包3個步驟:特征選擇、決策樹的生成、決策樹的修剪

1.特征選擇

選擇特征順序的不同將會產生不同決策樹,選擇好的特征能使得各個子集下標簽更純凈。度量特征對產生子集的好壞有若干方法,如誤差率,信息增益、信息增益比和基尼指數等。

1.1誤差率

訓練數據D被特征A分在若干子結點后,選擇子節點中出現數目最多的類標簽作為此結點的返回值,記為yc^。則誤差率定義為1|D|∑i=1|Dc|I{yi≠yc}

1.2信息增益

熵與條件熵:熵表示隨機變量不確定性的度量。設計隨機變量X為有限離散隨機變量,且pi=P(X=xi)。熵的定義為H(X)=?∑ni=1pilog(pi)。熵越大,隨機變量的不確定性就越大,當X取某個離散值時概率為1時,則對應的熵H(X)為0,表示隨機變量沒有不確定性。條件熵:表示已知隨機變量X的條件下隨機變量Y的不確定性,定義H(Y|X)=∑ni=1piH(Y|X=xi),其中pi=P(X=xi)。這里X表示某個特征,即表示根據某個特征划分后,數據Y的熵。如果某個特征有更強的分類能力,則條件熵H(Y|X)越小,表示不確定性越小。

信息增益:特征A對訓練數據集D的信息增益定義為g(D,A)=H(D)-H(D|A).即有特征值A使得數據D的不確定性下降的程度。所以信息增益越大,表明特征具有更強的分類能力。

1.3信息增益比

信息增益比也是度量特征分類能力的方法。定義訓練數據D關於特征A的值的熵HA(D)=?∑ni=1|Di||D|log2(|Di||D|),|D|表示訓練數據的總數,|Di|表示訓練數據D中特征A取第i個值的總數目。信息增益比越大,表明特征分類能力越強。

gR(D,A)=g(D,A)HA(D)

1.4基尼指數

假設隨機變量X可以取K的離散值,p(X=k)=pk則X的基尼指數定義為:Gini(X)=∑Kk=pk(1-pk)=1-∑Kk=1-pk2.對於給定的樣本集合D,其基尼指數為Gini(D)=1?∑Kk=1(|Ck||D|)2,|Ck|是D中屬於第k類的樣本個數,K是類的個數。基尼指數表示樣本集合的不確定性程度,所以基尼指數越小,對應的特征分類能力越強

下圖表示一個二分類的情況下,度量樣本集合的不確定性程度幾種方法。熵(Entropy),基尼指數(Gini),誤差率的關系(Error rate).為了方便比較熵被縮小一半。

 

這里寫圖片描述

2.決策樹的生成

ID3與C4.5都是決策樹的經典分類決策樹算法。唯一不同的是ID3算法采用信息增益作為特征選擇准則,而C4.5采用的是信息增益比的方法。下面介紹ID3決定樹生成算法的過程,C4.5類似。

ID3算法

從根節點開始,在數據集D上計算所有可能的特征A分別計算信息增益,選擇信息增益最大的特征作為分類條件,對該特征不同的取值分別建立子集作為子節點,最對子集遞歸地調用以上方法。直到沒有特征可以選擇或者信息增益很小為止。

下面的代碼來自《機器學習實戰》

[java]  view plain  copy
 
  1. <span style="background-color:rgb(255,255,255)"><code class="hljs python">def createTree(dataSet, labels) :  
  2.      classList = [example[-1] for example in dataSet]    
  3.      if classList.count(classList[0] ) == len(classList) :#數據集全部屬於同一個類別  
  4.           return classList[0] #返回這個類別,並作為葉子結點  
  5.      if len(dataSet[0]) == 1:  #沒有特征可以選擇  
  6.           return majorityCnt(classList)  #返回數目最多的類別,並作為葉子結點  
  7.      bestFeat = chooseBestFeatureToSplit(dataSet)  #選擇信息增益最大的特征A  
  8.      bestFeatLabel = labels[bestFeat]  
  9.      myTree = {bestFeatLabel : {}}#建立結點  
  10.      del (labels[bestFeat])   #特征集中去除特征A  
  11.      featValues = [example[bestFeat] for example in dataSet] #特征A下的所有可能的取值  
  12.      uniqueVals = set(featValues)#去重  
  13.      for value in uniqueVals:    #對可能取值分別建立子樹  
  14.           subLabels = labels[ : ]      
  15.           myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)#遞歸建立子樹  
  16.      return myTree</code></span>  

3.決策樹剪枝

不考慮復雜度的情況下,一個完全生長樹很容易過擬合,對訓練數據擬合很好,但對預測數據效果很差。因此要對生成的決策樹做修剪,剪掉一些不必要的branch.可以通過增加正則項來控制決策樹的復雜度。定義Cα(T)表示決策樹的損失,C(T)表示模型對訓練數據的預測誤差。|T|表示模型的復雜度,即葉子節點的數目。

Cα(T)=C(T)+α|T|

參數α權衡訓練誤差與模型復雜度。

(1)計算每個節點的經驗熵

(2)遞歸地從樹的葉節點向上回溯,計算葉節點回溯到父節點之前與之后的損失Cα(TB)與Cα(TA),如果Cα(TA),代表修剪此節點后,損失函數更小,則進行剪枝。

(3)返回(2),直到不能繼續為止。

4.CART算法

CART(Classification and regression tree)算法一種即能做分類又能做分類的決策樹算法。

特征選擇

回歸樹采用平方誤差最小化准則:數據集D的平方誤差定義為∑|D|i=1(yi?y′)2,其中y′表示數據集D的平均值。

分類樹選擇基尼指數最小化准則。

CART樹生成

回歸樹的生成

(1)考慮數據集D上的所有特征,遍歷每一個特征下所有可能的取值或者切分點,對數據集D划分成兩部分D1和D2

(2)分別計算上述兩個子集的平方誤差和,選擇最小的平方誤差對應的特征與分割點,生成兩個子節點。

(3)對上述兩個子節點遞歸調用(1)(2),直到沒有特征可以選擇,或者子節點數目很小或者平方誤差小於閾值為止,作為葉子節點,並返回節點內樣本的均值(也可以在葉子節點內訓練回歸模型作為預測值)。

分類樹的生成

(1)考慮數據集D上的所有特征,遍歷每一個特征下所有可能的取值或者切分點,對數據集D划分成兩部分D1和D2

(2)分別計算上述兩個子集的基尼指數的和,選擇最小的基尼指數的和對應的特征與分割點,生成兩個子節點。

(3)對上述兩個子節點遞歸調用(1)(2),直到沒有特征可以選擇,或者子節點數目小於閾值或者基尼指數小於閾值為止,作為葉子節點,並返回類別數目最多的類別。

CART的剪枝

CART的剪枝算法,從決策樹T0的底端不斷剪枝,直到根節點。計算完全生長樹的內部的每一個結點t的剪枝系數g(t),剪枝系數代表修剪后整體損失減小的程度,即修剪前與修剪后的數據的誤差下降的程度。在T0中剪去最小的g(t),得到的子樹作為T1,如此剪下去,直到根節點。利用獨立的驗證集,測試子樹序列T0,T1,T2...,Tn每個子樹的平方誤差或者基尼指數。數值最小的決策樹作為最優的決策樹。

5.隨機森林

最簡單的RF(Random Forest)算法是bagging+完全生長CART樹的組合。

通過bagging方法是建立多個分類或者回歸模型,最后采用投票或平均作為預測值,可以降低過擬合。

 

這里寫圖片描述

 

bagging對訓練樣本采用boostrap采樣方法進行M輪,分別建立決策樹。由於每輪采用出的樣本子集基本不相同,訓練的模型相關性會降低小。為了進一步降低模型間的相關性,每輪訓練前可以對訓練數據的特征進行隨機采樣,也可以在決策樹的每個branch上進行隨機特征選擇。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM