1. 程式人生 > >大白話5分鐘帶你走進人工智慧-第二十五節決策樹系列之資訊增益和資訊增益率(4)

大白話5分鐘帶你走進人工智慧-第二十五節決策樹系列之資訊增益和資訊增益率(4)

                                                       第二十五節決策樹系列之資訊增益和資訊增益率(4)

上一節我們講解了決策樹的分裂條件以及評估純度的其中一個方式,基尼係數。本節的話,我們再講解一個評估純度的方式,基於資訊增益的方式,即ID3樹使用的評估方式。它辦的事跟Gini係數一樣,也是評價純度,但是它更客觀一點,但它算起來比Gini係數稍慢一點,它辦的事跟Gini係數一樣,也是評價純度,但是它更客觀一點,算起來比Gini係數稍慢一點,更準確一點。這是兩種不同的評價方式。

目錄

1-資訊增益

2-資訊增益率


1-資訊增益

帶著資訊兩字就離不開熵,熵首先是一個熱力學的概念,比如一個罐子,裡面有好多氣體分子,分子在做隨機無規則的運動,叫熱運動,運動的越激烈,系統內的熵就越高。它的根源是一個熱力學上的概念。引入到資訊理論裡的熵,雖然還是這個字,但已經跟原來的熱力學沒有直接的關係了,只不過公式形式是一樣的。即:

                                               

我們明顯的發現它分為兩部分,一部分是pi,pi代表標籤值或者類別值在這個系統裡的佔比,另一部分是log pi。我們稱  叫做資訊,它的單位是bit,0和1的位元。資訊的原始公式是: 。舉個例子來說明下:假設無線電考試作弊,選擇題是ABCD四個選項,用0和1編碼的話,不混淆的情況下,辨別四個選項。應該如何的設定這個暗號?最直觀的方法就是下面這種表示方法:即A表示為00,B表示為01,C表示為10,D表示為11。在不知道它們的概率的情況下,這麼選最合適。但是這種每次發的話如果有24道題,就會發48個數字。如果收費是按數字來的話有沒有相對更經濟點的方式能少發點總次數讓答案還不被損失的傳過去?假如考試95%的答案都是C,還用兩位數字編碼就有點浪費了。我們自然而然想到的是讓答案比較多的選項用盡量少的位數表示。假設ABCD的概率分佈是1/8,1/8,1/2,1/4,C出現的概率最高。我用0表示C,如果用D表示1 的話,為了不混淆的話,A,B只能用兩位以上的表示01或者10,100等 ,如果發過來的是01,那麼答案到底是一個C,一個D 還是A或者B。所以所以為了避免混淆,1就再也不能單獨再表示答案了。那什麼可以用呢?兩位的可以用。假如D設為10的話,01還能再用於別的答案嗎?不能,因為比如來一個0010,不知道是兩個0,一個10。還是一個0,一個10和0。10被D用的話,11還能在用嗎?不能了。因為如果A設定為為11的話,最後剩一個答案B從000~111都不能表示了,都會和11混淆。所以11在D為10的前提下不能再用了。所以兩位的只能用10。即D用10。剩下A,B的表示都是三位數了。有興趣的可以試下在C 用0表示,D用10表示,A用111,B用101表示不會被混淆。假如我們40道題,20道題是C,10道題是D,5道題是B,5道題是A,現在只需要傳送20*1+10*2+5*3+5*3=70。對比平均編碼長度,都是兩位的話。40*2=80,少傳送了10個位元組。在完全無損的情況下,我們只用了一點點的小技巧,就能使資料進行壓縮。並且壓縮是免費的。

我們來看下一個資訊的計算。-log2(1/2)=1,-log2(1/4)=2,-log2(1/8)=3。當概率為1/2的時候,用一位編碼解決,概率為1/4的時候可以用兩位編碼解決,而1/8的時候用三位編碼解決。發現資訊的值剛好和位數對應上,所以這也就是為什麼用-log2Pi來表示資訊的概念。它的單位真的是位元。它是無失真壓縮的理論上限,意思就是說你再怎麼耍技巧。要想把資訊完整的發過來,至少需要這麼多資訊。這也是資訊的來源。而我們的熵其實就是平均碼長。計算方式為1/8*3+1/8*3+1/2*1+1/4*2。意思就是說有兩個1/8的數需要3個碼長,1/2的數需要1個碼長,1/4的數需要2個碼長,所以整個系統傳送過來平均傳送一個答案需要1/8*3+1/8*3+1/2*1+1/4*2這麼多的碼長。這個就是熵。假如答案全部是A,或者裡面答案只有1個A的時候,實際上我們就不需要傳送那麼多碼長了,直接傳送A的編號,或者不發,因為我們已經知道答案就是A了。所以這個系統裡面答案越純,傳送的資訊越少。而裡面答案越多,越沒有規律可循,我們就需要用越大的資訊來發送。所以我們就用熵的概念來表示決策樹分類的子集的純度。對於純度來說,純度的pi代表標籤值在這個系統裡的佔比,純度越純代表熵越低,我們用資訊熵來評估純度,它其實思路和基尼係數一樣,基尼係數越低越純,熵也是,越低越純。

瞭解完熵的概念,我們再說下資訊增益:分裂前的資訊熵 減分裂後的資訊熵。它一樣也需要在前面加一個權重。

                                              IG= H(D)- H(D1)*|D1|/|D|- H(D2)*|D2|/|D|。
假如如下資料:

 

分裂之前的熵是H(D)=-log2(0.2)-log2(0.8)。分裂之後的熵是H(D1)=-log2(0.3)-log2(0.7)和H(D1)=-log2(0.5)-log2(0.5).那麼資訊增益IG=H(D)-(D1/D*H(D1)+D2/D*H(D2))=H(D)-(100/1000*H(D1)+900/1000*H(D2))。如果不乘以比重的話假如一個節點裡面就分了一個數據,另一個節點分了很多的資料。會導致一個加權的很高,一個加權的很低,很不合理。所以需要乘以各自資料所佔的比重。資訊增益是正數還是負數呢?我們來推測下,熵是越分越低好,還是越分越高好,肯定是越分越低好,越低代表越純。也就是說原先系統比較混亂,越分後面越清楚,越純,所以我們一開始的熵是比較高的,後面越來越低,而資訊增益是拿之前的熵減去之後的熵,所以肯定是個正數。這個正數越大越好,因為越大代表這次分裂使系統的混亂程度降低的越多。

我們來看一個實際應用資訊增益解決生活中的一個案例:

以下是一個統計使用者流失度的一個數據,is_lost是它的標籤,第一列是使用者ID,第二列gender是性別,第三列act_info是活躍度,第四列is_lost是否流失。我們希望通過分析找到最能影響使用者流失的因素。

其中重點說下第三列,本身來說活躍度應該是個連續性資料,這裡做了一些處理。因為資訊增益天生對連續性資料支援的不是特別好。這裡連續性訓練集交給計算機的資料,一般是把同一個區間段的歸為一類,讓它變成離散型資料。比如身高是連續性資料,以10釐米一組的話,就會分成各個組,每組的資料再進行統計。我們在做其他演算法模型的時候有時候還會對處理完後的離散資料進行one-hot編碼,假如訓練集裡有四個城市,北京,上海,廣州,深圳,在統計上就是表中的某一列,要怎麼把它轉化成計算機資料?北京為1,廣州為2,上海為3,深圳為4,直觀的講難道深圳>北京,所以這樣的資料交給演算法是不合適的。所以這裡我們用one-hot編碼對資料進行處理,即把一個維度上的四個值拆成四列,is北京,is廣州,is上海,is深圳,這四列裡只會同時有一個為1,如果住在北京,那麼北京是1,其它為0。即把原本在一個維度上提取下來的資料,強制地拆成若干個列的這種方式叫做one-hot編碼,所謂one-hot,即獨熱編碼,就是這四項裡邊只有一個被點亮了。通常對於沒有大小順序的資料我們一定要使用one-hot編碼。本例中因為只是單純看下活躍度的資料情況各個佔比對總體使用者損失情況的影響,所以沒必要再轉成one-hot編碼。我們對上面的資料進行一個統計:

這裡面positive是沒有流失,對應數值1。negative是流失,對應數值是0。所以第二行的統計實際上就是在男性的前提下,positive為3,可以用條件概率表示成p(y=1|x=man)=3/8。我們看下上面兩個條件分裂下各自的資訊增益。

15個樣本,其中負例有10個,正例有5個。P1對應著10/15,P2對應著5/15,所以原始的整體熵H(D)。

                       

假設選擇男女作為分裂條件,則性別熵是:男是g1,女是g2。相當於分成兩個子樹。

                                                                       

                                                                     

則性別資訊增益:因為男性佔8/15,女性佔7/15,又乘以各自比例,所以:

                                                                    

同理計算活躍度的熵:相當於分成3個子樹。

                                                            則

活躍度資訊增益:

                                                            

很明顯活躍度的資訊增益比較大,說明熵減的厲害,也就是意味著活躍度對使用者流失的影響更大。

2-資訊增益率

假如不幸以這uid一列作為分裂條件去選擇了,我們的目標是選擇資訊增益最大的方式去分裂,什麼情況下資訊增益最大?當分了一個和使用者數量同樣多分枝的子節點,15個子節點的時候,此時資訊增益是最大的,因為所有葉子節點都最純了,只有一個數據,則每一個節點的熵都是-log2(1)=0,按照資訊增益的計算公式IG=E(s)-0=E(s),相當於沒減,那麼資訊增益肯定是最大的。但這樣會導致什麼問題呢,過擬合問題。對訓練集分的特別完美。為了去懲罰這種分裂方式,我們引入另一個計算純度的計算方式:資訊增益率。

計算公式為:資訊增益/類別本身的熵。

                                                    

既然是熵,公式形式就是- ∑Pi*log2Pi的形式,算熵就需要pi,要pi就需要把原來的資料分為幾堆。原來是靠yi=label來分堆的,那麼比如30,30,10,p1=3/10,p2=3/10,p3=0.1,來算節點內部的pi,而現在的pi是總的系統的pi,系統分成三份了,就有三類資料,此時的pi就是以節點的資料佔總的資料佔比為依據,而不是以看節點內y的label 標籤為依據。比如下圖:

 

我們計算這次分裂情況的類別本身的熵時應該把D1,D2,D3都考慮進去。D1個數佔總數為50/350,所以T1/T=-50/350,依次類推。所以SIS=-50/350*log250/350-100/350*log100/350-200/350*log200/350,為這次分裂情況下類別本身的熵。如果我們按照之前計算使用者留存的例子來說,按照序號來分的話,分成15個節點,此時的資訊增益非常非常大。但是分子SIS會變大還是小呢?我們可以直觀地感受下,此時分成的15個子節點,每一個子節點都只包含一個數據,而計算SIS的時候是考慮所有節點的,所以相當於把分成的15個節點看成一個整體,每一個子節點都是一個子集,此時這個系統裡面類別特別多,所以特別混亂,整體熵肯定越高。所以把這個數放在分母上,即便原先的資訊增益很大,但因為除了一個很大的分母,所以整體值也變小。所以我們要想使得資訊增益率大就需要分母越小,即系統本身的熵越小,說明分的節點不是那麼多,並且作為一個系統來說,相對類別純一點,沒有那麼多節點,整體系統熵就越低。分子越大,即資訊增益又很大,說明本次分類使系統混亂程度降低的越多。

所以資訊增益率能自動的幫我們選擇分幾支,用什麼條件分最好的問題,為什麼要引入資訊增益率呢?實際上背後是符合最大熵模型的。

我們總結下分類樹如何分裂?即遍歷所有可能的分裂方法。 可以使用3種方式判斷純度 即 Gini係數對應CART樹, 資訊增益 對應ID3樹, 資訊增益率對應 C4.5樹。

下一節我們講解另一種分裂方式,迴歸