前言
由於 C4.5 算法是建立在 ID3 算法基礎之上的,所以在講解 C4.5 的時候,會有很多與 ID3 重合的內容,這裏就不過多冗餘地說明了。本文旨在闡明 ID3 存在的問題,以及 C4.5 的改進方案。如果你對於 ID3 中的相關數學公式及概念還有些迷惑,歡迎移步至《決策樹之 ID3 算法》。
版權說明
著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
本文作者:Q-WHai
發表日期: 2016年7月6日
本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/51840361
來源:CSDN
更多內容:分類 >> 數據挖掘
C4.5
決策樹構建分析
我們說 C4.5 算法是對 ID3 算法的改進,既然是改進,那麼必然是解決了一些問題,而且這些問題還是比較突出的。
1. 解決了信息增益(IG)的缺點
2. 解決了連續變量問題
IG 的缺點及解決方案
上一篇說 ID3 算法時,瞭解到 IG 是描述某一個特徵屬性的存在與否,對總體信息熵的變化量影響。通過 IG 的公式(如果你不記得 IG 的公式,歡迎移步至《決策樹之 ID3 算法》),可以推測出,當某一個時刻總的信息熵固定時,只要條件熵(就是某一特徵屬性的信息熵) Entropy(S|T) 越小,那麼 IG 的值就越大。通過條件熵的計算公式,又可以推測出,如果某一個特性屬性的取值越多,那麼這個條件熵的值就會越小。從而,採用 IG 最大法選擇構建決策,在某一程度上可以理解成選擇多取值的特徵屬性。對於這個問題,C4.5 的做法是引入分裂信息,然後計算信息增益率(IGR)。
連續變量問題
在 ID3 中,我們不能解決連續變量問題,比如把之前的溫度屬性的值修改成一些整數類型的變量時,ID3 的做法就是對每一個不同值的變量進行分開計算,這樣就出現了一個問題,ID3 構建的決策樹中產生了過多的分支。這個時候,你可能會想說,如果把這些值修改成某一個域值,讓小於等於這個域值的數據放在決策樹的左邊,大於這個域值的數據放在決策樹的右邊。C4.5 中就是這麼幹的,只是 C4.5 在尋找這個域值時,更加合理。
訓練數據集
假設我們如下訓練數據集
Day | OutLook | Temperature | Humidity | Wind | PlayGolf |
---|---|---|---|---|---|
1 | Sunny | 85 | 85 | False | No |
2 | Sunny | 80 | 90 | True | No |
3 | Overcast | 83 | 78 | False | Yes |
4 | Rainy | 70 | 96 | False | Yes |
5 | Rainy | 68 | 80 | False | Yes |
6 | Rainy | 65 | 70 | True | No |
7 | Overcast | 64 | 65 | True | Yes |
8 | Sunny | 72 | 95 | False | No |
9 | Sunny | 69 | 70 | False | Yes |
10 | Rainy | 75 | 80 | False | Yes |
11 | Sunny | 75 | 70 | True | Yes |
12 | Overcast | 72 | 90 | True | Yes |
13 | Overcast | 81 | 75 | False | Yes |
14 | Rainy | 71 | 80 | True | No |
決策樹構建過程
根據 C4.5 算法的原理及步驟繪製出如下過程圖:
計算步驟
雖然上圖中需要計算的量有很多,但是,有很量的計算在《決策樹之 ID3 算法》一文中,講解得也很詳細了,所以這裏我不再說明。需要說明的只有兩個地方:IV 和 連續變量的域值計算。
IV(T) & IGR(T)
從上面的分裂信息的計算公式中,可以看到分裂信息的計算是針對某一個特徵屬性內部而言的。比如現在針對特徵屬性 OutLook 這一特徵屬性而言有如下分裂信息的分佈情況:
Sunny | Overcast | Rainy | |
---|---|---|---|
結果總數 | 5 | 4 | 5 |
那麼 OutLook 的分裂信息 IV(OutLook) 就可以這樣來計算:
於是,再有
連續變量的域值
上面說的都是針對離散變量問題的解決思路及過程,如果某一個特徵屬性的變量值不能或是不合適使用離散變量來處理,又該怎麼做呢?比如在之前 ID3 算法的文章中使用的溫度屬性,這個屬性的變量值使用連續變量應該更合適一些,最基本的邏輯就是溫度達到多少算是 Hot,達到多少算是 Cool 呢?這個不好衡量,可是如果使用連續變量就要合理得多。
可是 ID3 算法在對連續變量的處理上,表現很糟糕。在 C4.5 中是通過如下方法解決的。
假設我們選擇了溫度屬性,則被提取的關鍵數據爲:[[85, No], [80, No], [83, Yes], [70, Yes], [68, Yes], [65, No], [64, Yes], [72, No], [69, Yes], [75, Yes], [75, Yes], [72, Yes], [81, Yes], [71, No]]
現在我們對這批數據進行從小到大進行排序,排序後數據集就變成:
[[64, Yes], [65, No], [68, Yes], [69, Yes], [70, Yes], [71, No], [72, No], [72, Yes], [75, Yes], [75, Yes], [80, No], [81, Yes], [83, Yes], [85, No]]
繪製成如下圖例:
當我們拿到一個已經排好序的(溫度,結果)的列表之後,分別計算被某個單元分隔的左邊和右邊的分裂信息,計算結果如下:
比如現在計算 index = 4 時的分裂信息。則:
這時就可以選取最大分裂信息的位置當成此時的域值,也就是 68。
然後,此時溫度的分裂就是按照小於等於 68 和大於 68 進行劃分。
決策樹構建結果
通過上面的訓練數據集及 C4.5 構建算法,我們構建了一棵如下的 C4.5 決策樹。
Ref
GitHub download
此處爲本文的算法實現,採用的編程語言爲 Java。算法也是在不斷重構及優化,如果你對此感興趣,歡迎 star.
- https://github.com/MachineLeanring/MachineLearningC4.5