決策樹構建過程:
1、將所有訓練數據集放在根節點上;
2、遍歷每種屬性的每種分割方式,找到最好的分割點;
3、根據2中最好的分割點將根節點分割成多個子節點(大於等於2個);
4、對剩下的樣本和屬性重復執行步驟2、3,直到每個子節點中的數據都屬於同一類為止。
C4.5算法:
C4.5算法是采用信息增益率來進行節點的分裂的,公式為:,
其中,
,
而,
,並且要求信息增益率越大越好。
下面舉例具體計算,如下圖為各種天氣下是否打高爾夫球的表格。
Day | Outlook | Temperature | Humidity | Windy | Play Golf |
1 | Sunny | 85 | 85 | F | N |
2 | Sunny | 80 | 90 | T | N |
3 | Overcast | 83 | 78 | F | Y |
4 | Rainy | 70 | 96 | F | Y |
5 | Rainy | 68 | 80 | F | Y |
6 | Rainy | 65 | 70 | T | N |
7 | Overcast | 64 | 65 | T | Y |
8 | Sunny | 72 | 95 | F | N |
9 | Sunny | 69 | 70 | F | Y |
10 | Rainy | 75 | 80 | F | Y |
11 | Sunny | 75 | 70 | T | Y |
12 | Overcast | 72 | 90 | T | Y |
13 | Overcast | 81 | 75 | F | Y |
14 | Rainy | 71 | 80 | T | N |
步驟1:將所有的節點放在根節點上,計算此時根節點的信息熵為:
步驟2:遍歷每種屬性的每種分割方式,先看Outlook屬性,它有三種取值Sunny, Rainy, Overcast,
故,
故按照Outlook屬性分裂的話信息增益為:
而Outlook屬性本身的分裂信息熵為:
故最終的信息增益率為:
接下來計算Humidity的信息增益率。因為Humidity為連續型的屬性,故其計算方法相對於離散型的屬性計算會復雜很多。
對於Humidity屬性,我們先對其進行升序排列如下:
Day | Humidity | Play Golf |
7 | 65 | Y |
6 | 70 | N |
9 | 70 | Y |
11 | 70 | Y |
13 | 75 | Y |
3 | 78 | Y |
5 | 80 | Y |
10 | 60 | Y |
14 | 80 | N |
1 | 85 | N |
2 | 90 | N |
12 | 90 | Y |
8 | 95 | N |
4 | 96 | Y |
然后就是選取分裂節點,那么對於連續型屬性,它的分裂節點是任意相鄰的兩個取值的中點,我們從第一個開始,取65和70的加權均值:,解釋一下,對於65和70這兩個數值,
因為65只有一個,70有3個,所以分別乘以1/4和3/4,然后在計算按68.75來分裂的信息熵:
再選取第二個分裂點:
同理可得所有的分裂點的信息熵:
分裂點 | 68.75 | 71.25 | 76.5 | 79.5 | 81.25 | 88.333 | 91.667 | 95.5 |
信息熵 | 0.893 | 0.925 | 0.895 | 0.850 | 0.838 | 0.915 | 0.930 | 0.893 |
由表可知,節點81.25作為分裂節點時,其信息熵最小,所以信息增益最大,故將此節點作為分裂點。這里用信息增益最大而不是信息增益率最大作為連續型屬性分裂節點的評判標准,
是為了防止連續型屬性每個取值都對應了一個樣本,這樣的分裂信息熵就最大了。對於分裂點81.25,其對應的信息增益率的計算如下:
同理對於屬性Temperature也是如上的操作,先排序,再算信息熵,結果如下:
分裂點 | 64.5 | 66.5 | 68.5 | 69.5 | 70.5 | 71.667 | 73.5 | 76.667 | 80.5 | 82 | 84 |
信息熵 | 0.893 | 0.93 | 0.94 | 0.925 | 0.895 | 0.939 | 0.939 | 0.915 | 0.94 | 0.93 | 0.827 |
其信息增益率為:
最終得到所有的屬性的信息增益率為:
屬性 | Outlook | Windy | Humidity | Temperature |
信息增益率 | 0.156 | 0.049 | 0.109 | 0.305 |
選取信息增益率最大的Temperature屬性作為分裂屬性,分類結果如下:
對於Temperature <=84的節點繼續進行分裂,只不過分裂的時候去掉Temperature屬性以及Temperature>84的節點里的樣本,重復上面步驟。