決策樹<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
主要過程:首先用根節點表明一個給定的數據集;而後從根節點開始(包括根節點)在每一個節點上選擇一個屬性,使結點數據集劃分(一棵樹分裂爲幾棵樹)爲更小的子集(子樹);直到使用某個屬性,其子集中全部樣本都屬於一個類別,才中止分裂。
而其中節點如何選擇屬性,正是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爲數據集中每一個類別所佔樣本總數的比例。
2 劃分信息熵----假設選擇屬性A劃分數據集S,計算屬性A對集合S的劃分信息熵值
case 1:A爲離散類型,有k個不一樣取值,根據屬性的k個不一樣取值將S劃分爲k各子集{s1 s2 ...sk},則屬性A劃分S的劃分信息熵爲:(其中 |Si| |S| 表示包含的樣本個數)
case 2: A爲連續型數據,則按屬性A的取值遞增排序,將每對相鄰值的中點看做可能的分裂點,對每一個可能的分裂點,計算:
其中,SL和SR分別對應於該分裂點劃分的左右兩部分子集,選擇EntropyA(S)值最小的分裂點做爲屬性A的最佳分裂點,並以該最佳分裂點按屬性A對集合S的劃分熵值做爲屬性A劃分S的熵值。
3 信息增益
按屬性A劃分數據集S的信息增益Gain(S,A)爲樣本集S的熵減去按屬性A劃分S後的樣本子集的熵,即
4 分裂信息
利用引入屬性的分裂信息來調節信息增益
5 信息增益率
信息增益率將分裂信息做爲分母,屬性取值數目越大,分裂信息值越大,從而部分抵消了屬性取值數目所帶來的影響。
相比ID3直接使用信息熵的增益選取最佳屬性,避免因某屬性有較多分類取值於是有較大的信息熵,從而更容易被選中做爲劃分屬性的狀況。
公式略多,看得眼花繚亂,其實就是爲了獲得信息增益率。
下面以博客開始介紹的天氣數據集爲例,進行屬性選取。
具體過程如圖所示:
根節點選取outlook屬性後就獲得以下劃分:
遞歸進行如上過程,就獲得了博客開頭的決策樹。
本文引用了部分《數據挖掘與機器學習WEKA應用技術與實踐》中的內容,並修改了原書中決策樹計算錯誤之處,書中outlook的信息增益率爲0.44是錯誤的。