【4】決策樹

1.基本流程

1.1介紹

決策樹算法主要用來解決分類問題,但是也可以用來解決迴歸問題。
如圖,下面是一個西瓜分類的問題:
在這裏插入圖片描述
想象一下,整個算法由很多if else語句寫成,每一個if else判斷一下,根據不同的情況進入下一個if else。如此,直到最後能直到具體是哪個類別。

if 色澤 == '青綠':
     if 根蒂 == '蜷縮':
         if 敲聲 == '濁響':
             return 好瓜
         else:
             pass
     else:
         pass
 else:
     pass

# 每個pass裏可能又是另一組if else

一般而言,一棵決策樹有一個根結點,若干內部結點,若干葉子節點組成。葉子節點對應我們的決策,其他每個節點都是一個if else的判斷語句(屬性測試)。根節點對應的樣本集合是全部的樣本,往下逐漸細分,越來越細,直到最後到了葉子結點,就可以得出結論了。
比如:
在這裏插入圖片描述
根節點對應的是整個數據集D,往下分之後逐漸是D1,D2,類別。

1.2算法

在這裏插入圖片描述
首先我們需要根據所給的樣本來生成一個樹,這棵樹最好能夠實現決策的準確率最高。但是,建立這棵樹的過程我們會遇到很多問題:

  • 每次先選哪個特徵作爲當前的結點
  • 並非我們最後總能分到葉子節點時樣本全是一個類別,那怎麼辦。

針對這些問題,我們會提出不同的決策樹算法或者解決辦法。

首先先說一下如果葉子節點的樣本不是一類怎麼辦,這個很好解決,按照該葉子節點對應的樣本集合裏的數目最多的一類當作葉子節點對應的類別就行了。這種情況應該是很常見的,完美的數據集並不好找。

2.劃分選擇(每個結點如何選特徵)

在算法圖的8,從A中選擇最優劃分屬性a,好的劃分屬性的組合可能使我們的決策樹儘可能地簡單而且準確率還高。我們希望隨着劃分過程的進行,決策樹的分支節點所包含的樣本儘可能屬於一個類別,即越來越純,我們稱之爲節點的純度(purity)

2.1 信息增益(ID3算法)

信息熵(information entropy)是度量樣本純度最常用的一種指標。假定當前樣本集合D中第k類樣本所佔的比例位pk(k=1,2,···,|y|),則D的信息熵定義爲:
在這裏插入圖片描述
Ent的值越小,代表D的純度越高。
假定離散屬性a有V個可能的取值{a1,a2,···,aV},若使用a來對樣本集D進行劃分,則會產生V個分支結點。其中第v個分支節點所包含了D中所有在屬性a上取值av的樣本,記爲Dv,可以根據式(4.1)計算信息熵,再考慮到不同的分支節點所包含的樣本數不同,給分支節點賦予權重|Dv|/|D|。即樣本數目越多的分支節點影響越大,於是可以計算出用屬性a對樣本集D進行劃分所獲得的信息增益(information gain)
在這裏插入圖片描述
一般而言,信息增益越大,則意味着使用屬性a進行劃分所獲得的“純度提升”越大。因此,我們可以用信息增益來進行決策樹的劃分屬性選擇。即每次選擇使Gain最大的屬性即可。這就是ID3算法**所採用的方法。

2.2例子

在這裏插入圖片描述
針對上面的數據集,一共17個樣本,其中8個正樣本,9個負樣本,根據公式(4.1)可計算出根節點的信息熵爲:
在這裏插入圖片描述
接下來,我們通過計算每個屬性的信息增益,來選擇按照哪個屬性進行第一次劃分。
在這裏插入圖片描述
於是,可根據式(4.2)計算出“色澤”的信息增益爲:
在這裏插入圖片描述
類似的,我們可以計算出其他屬性的信息增益:
在這裏插入圖片描述
可以看出,屬性“紋理”的信息增益最大,於使就選擇它作爲劃分屬性:
在這裏插入圖片描述
之後,不斷重複上面的過程,直到到達葉子節點(沒有屬性可以選擇或者所有的樣本全部爲一個類)。

2.3 增益率(C4.5算法)

對於上面的表格的數據集,我們沒有考慮第一列編號,因爲它只是一個隨便的數字,對我們的決策沒有任何的啓發。但是,如果我們考慮編號呢。經過計算其信息增益爲0.998,遠大於其他屬性。很容易理解,因爲編號有17個取值,每個取值下只有一個樣本,純度已經最大了。但是,這樣的作法顯然沒有任何意義,不具有任何泛化能力。
實際上,信息增益準則對可取值數目較多的屬性有所偏好(取值越多,平均而言在這個取值下的樣本就越少,因爲被分的越細,這樣的純度肯定越高),爲了減少這種偏好可能帶來的不利影響,於是有了著名的C4.5算法[Quinlan,1993]。其不直接使用信息增益,而是使用“增益率”來劃分屬性,採用與式(4.2)相同的符號表示,增益率定義爲:
在這裏插入圖片描述
(式4.4)稱爲屬性a的固有值(intrinsic value)[Quinlan, 1993]。屬性a的可能取值數目越多(V越大),則IV的值通常會越大。例如,對錶4.1的西瓜數據集,有IV(觸感)=0.874(V=2),IV(色澤)=1.580(V=3),IV(編號)=4.088(V=17)。

需要注意的是,增益率準則對可取值數目較少的屬性有所偏好,因此,C4.5算法並不是直接選擇增益率最大的屬性,而是使用了一個啓發式:先從候選屬性中找出增益率高與平均水平的屬性,再從中選擇增益率最高的。

2.4 基尼指數(CART決策樹)

CART決策樹[Breiman et al, 1984]使用基尼指數(Gini index)來選擇劃分屬性,採用與式(4.1)相同的符號,數據集D的純度可用基尼指數來度量:
在這裏插入圖片描述
直觀的說,Gini(D)反映了從數據集D中隨機抽取兩個樣本,其類別標記不一致的概率,因此,Gini(D)越小,代表數據集D的純度越高。
採用與式(4.2)相同的符號表示,屬性a的基尼指數定義爲:
在這裏插入圖片描述
於是,我們在侯選屬性集合A中,選擇那個使劃分後基尼指數最小的屬性作爲最優化分屬性,即
在這裏插入圖片描述

2.5 損失函數

後來,也有人提出使用損失函數作爲選擇屬性的方法。類似於我們的搜索算法中的啓發式搜索。

我們需要的目的是:

  • 樹儘量簡單
  • 結點純度儘可能高

於是,我們可以定義兩個函數,一個用來估計樹的複雜度,一個用來估計節點的純度。之後相加,還按照之前決策樹選擇屬性的方法,計算每一個屬性可能帶來的的函數值,選擇其中最高的(假設值越高,代表樹越好)。

但是,這種做法並不常用,而且,用來衡量樹純度和樹複雜度的函數怎麼求也是一個問題。所以瞭解有這種方法即可。

3.剪枝處理

作爲決策樹,也有可能會過擬合,爲了應對決策樹的過擬合,就出現了剪枝。在決策樹中,爲了儘可能地正確分類樣本,結點劃分過程將會不斷重複,有時會造成決策樹分支過多,這時就有可能會造成過擬合。(可以簡單的理解爲分的太細了),爲了沒必要分那麼細,就刪除一些分枝來降低過擬合地風險。

決策樹剪枝有兩種基本策略:預剪枝(prepruning)後剪枝(post-pruning)[Quinlan, 1993]。預剪枝是在決策過程中,對每個結點在劃分前進行估計,若當前結點劃分之後不足以提升決策樹的泛化性能,就不劃分了,將當前節點標記爲葉子節點。後剪枝是先生成一棵完整的樹,然後自底向上對非葉子節點進行考察,若該節點對應的子樹替換爲葉子節點後能提高決策樹的泛化能力,就把該節點標記爲葉子節點。

問題來了,上面的兩種策略都需要有一個衡量決策樹泛化能力地指標,那麼這個指標怎麼找呢?這裏可使用第二章的性能評估方法,留一部分作爲驗證集,在上面進行一次測試,就可以直到是否有提升了。
我們還使用西瓜數據集作爲例子:
在這裏插入圖片描述
上面的數據集已經劃分爲兩部分了。我們使用信息增益準則來作爲劃分屬性的標準。生成的決策樹如下:
在這裏插入圖片描述

3.1 預剪枝

基於信息增益準則,我們首先會選擇屬性“臍部”來對數據集進行劃分,併產生3個分支,如圖4.6.然而,是否應該對這個屬性進行劃分呢?預剪枝要對劃分前後的泛化性能進行分析討論.
在這裏插入圖片描述
劃分之前,所有樣例集中在根節點,如果不劃分,根據算法(4.2)地第6行,該節點會被標記爲葉子節點,其類別標記爲其中數目最多的一類,假設我們將其標記爲好瓜(這樣意味着不管啥瓜,我們都將其視爲好瓜)。用表(4.2)的驗證集對這個單節點的決策樹進行評價,則編號{4,5,8}的樣例分類正確,另外四個分類錯誤,則驗證集準確率3/7 = 42.9%。
使用屬性“臍部”劃分之後,圖(4.6)的結點2,3,4分別包含編號爲{1,2,3,14},{6,
,15,17},{10,16}。因此這三個結點分別被標記爲好瓜,好瓜,壞瓜。此時,驗證集中有{4,5,8,11,12}分類正確,驗證集準確率爲5/7 = 71.4 > 42.9%,於是,臍部需要劃分。

如此重複,直到樹建立完成。(但是,你肯定會發現,每一次都要驗證,可能會造成計算成本比較大的問題)
實際的計算過程中,結點2,3都不足以使決策樹的泛化性能提升,結點4已經全部屬於一類,不需要再劃分。所以,決策樹就是圖4.6那樣,只有一個結點,卻比繼續劃分的泛化性能還要高。

預剪枝是基於貪心算法來進行的。

3.2 後剪枝

後剪枝需要先得到一棵樹,如圖(4.5),經過驗證,發現驗證集準確率只有42.9%。
後剪枝先考慮結點6,把這個結點變爲葉子節點,替換後的葉子節點包含樣本{7,15}。於是,該節點被標記爲好瓜,經過驗證,準確率達到57.1%。泛化性能得到提升。所以,結點6下面的就被剪了。
然後,考慮結點5,嚴重之後,發現準確率仍爲57.1%。所以,可以不剪。
對結點2,剪完之後準確率達到71.4%,所以,剪。對於結點3和1,經過計算,發現都不能提升,所以不剪。
最後,得到的決策樹如下:
在這裏插入圖片描述
最後,後剪枝得到的決策樹驗證集上準確率71.4%。

對比預剪枝和後剪枝的決策樹,會發現,後剪枝的決策樹保留的枝節更多。一般情況下,後剪枝決策樹的欠擬合風險更小,泛化性能往往優於預剪枝決策樹。但是,後剪枝需要先生成完整的決策樹,並且要自底向上進行考察,因此,訓練時間比未剪枝和預剪枝要大得多。

3.3 基於損失函數的剪枝

假設學習得到的學習樹爲TX,|TX|爲此樹的葉節點數,t是其中的一個葉節點,對應的樣本點數mt,其中k類的樣本點數爲mtk,k=1,2,—,K。

定義
經驗熵
在這裏插入圖片描述
損失函數
在這裏插入圖片描述

基於損失函數的剪枝算法就是:

輸入:生成算法產生的樹T,參數α;
輸出:修剪後的樹Tα
Step1:計算每個葉結點的經驗熵;
Step2:遞歸從葉節點向上回溯,設一組葉節點回溯到其父節點之前與之後的整體樹分別爲TB和TA,對應的損失函數有:Cα(TA)<=Cα(TB),則進行剪枝(即剪枝後的損失函數不變大的話就剪枝),將其父節點變爲新的葉節點。
Step3:返回Step2,直至不能繼續爲止,得到損失函數最小的樹Tα

4.連續和缺失值

4.1 連續值

上面我們介紹的都是離散取值的屬性,但是有時候可能會有連續取值的屬性,比如:價格,年齡等等。這種要是一個一個來分支,枝節肯定會非常多,甚至等於你的樣本數(也可以說無限),性能也不會好。所以,要怎麼處理連續性的屬性呢。

最簡單的就是使用二分法(bi-partition)對連續數據進行離散化,這正是C4.5算法採用的機制。也即選一個數值,將樣本分爲該屬性大於該值的和不大於該值的

給定樣本集D和連續屬性a,假定a在D上出現了n個不同的取值,將這些值從小到大排序,記爲{a^1……, a2,······,an},基於劃分點t可將D分爲子集D-t和D+t,分別代表取值不大於t的和大於t的。顯然,對相鄰的屬性取值ai與ai+1來說,t在區間[ai,ai+1)中取任意值所產生的劃分結果相同。因此,對連續屬性a,我們可考察包含n-1個元素的候選劃分點集合:
在這裏插入圖片描述
即把區間[ai,ai+1)的中位點作爲候選劃分點。然後,我們就可以像離散屬性值那樣處理連續屬性值了。
在這裏插入圖片描述
其中Gain(D)是樣本D基於劃分點t二分後的信息增益。於使,我們就可以選擇使Gain(D,a,t)最大化的劃分點。

4.2 例子

在這裏插入圖片描述
對於屬性“密度”,在決策樹學習開始時,根節點包含的17個訓練樣本在該屬性上的取值均不同。根據式(4.7)(取兩個點的中值),該屬性的候選劃分點集合包含16個候選值,T密度 = {0.244, 0.294, 0.351, 0.381, 0.420, 0.459, 0.518, 0.574, 0.600, 0.621, 0.636, 0.648, 0.661, 0.681, 0.708, 0.746}。由式(4.8)可計算出屬性密度的信息增益爲0.262,對應的劃分點爲0.381。
對於屬性“含糖量”,其候選劃分點集合也包含16個候選值:T含糖量 = {0.049, 0.074, 0.095, 0.101, 0.126, 0.155, 0.179, 0.204, 0.213, 0.226, 0.250, 0.265, 0.292, 0.344, 0.373, 0.418},類似的,根據式(4.8)可計算出信息增益爲0.349,對應劃分點0.126.

再由之前計算屬性的信息增益:
在這裏插入圖片描述
所以,“紋理”被選爲根節點劃分屬性。此後不斷重複,最終生成的樹如下圖:
在這裏插入圖片描述
注意: 和離散屬性不同,若當前節點劃分屬性爲連續屬性,該屬性還可作爲其後代結點的劃分屬性(繼續找一個劃分點,這個劃分點肯定和之前的不一樣,因爲之前的已經將樣本分爲大於和不大於了)

4.3 缺失值處理

在實際的工程或者比賽中,我們經常會遇到樣本有缺失值的情況,一般我們的做法是:對於缺失值超i過一定比例的屬性直接刪除,在一定範圍內的可以用不同的方法進行插補或者填充。這樣的做法在數據集量很大的時候並無不妥,但是,如果數據集本身較小,還要刪除這些值的話,可能造成剩下的沒多少了。

比如:
在這裏插入圖片描述
如果我們把有缺失值的樣本刪除,剩下的就只有{4,7,14,16}這四個樣本了。無疑是錯誤的。

所以我們需要解決兩個問題:

  • 如何在屬性值缺失的情況下進行劃分屬性選擇?
  • 給定劃分屬性,若樣本在該屬性值上的值缺失,如何對該樣本進行劃分?

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
C4.5算法使用了上述解決方案,下面以表4.4的數據來生成一顆決策樹。

也就是說,每次樣本權重更新爲:

  • 非缺失樣本:w不變
  • 缺失樣本:wnew = rv * wold

4.4 例子

學習開始時,根節點包含樣本集D全部17個樣例,各樣例的權值均爲1,以屬性“色澤”爲例,該屬性上無缺失值的樣例子集D拔包含編號爲{2,3,4,6,7,8,9,10,11,12,14,15,16,17}的14個樣例,顯然,D拔的信息熵爲:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
最後,“紋理”仍被選爲根節點的劃分屬性。按照 清晰,稍糊,模糊分別劃分爲{1,2,3,4,5,6,15},{7,9,13,14,17},{11,12,16}。且樣本在各子節點中的權重保持爲1.需注意的是,編號{8}在屬性紋理上缺失了,因此它將同時進入三個分支中,但是,權重在三個子結點中分別調整爲 7/15, 5/15,3/15.編號爲10的樣本有類似的劃分結果。

最終生成的決策樹如圖:
在這裏插入圖片描述

5.多變量決策樹

如果我們把每個屬性視爲座標空間的一個座標軸,則d個屬性描述的樣本就對應了d維空間中的一個數據點,對樣本分類就是意味着在這個座標空間尋找不同類樣本之間的分類邊界。決策樹所形成的分類邊界有一個明顯的特點:軸平行(axis-parallel),即它的分類邊界由若干個與座標軸平行。

以表4.5中的西瓜數據集爲例,將它作爲訓練集可學得圖4.10所示得決策樹,這棵樹所對應的分類邊界如圖4.11所示:
在這裏插入圖片描述
在這裏插入圖片描述
顯然,分類邊界得每一段都是和座標軸平行的。這樣的分類邊界使得學習的結果具有較好的可解釋性,因爲每一段劃分都直接對應了某個屬性取值。但在學習任務的真實分類邊界比較複雜時,必須使用很多段劃分才能獲得較好的近似。如圖4.12所示,這樣的決策樹會相當複雜,而且要進行大量的屬性測試,時間開銷很大。
在這裏插入圖片描述
如果能使用斜的劃分邊界,如上圖的紅色折線,決策樹會大大簡化。多變量決策樹(univariate decision tree)就是這樣能實現斜劃分,甚至更復雜劃分的決策樹。

以實現斜劃分的多變量決策樹爲例,在此類決策樹中,非葉節點不再是僅對某個屬性,而是對屬性的線性組合進行測試,換言之,每個非葉節點是一個形如在這裏插入圖片描述
的線性分類器,其中wi是屬性ai的權重,wi和t可在該節點所包含的樣本集和屬性集上學習得到。於是,與傳統的“單變量決策樹(univariate decision tree)不同,在多變量決策樹的學習過程中,不是爲每一個非葉節點尋找一個最優化分屬性,而是試圖建立一個合適的線性分類器。例如對西瓜數據集3,我們可學得如圖的多變量決策樹,其分類邊解如圖:
在這裏插入圖片描述

6.CART算法(分類迴歸樹)講解

上面我們說了決策樹有常見的三種:ID3,C4.5,CART。他們之間有或大或小的區別,我們在這介紹一下其中的CART算法到底是怎麼樣的。

6.1 基本特點

之前我們介紹的決策樹每次劃分屬性都是根據該屬性有幾個取值就劃分幾個結點(對離散取值的屬性而言),但是,在CART之中,規定所有的樹,子樹都是二叉樹。不管屬性有幾種取值,劃分時只劃分兩個子結點。

cart樹全名分類迴歸樹,因爲它不僅可以用來做分類,還可以用來做迴歸。

6.2 流程

  • 根據訓練數據生成樹,生成的樹儘可能大
  • 剪枝,使用後剪枝的方法

6.2.1迴歸樹的生成

公式的話有時間再詳細解釋

step1:確定最優劃分屬性xj和劃分點s。劃分點的選擇和分類樹一樣,只是分類樹選擇基尼指數最小的作爲劃分標準,迴歸樹的話選擇一個平方誤差作爲劃分標準.
在這裏插入圖片描述
step2:確定劃分後子節點的輸出值
在這裏插入圖片描述
step3:對子節點進行迭代,直到滿足停止條件(條件是你給的)
step4:生成一棵完整的迴歸樹,迴歸樹的輸出是每個劃分區域的輸出之和。
在這裏插入圖片描述

6.2.2分類樹的生成

和普通的決策樹一樣,首先我們需要選擇最優的劃分屬性。要注意的是我們選擇劃分屬性之後,只取其一個屬性取值作爲劃分依據,將樣本分爲是該屬性取值的和不是該屬性取值的,這樣保證了樹是二叉樹。

其具體步驟爲:
step1:計算現有屬性對數據集的gini指數。對每一個屬性的每一個取值a將原始數據集D劃分爲兩部分D1和D2,計算在該屬性並且是該取值下的基尼指數。
step2:選擇基尼指數最小的那個屬性和屬性取值的組合作爲該節點的劃分屬性和劃分屬性取值
step3:對子節點遞歸使用上述方法,直到滿足停止條件(停止條件是你自己設定的)
step4:得到一棵cart樹,可以進行剪枝了

注意:我們看到上面每次劃分時只是取了某一個屬性的某一個取值,所以,即便對於離散屬性,cart樹也是可以重複劃分對一個屬性劃分的(當然不能重複對該取值劃分)

7.總結

決策樹是一種非參的算法,其解釋性是非常好的。目前著名的決策樹算法有:

  • ID3
  • C4.5
  • CART
  • C4.5Rule(將C4.5轉化爲符號規則的算法)

決策樹在訓練過程中,主要會遇到的問題:怎麼選特徵作爲結點的劃分屬性。針對這個,不同的決策樹算法採用了不同的解決方法:

  • 信息增益(ID3,偏好多取值的特徵)
  • 增益率(C4.5,偏好少取值的特徵)
  • 基尼指數(CART)

解決了特徵選擇的問題,還有一個可能過擬合的問題,於是,又有了剪枝:

  • 預剪枝(在每次劃分前進行評估,如果不能提升泛化性能,就不繼續向下擴展)
  • 後剪枝(先建立一顆完整的樹,然後從下往上對非葉節點變爲葉節點,如果性能有所提升,就保持葉節點,否則,還還原到之前的非葉節點。)

兩種方法各有好處,預剪枝計算量比後剪枝小,但是可能會欠擬合。後剪枝計算量大,但是沒那麼容易欠擬合。

之後,就是對連續值和缺失值的處理。連續值處理就是找一個點將樣本在該屬性上的取值分爲大於和不大於該點的兩個類。缺失值的話大體上是先排除有缺失值的樣本進行劃分,分完之後,把有缺失值的在每個分支都複製一遍,但是權重和其他沒有缺失值的權重不一樣。

最後,是不太常用的多變量決策樹,即爲了解決決策樹處理某些問題時過於複雜的情況,將非葉節點由原來的一個屬性變爲多個屬性的線性組合。

總之,決策樹作爲機器學習的經典算法之一,是很重要的。尤其是還和後面的各種boost有所關聯。

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