【機器學習】分類算法–決策樹(ID3/C4.5/CART)

前言

決策樹,是工業界常用的數據挖掘模型。其原理是根據一個或多個特徵的劃分來確定分類,易於理解。和K鄰近算法一樣,決策樹是屬於分類、有監督的算法

決策樹常用的有ID3算法、C4.5算法和CART算法。ID3算法和C4.5算法都是分類算法,CART算法是迴歸算法。

我們今天通過一個天氣-活動預測的數據來了解這三個算法

上述數據集有4個屬性,屬性集合A={ 天氣,溫度,溼度,風速}, 類別標籤有2個,類別集合L={進行,取消}


正文

本文要介紹的三種算法在特徵選擇的方法上存在差異:ID3用信息增益,C4.5用信息增益率,CART用Gini係數。下面先講講理論概念,只要掌握了這幾個知識點,那麼決策樹的問題你就懂了一大半了

 

公式及原理

信息熵

Entropy(S) = -\sum_{i=1}^{m}p\left ( u_i \right )log_2p\left ( u_i \right )   ,  p\left ( u_i \right )=\frac{|u_i| }{|S|}

p\left ( u_i \right )表示類別u_i在樣本S中出現的概率,Entropy(S) 計算的是所有樣本的信息熵。

案例中樣本S及每個屬性的信息熵計算過程如下:

Entropy(S) = -(9/14 * log2(9/14) + 5/14 * log2(5/14)) = 0.940

Entropy(“天氣”) = -(5/14 * [3/5 * log2(3/5) +2/5 * log2(2/5)] + 4/14 * [4/4 log2(4/4)] + 5/14 * [3/5 * log2(3/5) +2/5 * log2(2/5)]) = 0.694

Entropy(“溫度”) = -(4/14 * [3/4 * log2(3/4) +1/4 * log2(1/4)] + 6/14 * [4/6 log2(4/6)+2/6 * log2(2/6)] + 4/14 * [2/4 * log2(2/4) +2/4 * log2(2/4)]) = 0.911

Entropy(“溼度”) = -(7/14 * [3/7 * log2(3/7) +4/7 * log2(4/7)] + 7/14 * [6/7 log2(6/7)+1/7 * log2(1/7)]) = 0.789

Entropy(“風速”) = -(6/14 * [3/6 * log2(3/6) +3/6 * log2(3/6)] + 8/14 * [6/8 log2(6/8)+2/8 * log2(2/8)]) = 0.892

 

信息增益

infoGain\left ( S, A \right )=Entropy\left ( S \right )-\sum _{V\in Value\left ( A \right )}\frac{\left | S_V \right |}{\left | S \right |}Entropy\left ( S_V \right )

其中,A表示樣本的屬性,Value\left ( A \right )是屬性A所有的取值集合。VA的其中一個屬性值,S_{V}SA的值爲V的樣例集合。

簡而言之,求和公式裏表示的就是屬性A(也可以說A特徵)的信息熵。

從這個公式裏可以看出,Entropy(S)是在正負樣本確定的時候就變成定值了,唯一變化的就是後面求和公式的部分。

infoGain\left ( S, A \right ),它的值越大,說明分類效果越好,這就是我們選擇樹節點特徵的依據

案例中的信息增益計算過程:

infoGain( S, “天氣”) = Entropy(S) - Entropy(“天氣”) = 0.940 - 0.694 = 0.246

infoGain( S, “溫度”) = Entropy(S) - Entropy(“溫度”) = 0.940 - 0.911 = 0.029

infoGain( S, “溼度”) = Entropy(S) - Entropy(“溼度”) = 0.940 - 0.789 = 0.151

infoGain( S, “風速”) = Entropy(S) - Entropy(“風速”) = 0.940 - 0.892 = 0.048

如果這裏用的是ID3算法,那麼我們就可以選取“天氣”作爲第一個分裂屬性。

同樣,在確定第一個分裂屬性後,我們就可以繼續計算infoGain( S天氣晴, “溫度”)、infoGain( S天氣晴, “溼度”)、infoGain( S天氣晴, “風速”),爲天氣晴這個分支繼續找分裂屬性,直到某個分裂屬性的熵爲0(也可以說得到了最大的信息增益)。 

S天氣陰、S天氣雨也繼續找分裂屬性。這裏,我們就生成了一顆樹,我們把它稱之爲決策樹,採用信息增益來選擇特徵,這就是根據ID3算法生成的決策樹。

 

分裂信息

SplitInformation(S,A) = - \sum_{i=1}^{c} \frac{ | S_i | }{ | S | } \log_2 \frac{ | S_i | }{ | S | }

其中S1到Sc是c個值的屬性A分割S而形成的c個樣例子集。注意分裂信息實際上就是S關於屬性A的各值的熵。

SplitInfomation( S, “天氣”) =  -( 5/14 * log2(5/14)+ 4/14 *log2(4/14) + 5/14 * log2(5/14) ) = 1.577

SplitInfomation( S, “溫度”) =  -( 4/14 * log2(5/14)+ 6/14 *log2(4/14) + 4/14 * log2(5/14) ) = 1.556

SplitInfomation( S, “溼度”) =  -( 7/14 * log2(7/14)+ 7/14 * log2(7/14) ) = 1.0

SplitInfomation( S, “風速”) =  -( 6/14 * log2(6/14)+ 8/14 * log2(8/14) ) = 0.985

 

信息增益率

GainRation(S,A)=\frac{infoGain(S,A)}{SplitInformation(S,A)}

信息增益對屬性值種類較多的屬性比較偏好,爲了解決這一問題,提出了信息增益率。但信息增益率對可取值數目較少的屬性有所偏好,因此C4.5算法採用先從候選劃分屬性中找出信息增益高於平均水平的屬性,再從中選擇增益率最高的方法來選擇最優劃分屬性。

GainRation( S, “天氣”) = 0.246/ 1.577 = 0.155

GainRation( S, “溫度”) = 0.029/ 1.556 = 0.019

GainRation( S, “溼度”) = 0.151/ 1.0 = 0.151

GainRation( S, “風速”) = 0.048/ 0.985 = 0.048

可以發現,這裏採用C4.5算法,仍是選取“天氣”作爲第一個分裂屬性,最終得到一個由信息增益率選擇特徵得到的決策樹。

 

基尼係數

假設有數據集S,且S有K個分類,那麼可定義基尼指數爲:

Gini(S) = \sum_{i=1}^{K} p\left ( u_i \right )\left (\right 1- p\left ( u_i \right ))=1-\sum_{i=1}^{K}{p\left ( u_i \right )^{2}},  p\left ( u_i \right )=\frac{|u_i| }{|S|}

從公式可以看到,基尼指數的意義是:從數據集S中隨機抽取兩個樣本,其類別不同的概率。直覺地,基尼指數越小,則數據集S的純度越高。和信息增益不一樣,選擇特徵時信息增益值越大特徵越佳,而選擇Gini係數時,值越小的特徵越佳

相對於用信息增益/信息增益率來作爲決策指標,基尼指數的運算量比較小,也很易於理解,這是CART算法使用基尼指數的主要目的。

Gini( S, “天氣”) =  5/14 * [1 -  (3/5)^2 - (2/5)^2 ] + 4/14 * [1 - (4/4)^2 ] + 5/14 * [1 -  (3/5)^2 - (2/5)^2 ] = 0.343

Gini( S, “溫度”) =  4/14 * [1 -  (3/4)^2 - (1/4)^2 ] + 6/14 * [1 -  (4/6)^2 - (2/6)^2 ] + 4/14 * [1 -  (2/4)^2 - (2/4)^2 ] = 0.440

Gini( S, “溼度”) =  7/14 * [1- (3/7)^2 - (4/7)^2 ] + 7/14 * [1 - (6/7)^2 - (1/7)^2 ]  = 0.367

Gini( S, “風速”) =  6/14 * [1- (3/6)^2 - (3/6)^2 ] + 8/14 * [1- (6/8)^2 - (2/8)^2 ] = 0.455

這裏採用CART算法,仍然選取“天氣”作爲第一個分裂屬性,最終也能得到一個由Gini係數選擇特徵得到的決策樹。


小結

決策樹的優點是易於理解,對中間值的缺失不敏感,可以處理不相關特徵數據。缺點是可能會產生過度匹配(overfitting)問題。決策樹的過程包括生成和剪枝,剪枝和代碼部分,後面再繼續更新。

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