決策樹之 C4.5 算法

前言

由於 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)。

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

此處爲本文的算法實現,採用的編程語言爲 Java。算法也是在不斷重構及優化,如果你對此感興趣,歡迎 star.
- https://github.com/MachineLeanring/MachineLearningC4.5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章