C4.5演算法詳解(至今見過寫的最好的演算法詳解)
C4.5是機器學習演算法中的另一個分類決策樹演算法,它是基於ID3演算法進行改進後的一種重要演算法,相比於ID3演算法,改進有如下幾個要點:
- 用資訊增益率來選擇屬性。ID3選擇屬性用的是子樹的資訊增益,這裡可以用很多方法來定義資訊,ID3使用的是熵(entropy, 熵是一種不純度度量準則),也就是熵的變化值,而C4.5用的是資訊增益率。
- 在決策樹構造過程中進行剪枝,因為某些具有很少元素的結點可能會使構造的決策樹過適應(Overfitting),如果不考慮這些結點可能會更好。
- 對非離散資料也能處理。
- 能夠對不完整資料進行處理。
首先,說明一下如何計算資訊增益率。
熟悉了ID3演算法後,已經知道如何計算資訊增益,計算公式如下所示(來自Wikipedia):
或者,用另一個更加直觀容易理解的公式計算:
- 按照類標籤對訓練資料集D的屬性集A進行劃分,得到資訊熵:
- 按照屬性集A中每個屬性進行劃分,得到一組資訊熵:
- 計算資訊增益
然後計算資訊增益,即前者對後者做差,得到屬性集合A一組資訊增益:
這樣,資訊增益就計算出來了。
- 計算資訊增益率
下面看,計算資訊增益率的公式,如下所示(來自Wikipedia):
其中,IG表示資訊增益,按照前面我們描述的過程來計算。而IV是我們現在需要計算的,它是一個用來考慮分裂資訊的度量,分裂資訊用來衡量屬性分 裂資料的廣度和均勻程式,計算公式如下所示(來自Wikipedia):
簡化一下,看下面這個公式更加直觀:
其中,V表示屬性集合A中的一個屬性的全部取值。
我們以一個很典型被引用過多次的訓練資料集D為例,來說明C4.5演算法如何計算資訊增益並選擇決策結點。
上面的訓練集有4個屬性,即屬性集合A={OUTLOOK, TEMPERATURE, HUMIDITY, WINDY};而類標籤有2個,即類標籤集合C={Yes, No},分別表示適合戶外運動和不適合戶外運動,其實是一個二分類問題。
我們已經計算過資訊增益,這裡直接列出來,如下所示:
資料集D包含14個訓練樣本,其中屬於類別“Yes”的有9個,屬於類別“No”的有5個,則計算其資訊熵:
1 |
Info(D)
= -9/14 * log2(9/14) - 5/14 * log2(5/14) = 0.940 |
下面對屬性集中每個屬性分別計算資訊熵,如下所示:
1 |
Info(OUTLOOK)
= 5/14 * [- 2/5 * log2(2/5) – 3/5 * log2(3/5)] + 4/14 * [ - 4/4 * log2(4/4) - 0/4 * log2(0/4)] + 5/14 * [ - 3/5 * log2(3/5) – 2/5 * log2(2/5)] = 0.694 |
2 |
Info(TEMPERATURE)
= 4/14 * [- 2/4 * log2(2/4) – 2/4 * log2(2/4)] + 6/14 * [ - 4/6 * log2(4/6) - 2/6 * log2(2/6)] + 4/14 * [ - 3/4 * log2(3/4) – 1/4 * log2(1/4)] = 0.911 |
3 |
Info(HUMIDITY)
= 7/14 * [- 3/7 * log2(3/7) – 4/7 * log2(4/7)] + 7/14 * [ - 6/7 * log2(6/7) - 1/7 * log2(1/7)] = 0.789 |
4 |
Info(WINDY)
= 6/14 * [- 3/6 * log2(3/6) – 3/6 * log2(3/6)] + 8/14 * [ - 6/8 * log2(6/8) - 2/8 * log2(2/8)] = 0.892 |
根據上面的資料,我們可以計算選擇第一個根結點所依賴的資訊增益值,計算如下所示:
1 |
Gain(OUTLOOK)
= Info(D) - Info(OUTLOOK) = 0.940 - 0.694 = 0.246 |
2 |
Gain(TEMPERATURE)
= Info(D) - Info(TEMPERATURE) = 0.940 - 0.911 = 0.029 |
3 |
Gain(HUMIDITY)
= Info(D) - Info(HUMIDITY) = 0.940 - 0.789 = 0.151 |
4 |
Gain(WINDY)
= Info(D) - Info(WINDY) = 0.940 - 0.892 = 0.048 |
接下來,我們計算分裂資訊度量H(V):
- OUTLOOK屬性
屬性OUTLOOK有3個取值,其中Sunny有5個樣本、Rainy有5個樣本、Overcast有4個樣本,則
1 |
H(OUTLOOK)
= - 5/14 * log2(5/14) - 5/14 * log2(5/14) - 4/14 * log2(4/14) = 1.577406282852345 |
- TEMPERATURE屬性
屬性TEMPERATURE有3個取值,其中Hot有4個樣本、Mild有6個樣本、Cool有4個樣本,則
1 |
H(TEMPERATURE)
= - 4/14 * log2(4/14) - 6/14 * log2(6/14) - 4/14 * log2(4/14) = 1.5566567074628228 |
- HUMIDITY屬性
屬性HUMIDITY有2個取值,其中Normal有7個樣本、High有7個樣本,則
1 |
H(HUMIDITY)
= - 7/14 * log2(7/14) - 7/14 * log2(7/14) = 1.0 |
- WINDY屬性
屬性WINDY有2個取值,其中True有6個樣本、False有8個樣本,則
1 |
H(WINDY)
= - 6/14 * log2(6/14) - 8/14 * log2(8/14) = 0.9852281360342516 |
根據上面計算結果,我們可以計算資訊增益率,如下所示:
1 |
IGR(OUTLOOK)
= Info(OUTLOOK) / H(OUTLOOK) = 0.246/1.577406282852345 = 0.15595221261270145 |
2 |
IGR(TEMPERATURE)
= Info(TEMPERATURE) / H(TEMPERATURE) = 0.029 / 1.5566567074628228 = 0.018629669509642094 |
3 |
IGR(HUMIDITY)
= Info(HUMIDITY) / H(HUMIDITY) = 0.151/1.0 = 0.151 |
4 |
IGR(WINDY)
= Info(WINDY) / H(WINDY) = 0.048/0.9852281360342516 = 0.048719680492692784 |
根據計算得到的資訊增益率進行選擇屬性集中的屬性作為決策樹結點,對該結點進行分裂。
C4.5演算法的優點是:產生的分類規則易於理解,準確率較高。
C4.5演算法的缺點是:在構造樹的過程中,需要對資料集進行多次的順序掃描和排序,因而導致演算法的低效。
參考連結