決策樹、ID3算法、C4.5算法、CART算法:原理,案例和代碼

目錄

1.引言

2.決策樹

2.1 決策樹與if-then規則

2.2 決策樹與條件概率分佈

2.3 決策樹學習

3.特徵選擇

4.決策樹生成

4.1 ID3生成算法

4.2 C4.5生成算法

5.決策樹剪枝

5.1剪枝算法

6.CART算法

6.1 CART迴歸樹生成樹

6.2 最小二乘法迴歸樹

6.3 CART分類樹生成

6.3.1 基尼指數

6.3.2 CART分類樹生成

6.3.3 CART剪枝

6.3.4 CART剪枝流程

7.代碼實現



1.引言

決策樹(decision tree)是一種分類與迴歸的方法,顧名思義,決策樹呈樹形結構,可以認爲是if-then規則的集合,也可以認爲是特徵空間與類空間上的條件概率分佈。

主要的優點:分類速度快、可讀性強。

決策樹學習通常有三個步驟:特徵選擇決策樹生成決策樹修剪

常用的決策樹算法有:ID3算法、C4.5算法和CART算法,其中CART更是被廣泛應用。

 

2.決策樹

定義:分類決策樹模型是一種描述對實例進行分類的屬性結構。決策樹由結點和向邊組成。結點有兩種類型:內部結點和葉結點。內部結點表示一個特徵或者屬性,葉結點表示一個類。

例如上圖,圓形是內部結點,表示特徵和屬性,矩形表示葉子結點,表示一個類。訓練的時候,按照訓練數據集的屬性和類,逐漸構建一個樹,分類的時候,從根結點按照遞歸的方法對內部結點的屬性進行測試和匹配,直到到達葉結點。

2.1 決策樹與if-then規則

可以認爲決策樹是if-then規則的集合,其中內部結點之間連城的通路,構建成一條規則。路徑上的點是規則的條件,葉子結點則是規則的結論。每一個實例都被一條路徑或者一條規則覆蓋,而且只被一條路徑或規則覆蓋。

2.2 決策樹與條件概率分佈

決策樹還可以認爲是特徵條件下類的條件概率分佈。將特徵空間劃分爲互不相交的單元或區域,並在每個單元定義一個類的概率分佈。而決策樹的一條路徑就是一個單元,因此可以認爲決策樹是給定條件下類的概率分佈的集合。

2.3 決策樹學習

給定訓練集D=(x_1,y_1),(x_2,y_2),...,(x_N,y_N),其中x_i=x^1_i,x^2_i,...,x^n_i,n是特徵個數;y\epsilon \{1,2,...,K\}是類的標記。

決策樹的目的就是根據訓練數據集構建一個決策樹模型,使它能夠對實例進行正確分類。

所以決策樹的本質就是從訓練數據中歸納出一組分類規則,這樣決策樹可能有很多個,也可能一個沒有。但是我們需要的是一個與訓練數據矛盾較小的決策樹,又要具有很好的泛化能力,不僅對訓練數據有很好的擬合,對未知數據又有很好的預測

決策樹學習使用損失函數作爲自己的目標函數,學習的策略就是最小化損失函數。決策樹學習的算法通常是一個遞歸選擇最優特徵的方法,根據特徵對訓練數據進行分割,使各個子數據有一個最好的分類過程。這一個過程也是對特徵空間的劃分,也對應着決策樹的構建。從根結點開始,選擇特徵作爲自己的內部結點,遞歸構建,直到每個子集都被分到葉子結點上(即都有明確的分類),這就完成類決策樹的構建。

 

3.特徵選擇

在構建決策樹的時候,可以構建許多決策樹,哪種決策樹纔是最有效的決策樹?在開始構建的時候就考慮這個問題。要想構建一個高效的決策樹,一般(CART除外)需要遵守信息增益信息增益比的規則(點此查看信息熵、信息增益、信息增益比原理)。一般我們選擇信息增益或信息增益比最大的特徵作爲當前的特徵。信息增益體現出了特徵與類的關聯程度,即特徵對類的不確定度的影響程度,信息增益比則是對這種程度的修正,避免決策樹偏向選擇取值較多的特徵。

舉一個例子:下表是貸款申請情況表,最後一列給出類是否給予貸款。

我們要從這表中構建一個決策樹,怎樣選擇特徵作爲節點呢?

所以需要計算類的信息熵、特徵與類的信息增益、信息增益比。

如下圖,通過計算得到房子的信息增益最大(0.420),要是以信息增益爲特徵條件,那麼構建決策樹的第一個節點(根結點)應該是“房子”這個特徵。(此處有詳細的計算過程:信息熵、信息增益、信息增益比原理

如下圖,計算得到信息增益比,同樣特徵“房子”的信息增益比最大(0.4325),當以信息增益比爲選擇條件的時候,特徵“房子”應該作爲第一個節點(根結點)

 

4.決策樹生成

4.1 ID3生成算法

ID3算法的核心就是在決策樹各個節點上使用信息增益作爲選擇特徵的準則,使用遞歸方法構建決策樹。

輸入:訓練數據集D,特徵集A和閾值\varepsilon

輸出:決策樹T

  1. 若D中所有實例屬於同一類C_k,則T爲單結點樹,並將類C_k作爲該結點的類標記,返回T;
  2. A=\phi,則T爲單結點樹,將D中實例樹最大的類C_k作爲該結點的類標記,返回T;
  3. 否則信息增益算法計算A中各特徵對D的信息增益,選擇信息增益最大的特徵A_g
  4. 如果A_g的信息增益小於閾值\varepsilon,則置T爲單結點樹,並將D中實例數最大的類C_k作爲該結點的類標記,返回T;
  5. 否則,對A_g的每一個可能的值a_i,依照A_g=a_i將D分割爲若干個非空子集D_i,將D_i中實例樹最大的類作爲標記,構建子節點,由結點及其子節點構成樹T,返回T;
  6. 對第i個子節點,以D_i爲訓練集,以A-\{A_g\}爲新的特徵集,遞歸調用1~5,得到樹T,返回T。

以上一個案例爲爲例:

A_1作爲特徵“年齡”,A_2作爲特徵“工作”,A_3作爲特徵“房子”,A_4作爲特徵“信貸”。在上一步的計算中,可以知道特徵A_3的信息增益最大,所以選擇A_3作爲根結點的特徵。它把數據集劃分爲兩個子集D_1A_3取是)和D_2A_3取否)。由於D_1只有同一類的樣本點,所以D_1單獨成爲一個葉子結點,結果類標記“是”。

則下面對D_2從特徵A_1A_2A_4中選擇新的特徵,計算各個特徵的信息增益:

從上圖,可以看到A_2信息增益最大,因此A_2作爲新的內部結點。

A_2引出兩個節點,即將數據集D_2劃分成兩個D_3A_2取是)和D_4A_2取否)。由於D_3內的類屬於同一類,且類標記爲“是”,故此數據集爲葉子結點,且標記爲“是”;D_4內的類也是屬於同一類,故此數據集爲葉子結點,且類標記爲“否”。這樣就生成了一個決策樹(下圖),僅僅使用了兩個特徵,使決策樹更加高效。

 

4.2 C4.5生成算法

ID3算法生成樹有一個缺點,就是容易過擬合。爲此C4.5算法對ID3算法進行改進,使用信息增益比作爲選擇特徵的條件

輸入:訓練數據集D,特徵集A和閾值\varepsilon

輸出:決策樹T

  1. 若D中所有實例屬於同一類C_k,則T爲單結點樹,並將類C_k作爲該結點的類標記,返回T;
  2. A=\phi,則T爲單結點樹,將D中實例樹最大的類C_k作爲該結點的類標記,返回T;
  3. 否則信息增益算法計算A中各特徵對D的信息增益比,選擇信息增益比最大的特徵A_g
  4. 如果A_g的信息增益小於閾值\varepsilon,則置T爲單結點樹,並將D中實例數最大的類C_k作爲該結點的類標記,返回T;
  5. 否則,對A_g的每一個可能的值a_i,依照A_g=a_i將D分割爲若干個非空子集D_i,將D_i中實例樹最大的類作爲標記,構建子節點,由結點及其子節點構成樹T,返回T;
  6. 對第i個子節點,以D_i爲訓練集,以A-\{A_g\}爲新的特徵集,遞歸調用1~5,得到樹T,返回T。

以上一個爲例,計算信息增益比:

A_1作爲特徵“年齡”,A_2作爲特徵“工作”,A_3作爲特徵“房子”,A_4作爲特徵“信貸”。如下圖,可以知道A_3的信息增益比最大,因此選擇A_3作爲根結點。它把數據集劃分爲兩個子集D_1A_3取是)和D_2A_3取否)。由於D_1只有同一類的樣本點,所以D_1單獨成爲一個葉子結點,結果類標記“是”。

則下面對D_2從特徵A_1A_2A_4中選擇新的特徵,計算各個特徵的增益比:

從上圖,可以看到A_2信息增益比最大,因此A_2作爲新的內部結點。

A_2引出兩個節點,即將數據集D_2劃分成兩個D_3A_2取是)和D_4A_2取否),由於D_3內的類屬於同一類,且類標記爲“是”,故此數據集爲葉子結點,且標記爲“是”;D_4內的類也是屬於同一類,故此數據集爲葉子結點,且類標記爲“否”。

這樣就生成了一個決策樹,在這個案例中,C4.5和ID3生成的決策樹是一樣的,但是規則上有細微的區別——特徵條件不同。

 

5.決策樹剪枝

ID3和C4.5算通過遞歸產生決策樹,直到不能繼續。這樣產生的樹往往對訓練數據分類很準確,但是對未知的測試數據的分類卻沒有那麼準確——過擬合。因此需要通過剪枝,對已經生成的樹進行簡化,增加決策樹的魯棒性

顧名思義,剪枝,就是裁掉一些已經生成的子樹或者葉子結點,將其父結點或者根結點作爲新的葉結點,從而簡化了分類樹模型。

決策樹剪枝通過極小化整體損失函數或代價函數實現。

設樹T的葉結點個數爲|T|,t是樹T的葉結點,該結點有N_t個樣本點,其中k類的樣本點有N_t_k個,H_t(T)爲葉結點t上的經驗熵,\alpha \geq 0是參數。則決策樹學習的損失函數爲:

C_\alpha (T)=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha |T|

其中經驗熵爲:H_t(T)=-\sum_{k} \frac{N_t_k}{N_t}log\frac{N_t_k}{N_t}

將損失函數的右邊第一項記做C(T)=\sum_{t=1}^{|T|}N_tH_t(T),這是損失函數變成C_\alpha =C(T)+\alpha |T|

\alpha較大時,最優樹偏小;

\alpha較小的時候,最優樹偏大;

\alpha\n \to \infty,根結點組成的單結點最優;

\alpha=0,整個樹是最優的。

決策樹的生成只考慮了通過提高信息增益或信息增益比來訓練數據,這樣使模型對訓練數據有很好的擬合效果,對未知數據的分類效果不是十分好。剪枝,通過優化損失函數,減小模型複雜度,學習整體最好表現。

剪枝,就是當\alpha確定時,選擇損失函數最小的模型,即損失函數最小的子樹。

5.1剪枝算法

輸入:生成算法產生的決策樹T,參數\alpha

輸出:修剪後的子樹T_\alpha

  1. 計算每個節點的經驗熵
  2. 遞歸地從樹的葉結點向上回溯。設一組葉結點回到其父結點,之前之後整體樹分別爲T_BT_A,對應的損失函數分別是C_\alpha (T_B)C_\alpha (T_A),如果:C_\alpha (T_A)\leq C_\alpha (T_B),則進行剪枝,將父結點變爲新的葉結點。
  3. 返回2,直到不能繼續剪枝爲止,得到損失函數最小的子樹T_\alpha

決策樹的剪枝是在局部進行的,所以決策樹剪枝可以由動態規劃算法實現

 

6.CART算法

CART(classififcation and regression trees)是一種既可以分類(離散)也可以迴歸(連續)的決策樹。CART只假設決策樹是二叉樹,因此CART最終生成的樹形結構是二叉樹。

6.1 CART迴歸樹生成樹

假設X與Y是輸入和輸出變量,並且Y是連續的,給定訓練數據集D=\{(x_1,y-1),(x_2,y_2),...(x_N,y_N)\}。將輸入控件劃分爲M個單元,於是迴歸樹模型可以表示爲:

f(x)= \sum_{m=1}^{M}c_mI

當輸入空間事先知道時,使用平方誤差\sum_{x_i}(y_i-f(x_i)^2)作爲迴歸樹的預測誤差。

採用啓發式方法,選擇第j個變量x^j作爲分類點,取他的值s,把輸入數據切分成兩部分R_1(輸入小於s)和R_2(輸入大於s)

然後尋找最優切分變量j和最優切分點s即可。

6.2 最小二乘法迴歸樹

按照6.1方法生成的迴歸樹就是最小二乘迴歸樹(二叉樹)。

輸入:訓練數據集D

輸出:迴歸樹f(x)

  1. 選擇最優切分變量j和切分點s,求解損失min_j_s[min_c_1\sum_{x_i}(y_i-c_1)^2+min_c_2\sum_{x_i}(y_i-c_2)^2],找到損失最小的j和切分點s
  2. 用選定的(j,s)劃分區域R_1(輸入小於s)和R_2(輸入大於s),並決定輸出值c_m=\frac{1}{N_m}\sum_{x_i}y_i
  3. 繼續對兩個區域調用步驟1和2,直到滿足停止條件。
  4. 將輸入空間劃分爲M個子區域R_1,R_2,...,R_M,生成決策樹:f(X)=\sum_{m=1}^{M}c_mI

繼續以上一個案例爲例,如何使用最小二乘迴歸樹來構建決策樹。

首先是挨個特徵計算,找到損失函數最小的特徵。從第一輪結果中可知道A_3的損失最小(3),因此選擇“房子”作爲根結點,將數據劃分成兩部分。左邊是D_1,由於D_1中的數據全爲一類,因此D_1爲一個葉結點。右邊是D_2,對其內的特徵繼續計算損失函數,即第二輪計算。

從結果中可以看到,A_2的損失值爲0,因此可以直接停止後續計算,確定“工作”爲新的節點。將數據分成兩部分:D_3D_4。其中D_3數據爲一類,所以D_3是葉子結點。同理D_4也是葉子結點。這就生成了一個歸回二叉決策樹。

 

6.3 CART分類樹生成

分類樹是使用基尼指數作爲特徵選擇,同時決定這個特徵的最優二值切分點(生成的同樣是二叉樹)。

6.3.1 基尼指數

設有K個分類,樣本屬於第k類的概率是p_k

  • 概率分佈的基尼指數定義爲:Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=\sum_{k=1}^{K}p_k^2
  • 二分類問題,屬於1的概率是p,基尼指數爲:Gini(p)=2p(1-p)
  • 集合問題,C_k是集合D的第k類樣本子集,K是類的個數,基尼指數爲:Gini(p)=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2。如果集合D被特徵A分割成兩部分D_1D_2。在特徵A的條件下,D的基尼指數爲:Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)

基尼指數和信息增益、信息增益比一樣,都近似代表分類誤差率。

6.3.2 CART分類樹生成

輸入:訓練數據集D

輸出:CART決策樹

從根結點開始,遞歸地對每個結點進行一下操作,構建二叉樹:

  1. 設結點的訓練數據集爲D,計算現有特徵A對D的基尼指數;
  2. 選擇基尼指數最小的特徵及其對應點,將數據集分成兩部分,分配到兩個子節點中。
  3. 對兩個子節點遞歸調用1和2,直到滿足停止條件(節點中樣本個數小於預定閾值或基尼指數小於預定閾值)。
  4. 生成CART決策樹

同樣以上一個案例爲例,如何使用CART算法生成決策樹

首先是挨個特徵計算,計算基尼指數。從第一輪結果中可知道A_3的基尼指數最小(0.27),因此選擇“房子”作爲根結點,將數據劃分成兩部分。左邊是D_1,由於D_1中的數據全爲一類,因此D_1爲一個葉結點。右邊是D_2,對其內的特徵繼續計算新的基尼指數,即第二輪計算。

從結果中可以看到,A_2的基尼指數爲0,確定“工作”爲新的節點。將數據分成兩部分:D_3D_4。其中D_3數據爲一類,所以D_3是葉子結點。同理D_4也是葉子結點。這就生成了一個歸回二叉決策樹。

 

6.3.3 CART剪枝

從生成的決策樹底部開始,剪去一些子樹,使決策樹變小,從而能夠對未知數據有更準確的預測。

剪枝的步驟就是先在已經生成決策樹T_0底端不斷剪枝,直到T_0的根結點,形成一個子樹序列\{T_0,T_1,T_2,...,T_n\};然後通過交叉驗證法在獨立的驗證數據集上對子樹序列進行預測,從中選擇最優子樹

在剪枝的過程中計算子樹的損失函數:C_\alpha (T)=C(T)+\alpha |T|,其中C(T)是對訓練數據的預測誤差,|T|是子樹的葉子結點個數,C_\alpha是參數爲\alpha時的子樹T的整體損失。

T_0時,任意內部結點t,以t爲單結點樹的損失函數是:C_\alpha =C(t)+\alpha

T_0時,任意內部結點t,以t爲根結點的子樹損失函數是:C_\alpha(T_t) =C(T_t)+\alpha|T_t|

\alpha =0\alpha很小的時候,有:C_\alpha (T_t)< C_\alpha (t)

\alpha逐漸增大,在一個值的時候有:C_\alpha (T_t)= C_\alpha (t)

所以,只要g(t) =\frac{C(t)-C(T_t)}{|T_t|-1}T_t和t就有相同的損失函數,t是單結點,T_t是子樹,因此剪枝,保留t更好。將T_0剪枝後得到T_1,同時將g(t)設爲\alpha_1,那麼T_1爲區間[\alpha _1,\alpha _2)的最優子樹。如此一直剪下去,直到根結點。

剪枝得到子樹序列\{T_0,T_1,T_2,...,T_n\},利用獨立驗證的數據集測試子樹序列中各個子樹的平方誤差或者基尼指數。在子樹序列中,一個子樹對應一個\alpha _i,選擇損失最小的子樹作爲最終的剪枝結果,得到最優化決策樹T_\alpha

6.3.4 CART剪枝流程

輸入:CART迴歸生成樹T_0

輸出:最優決策樹T_\alpha

  1. k=0,T=T_0
  2. \alpha =+\infty
  3. 自下而上地對各個內部結點t計算C(T_t)|T_t|以及g(t)=\frac{C(t)-C(T_t)}{|T_t|-1}\alpha =min(\alpha,g(t))。其中T_t表示以t爲根結點的子樹,C(T_T)是對訓練數據的預測誤差,|T_t|T_t的葉結點個數。
  4. g(t)=\alpha的內部結點t進行剪枝,並對葉結點t以多數表決法(投票)決定其類,得到樹T。
  5. k=k+1,\alpha _k\alpha ,T_k=T
  6. 如果T_k不是由根結點以及兩個葉結點構成的數,則返回到步驟2;否則令T_k=T_n
  7. 採用交叉驗證法在子樹序列\{T_0,T_1,T_2,...,T_n\}中選擇最優的子樹T_\alpha

 

7.代碼實現

關於案例的ID3算法和C4.5算的代碼實現,見信息熵、信息增益、信息增益比原理

 

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