1. 程式人生 > >決策樹之 C4.5 演算法

決策樹之 C4.5 演算法

前言

由於 C4.5 演算法是建立在 ID3 演算法基礎之上的,所以在講解 C4.5 的時候,會有很多與 ID3 重合的內容,這裡就不過多冗餘地說明了。本文旨在闡明 ID3 存在的問題,以及 C4.5 的改進方案。如果你對於 ID3 中的相關數學公式及概念還有些迷惑,歡迎移步至《決策樹之 ID3 演算法》。

版權說明

C4.5

決策樹構建分析

我們說 C4.5 演算法是對 ID3 演算法的改進,既然是改進,那麼必然是解決了一些問題,而且這些問題還是比較突出的。
1. 解決了資訊增益(IG)的缺點
2. 解決了連續變數問題

IG 的缺點及解決方案

上一篇說 ID3 演算法時,瞭解到 IG 是描述某一個特徵屬性的存在與否,對總體資訊熵的變化量影響。通過 IG 的公式(如果你不記得 IG 的公式,歡迎移步至《

決策樹之 ID3 演算法》),可以推測出,當某一個時刻總的資訊熵固定時,只要條件熵(就是某一特徵屬性的資訊熵) Entropy(S|T) 越小,那麼 IG 的值就越大。通過條件熵的計算公式,又可以推測出,如果某一個特性屬性的取值越多,那麼這個條件熵的值就會越小。從而,採用 IG 最大法選擇構建決策,在某一程度上可以理解成選擇多取值的特徵屬性。對於這個問題,C4.5 的做法是引入分裂資訊,然後計算資訊增益率(IGR)。

IGR=IGIV (其中,IG 為資訊增益,IV 為分裂資訊)
IV=ip(vi)log2p(vi) (其中,vi 為某一特徵屬性下的第 i 個分支屬性)

連續變數問題

在 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) 就可以這樣來計算:
IV(OutLook)=514log2514414log2414514log2514=1.577406
於是,再有
IGR(OutLook)=IGIV=0.246751.577406=0.156428

連續變數的域值

上面說的都是針對離散變數問題的解決思路及過程,如果某一個特徵屬性的變數值不能或是不合適使用離散變數來處理,又該怎麼做呢?比如在之前 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 時的分裂資訊。則:
IV(v4)=IV([4,1],[5,4])=514IV([4,1])+914IV([5,4])
IV(v4)=514(45log24515log215)+914(59log25949log249)=0.89

這裡寫圖片描述
這時就可以選取最大分裂資訊的位置當成此時的域值,也就是 68。
然後,此時溫度的分裂就是按照小於等於 68 和大於 68 進行劃分。

決策樹構建結果

通過上面的訓練資料集及 C4.5 構建演算法,我們構建了一棵如下的 C4.5 決策樹。
這裡寫圖片描述

Ref

GitHub download