C4.5決策樹在ID3決策樹的基礎之上稍作改進,請先閱讀ID3決策樹。
C4.5克服了ID3的2個缺點:
1.用信息增益選擇屬性時偏向於選擇分枝比較多的屬性值,即取值多的屬性
2.不能處理連貫屬性
Outlook | Temperature | Humidity | Windy | PlayGolf? |
sunny | 85 | 85 | FALSE | no |
sunny | 80 | 90 | TRUE | no |
overcast | 83 | 86 | FALSE | yes |
rainy | 70 | 96 | FALSE | yes |
rainy | 68 | 80 | FALSE | yes |
rainy | 65 | 70 | TRUE | no |
overcast | 64 | 65 | TRUE | yes |
sunny | 72 | 95 | FALSE | no |
sunny | 69 | 70 | FALSE | yes |
rainy | 75 | 80 | FALSE | yes |
sunny | 75 | 70 | TRUE | yes |
overcast | 72 | 90 | TRUE | yes |
overcast | 81 | 75 | FALSE | yes |
rainy | 71 | 91 | TRUE | no |
Outlook和Windy取離散值,Temperature和Humidity則取連續值。
對於離散屬性V,ID3中計算的是“信息增益”,C4.5中則計算“信息增益率”:
vj表示屬性V的各種取值,在ID3中用信息增益選擇屬性時偏向於選擇分枝比較多的屬性值,即取值多的屬性,在C4.5中由於除以了H(V),可以削弱這種作用。
C4.5是如何處理連續屬性的呢?實際上它先把連續屬性轉換爲離散屬性再進行處理。雖然本質上屬性的取值是連續的,但對於有限的採樣數據它是離散的,如果有N條樣本,那麼我們有N-1種離散化的方法:<=vj的分到左子樹,>vj的分到右子樹。計算這N-1種情況下最大的信息增益率。
在離散屬性上只需要計算1次信息增益率,而在連續屬性上卻需要計算N-1次,計算量是相當大的。有辦法可以減少計算量。對於連續屬性先進行排序,只有在決策屬性發生改變的地方纔需要切開。比如對Temperature進行排序
本來有13種離散化的情況,現在只需計算7種。如果利用增益率來選擇連續值屬性的分界點,會導致一些副作用。分界點將樣本分成兩個部分,這兩個部分的樣本個數之比也會影響增益率。根據增益率公式,我們可以發現,當分界點能夠把樣本分成數量相等的兩個子集時(我們稱此時的分界點爲等分分界點),增益率的抑制會被最大化,因此等分分界點被過分抑制了。子集樣本個數能夠影響分界點,顯然不合理。因此在決定分界點時還是採用增益這個指標,而選擇屬性的時候才使用增益率這個指標。這個改進能夠很好得抑制連續值屬性的傾向。當然還有其它方法也可以抑制這種傾向,比如MDL。
Tree-Growth終止的條件以及剪枝策略很多,在CART樹中已講了一些。每個葉子上都是“純的”不見得就是好事,那樣會過擬合。還有一個方法是葉子節點上覆蓋的樣本個數小於一個閾值時停止Tree-Growth。
在《CART樹》中介紹了基於代價複雜性的剪枝法,剪枝的目的也是爲了避免過擬合。
第一種方法,也是最簡單的方法,稱之爲基於誤判的剪枝。這個思路很直接,完全的決策樹不是過度擬合麼,我再搞一個測試數據集來糾正它。對於完全決策樹中的每一個非葉子節點的子樹,我們嘗試着把它替換成一個葉子節點,該葉子節點的類別我們用子樹所覆蓋訓練樣本中存在最多的那個類來代替,這樣就產生了一個簡化決策樹,然後比較這兩個決策樹在測試數據集中的表現,如果簡化決策樹在測試數據集中的錯誤比較少,並且該子樹裏面沒有包含另外一個具有類似特性的子樹(所謂類似的特性,指的就是把子樹替換成葉子節點後,其測試數據集誤判率降低的特性),那麼該子樹就可以替換成葉子節點。該算法以bottom-up的方式遍歷所有的子樹,直至沒有任何子樹可以替換使得測試數據集的表現得以改進時,算法就可以終止。
第一種方法很直接,但是需要一個額外的測試數據集,能不能不要這個額外的數據集呢?爲了解決這個問題,於是就提出了悲觀剪枝。悲觀剪枝就是遞歸得估算每個內部節點所覆蓋樣本節點的誤判率。剪枝後該內部節點會變成一個葉子節點,該葉子節點的類別爲原內部節點的最優葉子節點所決定。然後比較剪枝前後該節點的錯誤率來決定是否進行剪枝。該方法和前面提到的第一種方法思路是一致的,不同之處在於如何估計剪枝前分類樹內部節點的錯誤率。
把一顆子樹(具有多個葉子節點)的分類用一個葉子節點來替代的話,在訓練集上的誤判率肯定是上升的,但是在新數據上不一定。於是我們需要把子樹的誤判計算加上一個經驗性的懲罰因子。對於一顆葉子節點,它覆蓋了N個樣本,其中有E個錯誤,那麼該葉子節點的錯誤率爲(E+0.5)/N。這個0.5就是懲罰因子,那麼一顆子樹,它有L個葉子節點,那麼該子樹的誤判率估計爲。這樣的話,我們可以看到一顆子樹雖然具有多個子節點,但由於加上了懲罰因子,所以子樹的誤判率計算未必佔到便宜。剪枝後內部節點變成了葉子節點,其誤判個數J也需要加上一個懲罰因子,變成J+0.5。那麼子樹是否可以被剪枝就取決於剪枝後的錯誤J+0.5在的標準誤差內。對於樣本的誤差率e,我們可以根據經驗把它估計成各種各樣的分佈模型,比如是二項式分佈,比如是正態分佈。
那麼一棵樹錯誤分類一個樣本值爲1,正確分類一個樣本值爲0,該樹錯誤分類的概率(誤判率)爲e(e爲分佈的固有屬性,可以通過統計出來),那麼樹的誤判次數就是伯努利分佈,我們可以估計出該樹的誤判次數均值和標準差:
把子樹替換成葉子節點後,該葉子的誤判次數也是一個伯努利分佈,其概率誤判率e爲(E+0.5)/N,因此葉子節點的誤判次數均值爲
使用訓練數據,子樹總是比替換爲一個葉節點後產生的誤差小,但是使用校正後有誤差計算方法卻並非如此,當子樹的誤判個數大過對應葉節點的誤判個數一個標準差之後,就決定剪枝:
這個條件就是剪枝的標準。
當並不一定非要大一個標準差,可以給定任意的置信區間,我們設定一定的顯著性因子,就可以估算出誤判次數的上下界。
比如T4這棵子樹的誤差率:
子樹誤差率的標準誤差:
子樹替換爲一個葉節點後,其誤差率爲:
因爲,所以決定將子樹T4替換這一個葉子節點。