C4.5(決策樹預測)算法

決策樹<Decision Tree>是一種預測模型,它由決策節點,分支和葉節點三個部分組成。決策節點表明一個樣本測試,一般表明待分類樣本的某個屬性,在該屬性上的不一樣測試結果表明一個分支;分支表示某個決策節點的不一樣取值。每一個葉節點表明一種可能的分類結果。算法

使用訓練集對決策樹算法進行訓練,獲得一個決策樹模型,利用模型對未知樣本(類別未知)的類別判斷時,從決策樹根節點開始,從上到下搜索,直到沿某分支到達葉節點,葉節點的類別標籤就是該未知樣本的類別。框架

網上有個例子能夠很形象的說明利用決策樹決策的過程(母親給女兒選對象的過程),以下圖所示:機器學習

 

      女兒:多大年紀了?
      母親:26。
   女兒:長的帥不帥?
   母親:挺帥的。
   女兒:收入高不?
   母親:不算很高,中等狀況。
   女兒:是公務員不?
   母親:是,在稅務局上班呢。
   女兒:那好,我去見見。學習

再看一個例子:數據集以下圖所示,共有14個樣本,每一個樣本有4個屬性,分別表示天氣,溫度,溼度,是否颳風。最後一列表明分類結果,能夠理解爲是否適合出去郊遊(play)。測試

下面是利用上面樣本構建的決策樹:ui

根據構建的模型,當再來一個樣本<outlook = rainy, temperature = cool,humidity = normal windy = true>那麼咱們就能夠從根節點開始向下搜索最後獲得:no play。編碼

仔細思考下,這有點相似FP-Tree算法中的構造樹過程,可是毫不同樣。事實上,相同的數據集,咱們能夠構建不少棵決策樹,也不必定以outlook 做爲根節點。FP-Tree只是單純將全部樣本信息存儲到一個樹上,而決策樹顯然有一個選取節點屬性進行分類的過程。spa

那麼問題來了?該如何選取屬性做爲分類屬性,將樣本分爲更小的子集?何時結束終止決策樹的增加,使構建的決策樹既對訓練樣本準確分類,並且對於未知樣本(測試樣本)也可以準確預測,可能的策略是全部的樣本都屬於同一類別或全部樣本屬性值都相等。.net

不一樣的決策樹算法採用的策略不一樣,下面主要介紹C4.5 算法,主要學習C4.5選取節點劃分子集的策略。orm

C4.5算法是由澳大利亞悉尼大學Ross Quinlan教授在1993年基於ID3算法的改進提出的,它可以處理連續型屬性或離散型屬性的數據;可以處理具備缺失值的屬性數據;使用信息增益率而不是信息增益做爲決策樹的屬性選擇標準;對生成枝剪枝,下降過擬合。

以下爲決策樹算法框架:

[cpp] view plain copy

  1. TreeGrowth(E, F)//E--訓練集  F—屬性集  
  2.    if stopping_cond(E, F) = true then     //達到中止分裂條件(子集全部樣本同爲一類或其餘)  
  3.       leaf = createNode()                 //構建葉子結點  
  4.       leaf.label = Classify(E)            //葉子結點類別標籤  
  5.       return leaf  
  6.    else<span style="white-space:pre">                   
  7.       root = createNode()<span style="white-space:pre">       //建立結點  
  8.       root.test_cond = find_best_split(E, F)    肯定選擇哪一個屬性做爲劃分更小子集//  
  9.       令 V = {v | v是root.test_cond 的一個可能的輸出}  
  10.       for each v  V do  
  11.          Ev = {e | root.test_cond(e)  = v and e  E}  
  12.          child = TreeGrowth(Ev, F)  
  13.          //添加child爲root的子節點,並將邊(root——>child)標記爲v  
  14.        end for  
  15.    end if  
  16.    return root  


 

 

主要過程:首先用根節點表明一個給定的數據集;而後從根節點開始(包括根節點)在每一個節點上選擇一個屬性,使結點數據集劃分(一棵樹分裂爲幾棵樹)爲更小的子集(子樹);直到使用某個屬性,其子集中全部樣本都屬於一個類別,才中止分裂。

 

而其中節點如何選擇屬性,正是C4.5要作的。

前面已經提到過:C4.5 使用信息增益率而不是信息增益做爲決策樹的屬性選擇標準。下面從熵開始逐步解釋:

 

熵:信息論中對熵的解釋,熵肯定了要編碼集合S中任意成員的分類所須要的最少二進制位數     

pi 爲集合S中第i類所佔的比例。(具體舉例見後面實例)

理解」最少」:

1. 對於2分類問題,用一個二進制位1和0描述足以分類;對於4分類問題,至少須要用兩個二進制位描述00 01 10 11;c分類 log2(c)

2. 對於分類問題,還要考慮類的比例(樣本不平衡問題),m+n個樣本其中m個樣本分類表示的二進制位數和n個樣本表示的二進制位數不相同,全部熵的定義還存在着一種加權平均的思想。

簡單來講,它刻畫了任意樣本集的純度,越純,熵越小。

換句話說,「變量的不肯定性越大,熵就越大,一個系統越是有序,信息熵就越低(百度百科) 

對於二分類問題,熵在[0,1]之間,若是全部樣本都屬於同一類,熵爲0,這個時候給定一個樣本,類別就是肯定的。若是不一樣的樣本各佔一半,熵爲1=1/2+1/2,這個時候若是給定一個樣原本分類,就徹底沒法肯定了,就好像咱們拋硬幣徹底沒法預測它是正面仍是反面朝上同樣。

對於c分類問題,熵在[0 log2(c)]之間。

C4.5中用到的幾個公式:

1 訓練集的信息熵

 

其中 m表明分類數,pi爲數據集中每一個類別所佔樣本總數的比例。

劃分信息熵----假設選擇屬性A劃分數據集S,計算屬性A對集合S的劃分信息熵值

case 1:A爲離散類型,有k個不一樣取值,根據屬性的k個不一樣取值將S劃分爲k各子集{s1 s2 ...sk},則屬性A劃分S的劃分信息熵爲:(其中 |Si|   |S| 表示包含的樣本個數)

  

case 2: A爲連續型數據,則按屬性A的取值遞增排序,將每對相鄰值的中點看做可能的分裂點,對每一個可能的分裂點,計算:

 

其中,SLSR分別對應於該分裂點劃分的左右兩部分子集,選擇EntropyA(S)值最小的分裂點做爲屬性A的最佳分裂點,並以該最佳分裂點按屬性A對集合S的劃分熵值做爲屬性A劃分S的熵值。

3 信息增益 

按屬性A劃分數據集S的信息增益Gain(S,A)爲樣本集S的熵減去按屬性A劃分S後的樣本子集的熵,即

分裂信息

利用引入屬性的分裂信息來調節信息增益

5 信息增益率

 

信息增益率將分裂信息做爲分母,屬性取值數目越大,分裂信息值越大,從而部分抵消了屬性取值數目所帶來的影響。

相比ID3直接使用信息熵的增益選取最佳屬性,避免因某屬性有較多分類取值於是有較大的信息熵,從而更容易被選中做爲劃分屬性的狀況。

公式略多,看得眼花繚亂,其實就是爲了獲得信息增益率。

下面以博客開始介紹的天氣數據集爲例,進行屬性選取。

具體過程如圖所示:

 

 

根節點選取outlook屬性後就獲得以下劃分:

遞歸進行如上過程,就獲得了博客開頭的決策樹。

本文引用了部分《數據挖掘與機器學習WEKA應用技術與實踐》中的內容,並修改了原書中決策樹計算錯誤之處,書中outlook的信息增益率爲0.44是錯誤的。 

相關文章
相關標籤/搜索