熵,信息增益,信息增益率,Gini


        話說今天《機器學習》上課被很深地打擊了,標名爲“數據挖掘”專業的我居然連個信息增益的例子都沒能算正確唉,自看書以來,這個地方就一直沒有去推算過,每每看到決策樹時看完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]。接下來,看看熵的計算公式如下:

entropy(p1,p2,…,pn)=–p1log2(p1)–p2log2(p2)–…–pnlog2(pn)

其中,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)

這樣當前數據的信息量(原始狀態)用熵來計算就是:

info(play?)=info([9,5])=entropy(914,514)=–914log2(914)–514log2(514)=0.410+0.530=0.940

有了上面計算熵(信息)的基礎,接下來看信息增益了

2、信息增益(Info Gain)

信息增益,按名稱來理解的話,就是前後信息的差值,在決策樹分類問題中,即就是決策樹在進行屬性選擇劃分前和劃分後的信息差值,即可以寫成:

gain()=infobeforeSplit()–infoafterSplit()

如上面的例子,通過使用Outlook屬性來劃分成下圖:


  
圖1 使用Outlook屬性劃分決策樹

在劃分後,可以看到數據被分成三份,則各分支的信息計算如下:

info([2,3])=−25log2(25)–35log2(35)=0.971bits

info([4,0])=−44log2(44)–04log2(04)=0bits
,此處雖然log2(0)沒有定義,但0×log2(0)仍然計算爲0

info([3,2])=−35log2(35)–25log2(25)=0.971bits

因此,劃分後的信息總量應爲:

info([2,3],[4,0],[3,2])=514×0.971+414×0+514×0.971=0.693bits

如果把上面的公式整理到一起的話,就是:

$$ 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 $$

從上面可以看出,劃分後的信息總量計算公式爲:

info(S1,…,Sn)=∑in|Si||S|×entropy(Si)

其中,n表示劃分後的分支數目,|S|表示劃分前的實例個數,|Si|表示劃分後某個分支的實例個數

最後,信息增益

gain(outlook|play?)=infobeforeSplit()–infoafterSplit()=info(play?)–info([3,2],[4,0],[3,2])=0.940–0.694=0.246bits

通過劃分其他屬性,可得到其他的樹如下:


圖2 使用其他屬性劃分決策樹

同樣計算,

gain(Temperature|play?)=info([9,5])–info([2,2],[4,2],[3,1])=0.940–(414×info([2,2])+614×info([4,2])+414×info([3,1]))=0.028bits

gain(Humidity|play?)=0.152bits

gain(Windy|play?)=0.048bits

這樣,算法會選擇最大的信息增益屬性來進行劃分,在此處爲Outlook屬性接下來在Outlook=sunny結點,按照同樣的判斷方法,選擇其他屬性進行劃分,


圖3 繼續劃分決策樹

計算如下:

infobeforeSplit()=info([2,3])=0.971bits
2個正例,3個負例,計算其熵

gain(Temperature|Outlook,Play?)=0.571bits

gain(Humidity|Outlook,Play?)=0.971bits

gain(Winday|Outlook,Play?)=0.020bits

因而可以得到下一個劃分結點是Humidity屬性在這裏的Temperature有三個值,因而其info([2,2,1])使用簡便方法計算爲:

info([0,2],[1,1],[1,0])=25×info([0,2])+25×info([1,1])+15×info([1,0])=0.4bits

因此gain(Temperature|Outlook,Play?)=0.971–0.4=0.571bits。另外,由於要計算的是信息增益最大,在劃分前信息總量infobeforeSplit()一定的情況下,我們完全可以直接求劃分後信息量最小的特性即可

3、信息增益率(Info Gain Ratio)

通過上面的例子,想必對於信息增益的計算步驟已經熟悉些了那麼下面來看信息增益存在的一個問題:假設某個屬性存在大量的不同值,如ID編號(在上面例子中加一列爲ID,編號爲a~n),在劃分時將每個值成爲一個結點,這樣就形成了下面的圖:


圖4 信息增益偏向

最終計算得到劃分後的信息量爲: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),可簡單地理解爲表示信息分支所需要的信息量,其計算公式如下:

IntrinsicInfo(S,A)=−∑|Si||S|log2|Si||S|

則針對上圖中的例子,

info([1,1,…,1])=14×(−114log2114)=3.807bits

信息增益率則計算如下:

gainratio(Attribute)=gain(Attribute)IntrinsicInfo(Attribute)

依然如上例:

gainratio(IDCode)=0.940bits3.807bits=0.246

實際上可以看出,屬性的重要性會隨着其內在信息(Intrinsic Information)的增大而減小 信息增益率作爲一種補償(Compensate)措施來解決信息增益所存在的問題,但是它也有可能導致過分補償,而選擇那些內在信息很小的屬性,這一點可以嘗試:首先,僅考慮那些信息增益超過平均值的屬性,其次再比較信息增益

4、Gini Index

在CART裏面劃分決策樹的條件是採用Gini Index,定義如下:

gini(T)=1−∑j=1np2j

其中,pj是類j在T中的相對頻率,當類在T中是傾斜的時,gini(T)會最小

將T劃分爲T1(實例數爲N1)和T2(實例數爲N2)兩個子集後,劃分數據的Gini定義如下:

ginisplit(T)=N1Ngini(T1)+N2Ngini(T2)

然後選擇其中最小的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/

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