話說今天《機器學習》上課被很深地打擊了,標名爲“數據挖掘”專業的我居然連個信息增益的例子都沒能算正確。唉,自看書以來,這個地方就一直沒有去推算過,每每看到決策樹時看完Entropy就直接跳過後面增益計算了。因而,總想找個時間再回過來好好看一下,這不,被逼上了呢。神奇的墨菲定律呢:你擔心它發生的,它就一定會發生。
回正題了,這三個指標均是決策樹用來劃分屬性的時候用到的,其中信息增益(Info Gain)用於ID3,Gini用於CART,信息增益率(Info Gain Ratio)用於C4.5。提到前兩個指標的計算時,首先要講到的是關於熵(Entropy)的計算。
1、熵(Entropy)
理論上來說用於決策樹的屬性選擇函數,爲方便計算,往往是定義爲其屬性的不純性度量,那麼必須滿足如下三個條件:
- 當結點很純時,其度量值應爲0
- 當不純性最大時(比如所有類都有同樣的可能),其度量值應最大
- 度量應該服從多級特性,這樣決策樹才能分階段建立起來
measure([2,3,4])=measure([2,7])+79×measure([3,4])
而熵(Entropy)能夠滿足以上三點特性。熵(Entropy)是由“信息論之父”香農提出的,更多的各種歷史、數學理論請查看參考[1]。接下來,看看熵的計算公式如下:
其中,pi爲比例值。其實,熵也可以用另外一種意思來解釋:
Given a probability distribution, the info required to predict an event is the distribution’s entropy. Entropy gives the information required in bits (this can involve fractions of bits!)
可以簡單的理解爲“熵”描述了用來預測的信息位數。接下來看個例子:
如下表所述的天氣數據,學習目標是預測Play or not play?
表1 天氣預報數據集例子
Outlook | Temperature | Humidity | Windy | Play? |
sunny | hot | high | false | no |
sunny | hot | high | true | no |
overcast | hot | high | false | yes |
rain | mild | high | false | yes |
rain | cool | normal | false | yes |
rain | cool | normal | true | no |
overcast | cool | normal | true | yes |
sunny | mild | high | false | no |
sunny | cool | normal | false | yes |
rain | mild | normal | false | yes |
sunny | mild | normal | true | yes |
overcast | mild | high | true | yes |
overcast | hot | normal | false | yes |
rain | mild | high | true | no |
共14個實例,9個正例(yes),5個負例(no)。
這樣當前數據的信息量(原始狀態)用熵來計算就是:
有了上面計算熵(信息)的基礎,接下來看信息增益了。
2、信息增益(Info Gain)
信息增益,按名稱來理解的話,就是前後信息的差值,在決策樹分類問題中,即就是決策樹在進行屬性選擇劃分前和劃分後的信息差值,即可以寫成:
如上面的例子,通過使用Outlook屬性來劃分成下圖:
圖1 使用Outlook屬性劃分決策樹
在劃分後,可以看到數據被分成三份,則各分支的信息計算如下:
因此,劃分後的信息總量應爲:
如果把上面的公式整理到一起的話,就是:
$$ info([2,3], [4,0], [3,2]) = \frac{5}{14}\times info([2,3]) + \frac{4}{14}\times info([4,0]) + \frac{5}{14}\times info([3,2])
= 0.347 + 0 + 0.347 = 0.694 bits $$
從上面可以看出,劃分後的信息總量計算公式爲:
其中,n表示劃分後的分支數目,|S|表示劃分前的實例個數,|Si|表示劃分後某個分支的實例個數。
最後,信息增益
通過劃分其他屬性,可得到其他的樹如下:
同樣計算,
這樣,算法會選擇最大的信息增益屬性來進行劃分,在此處爲Outlook屬性。接下來在Outlook=sunny結點,按照同樣的判斷方法,選擇其他屬性進行劃分,
計算如下:
因而可以得到下一個劃分結點是Humidity屬性。在這裏的Temperature有三個值,因而其info([2,2,1])使用簡便方法計算爲:
因此gain(Temperature|Outlook,Play?)=0.971–0.4=0.571bits。另外,由於要計算的是信息增益最大,在劃分前信息總量infobeforeSplit()一定的情況下,我們完全可以直接求劃分後信息量最小的特性即可。
3、信息增益率(Info Gain Ratio)
通過上面的例子,想必對於信息增益的計算步驟已經熟悉些了。那麼下面來看信息增益存在的一個問題:假設某個屬性存在大量的不同值,如ID編號(在上面例子中加一列爲ID,編號爲a~n),在劃分時將每個值成爲一個結點,這樣就形成了下面的圖:
最終計算得到劃分後的信息量爲:info(S1,…,Sn)=∑ni=1|Si||S|×entropy(Si)=0,因爲entropy(Si)=info([1,0]) 或 info([0,1]),只含一個純結點。這樣決策樹在選擇屬性時,將偏向於選擇該屬性,但這肯定是不正確(導致過擬合)的。因此有必要使用一種更好的方法,那就是C4.5中使用的信息增益率(Info Gain Ratio),其考慮了分支數量和尺寸的因素,使用稱爲內在信息(Intrinsic Information)的概念。
Gain ratio takes number and size of branches into account when choosing an attribute, and corrects the information gain by taking the intrinsic information of a split into account (i.e. how much info do we need to tell which branch an instance belongs to).
內在信息(Intrinsic Information),可簡單地理解爲表示信息分支所需要的信息量,其計算公式如下:
則針對上圖中的例子,
信息增益率則計算如下:
依然如上例:
實際上可以看出,屬性的重要性會隨着其內在信息(Intrinsic Information)的增大而減小。 信息增益率作爲一種補償(Compensate)措施來解決信息增益所存在的問題,但是它也有可能導致過分補償,而選擇那些內在信息很小的屬性,這一點可以嘗試:首先,僅考慮那些信息增益超過平均值的屬性,其次再比較信息增益。
4、Gini Index
在CART裏面劃分決策樹的條件是採用Gini Index,定義如下:
其中,pj是類j在T中的相對頻率,當類在T中是傾斜的時,gini(T)會最小。
將T劃分爲T1(實例數爲N1)和T2(實例數爲N2)兩個子集後,劃分數據的Gini定義如下:
然後選擇其中最小的ginisplit(T)作爲結點劃分決策樹。
5、參考
本文大量地參考瞭如下資料:
[1] http://en.wikipedia.org/wiki/Entropy (EN), http://zh.wikipedia.org/wiki/%E7%86%B5 (CN)
[2] Data Mining examples: www.liacs.nl/home/joost/DM/mod_06_dec_tree_intro.ppt
[3] Data Mining – Practical Machine Learning Tools and Techniques with Java
內容寫了這麼多,就到此爲止吧,要不然就沒完沒了了,下一步考慮分析Weka中的信息增益(weka.attributeSelection.InfoGainAttributeEval)以及信息增益率(weka.attributeSelection.GainRatioAttributeEval)的實現。錯誤之處,歡迎指正!
原載地址:http://ezale.bokewan.com/info-gain-and-gain-ratio-and-gini/