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中則計算“信息增益率”:
$IG\_ratio=\frac{IG(V)}{H(V)}$
$H(V)=-\sum_j{p(v_j)logp(v_j)}$
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個葉子節點,那么該子樹的誤判率估計為$\frac{\sum{E_i+0.5*L}}{\sum{N_i}}$。這樣的話,我們可以看到一顆子樹雖然具有多個子節點,但由於加上了懲罰因子,所以子樹的誤判率計算未必占到便宜。剪枝后內部節點變成了葉子節點,其誤判個數J也需要加上一個懲罰因子,變成J+0.5。那么子樹是否可以被剪枝就取決於剪枝后的錯誤J+0.5在$\sum{E_i+0.5*L}$的標准誤差內。對於樣本的誤差率e,我們可以根據經驗把它估計成各種各樣的分布模型,比如是二項式分布,比如是正態分布。
那么一棵樹錯誤分類一個樣本值為1,正確分類一個樣本值為0,該樹錯誤分類的概率(誤判率)為e(e為分布的固有屬性,可以通過$\frac{\sum{E_i+0.5*L}}{\sum{N_i}}$統計出來),那么樹的誤判次數就是伯努利分布,我們可以估計出該樹的誤判次數均值和標准差:
$E(subtree\_err\_count)=N*e$
$var(subtree\_err\_count)=\sqrt{N*e*(1-e)}$
把子樹替換成葉子節點后,該葉子的誤判次數也是一個伯努利分布,其概率誤判率e為(E+0.5)/N,因此葉子節點的誤判次數均值為
$E(leaf\_err\_count)=N*e$
這里我們采用一種保守的分裂方案,即有足夠大的置信度保證分裂后准確率比不分裂時的准確率高時才分裂,否則就不分裂--也就是應該剪枝。如果要分裂(即不剪枝)至少要保證分裂后的誤判數$E(subtree\_err\_count)$要小於不分裂的誤判數$E(leaf\_err\_count)$,而且為了保證足夠高的置信度,這里甚至要示
$$E(subtree\_err\_count)+var(subtree\_err\_count)<E(leaf\_err\_count)$$
這里加了一個標准差可以有95%的置信度。
反之就是不分裂--即剪枝的條件:
$$E(subtree\_err\_count)+var(subtree\_err\_count)>E(leaf\_err\_count)$$

比如T4這棵子樹的誤差率:
$\frac{(3+2)+0.5*3}{16}=\frac{6.5}{16}=0.40625$
子樹誤差率的標准誤差:
$\sqrt{16*0.40625*(1-0.40625)}=1.96$
子樹替換為一個葉節點后,其誤差率為:
$\frac{7+0.5}{16}=0.46875$
因為$16*0.40625+1.96=6.5+1.96=8.46>16*0.46875=7.5$,所以應該把T4的所有子節點全部剪掉,T4變成一個葉子節點。
