【Python機器學習實戰】決策樹和集成學習(一)——決策樹原理


摘要:本部分對決策樹幾種算法的原理及算法過程進行簡要介紹,然后編寫程序實現決策樹算法,再根據Python自帶機器學習包實現決策樹算法,最后從決策樹引申至集成學習相關內容。

 


1.決策樹

  決策樹作為一種常見的有監督學習算法,在機器學習領域通常有着不錯的表現,決策樹在生活中決策去做某件事時,會根據自己的經驗考慮到多種因素,那么在程序邏輯中使用if~else的堆疊,決定最終結果的過程其實就算是決策樹的一種體現,如下圖(舉個不太恰當的例子)。學術一點來說,決策樹就是根據以往發生的事的概率,來評估風險,作出決策,通常根據以往事件發生的情況來構建的一種樹形圖。

  構建決策樹依據的是由概率所表示的數據的“混亂程度”,或者說是“確定性”,依據信息的不確定性將現有數據進行划分,即若某一種划分使得數據的不確定性變小,則這種划分就是有意義的,比如如下一組數據:

作業是否完成 天氣 是否去打籃球
  是 晴朗
  否

晴朗

  是 下雨
  否 下雨

  從數據來看,去不去打籃球的關鍵因素在於天氣狀況,作業完成情況對是否去打藍球的影響不是很大,因此選用天氣情況划分數據使最終數據的確定性更強(已經區分開了)。

  而數據的不確定性概念屬於信息論的知識,這里簡要介紹一下:

  通常度量數據的不確定性有兩個指標:信息熵和基尼系數

(1)信息熵

  熵原本是用來描述物質的混亂程度,借用到信息系統里則表示信息的不確定性,其可以用如下式表示:

信息熵越大表示信息的不確定性越強,想要把它搞清楚所需要的信息也就越多,H(y)越小意味着y就越規律,確定性越強。當log的底數為2時稱之為比特,底數為e時稱之為納特。其函數圖像如下:

 

(2)基尼系數

  基尼系數是表示數據的純度,其表達式為:

  基尼系數表示樣本集合中一個隨機選中的樣本被分錯的概率。基尼指數越小表示集合中被選中的樣本被分錯的概率越小,也就說集合的純度越高,反之,集合越不純。即基尼系數越大表示數據的純度越小,不確定性越強,基尼系數越小表示數據純度越高,確定性越強。

(3)條件熵

  有了信息熵之后,雖然能夠反映出數據的確定性強弱,那么選取哪個特征能夠減小樣本數據的不確定性呢?這里就要用到條件熵的概念,條件熵是特征X關於y的信息量的大小,條件熵用H(y|X)表示,條件熵的計算公式為:

  條件熵意味着在已知特征X的情況下Y的不確定性,其值越小,數據不確定性越小,意味着特征X對於數據的划分更加有用。

 (4)信息增益

  信息增益可以理解為特征X為信息的不確定性的減少所帶來的價值,X越能為數據的不確定的減小價值貢獻越大,則信息增益就越大,X就越能作為划分依據,因此,信息增益可以用下式計算:

   X使得H(y|x)越小,表明不確定性越小,越能作為划分特征,因此選取特征時,信息增益越大越好。

  關於信息熵、條件熵、信息增益、互信息可以用下圖進行表示:

 

    H(y|x)為條件熵,表示在變量x的條件下,y的不確定性;

    H(x,y)是互信息,表示x,y的信息量之和;

    G(y,x)=H(y)-H(y|x),表示信息增益,其值與互信息H(x,y)相同。

  上面就是有關信息論的一些基本概念。有了上述一些基本概念后,就可以依據上述的信息增益和基尼系數進行決策樹的構造了,決策樹的構造類別也有很多種,常見的有ID3、C4.5和Cart決策樹,下邊分別介紹三種決策樹的構造過程。

ID3決策樹

  ID3決策樹就是就是利用信息增益進行特征選擇和數據的划分的,其構造過程為從根節點開始每次選擇信息增益最大的特征作為划分標准,直到滿足條件即停止。信息增益的計算過程如下:

 

   比較各個特征值下的信息增益,選取信息增益最大的那個特征作為划分依據進行樹的分裂即可,下面結合具體數據簡單描述上述過程。借用《Python機器學習實戰》書中的數據,數據如下:

 

 

  數據中共有4個特征,分別為{顏色,大小,人員屬性,動作},類別Y為結果{爆炸,不爆炸},那么初次划分節點從4個特征中選取一個作為划分標准,計算每個特征的信息增益:

  首先是Y的信息熵H(y):

  然后計算四個特征的條件熵:

  因此選取大小或者動作作為節點的划分標准,這里不妨選擇氣球大小作為划分數據標准,將數據切割為兩部分:

  去掉氣球大小的屬性,剩余數據集為:

                    小氣球                                                        大氣球

 

  然后再根據另外三個特征分別對兩個節點NodeA和NodeB再次進行分割,以此類推,直到某個子節點屬於同一類別即停止分裂,那么最終獲得的樹的結構如圖所示:

 

  以上便為ID3決策樹的算法過程,然而ID3算法存在一定的缺陷,其在選取信息增益最大作為划分標准時往往偏向於選擇取值較多的那個特征去作為划分依據,比如有一個樣本集,樣本數量為15,其中一個特征有15個不同的值,那么在計算條件熵時條件熵為0,信息增益最大,那在進行節點分裂時,會分出15個分支,形成一棵矮胖的決策樹,這顯示是不合理的,這也是正是ID3為什么不能用於划分連續型特征的原因,因此在ID3的基礎上提出了改進的算法,此為C4.5算法。

C4.5決策樹

  C4.5是在ID3決策樹的基礎上,避免因特征取值較多而偏向於選取該特征作為分裂標准的不合理性,因此,C4.5將信息增益比作為樹分裂的依據,信息增益比的計算公式如下:

  在信息增益的基礎上除上特征X的信息熵,當特征X的取值較多時,那么H(X)的值就會增大,從而使得信息增益比減小,具體計算過程就不再贅述。

  同時C4.5可以用於處理連續型特征,其做法是將某個特征取值按照大小進行排序:a1,a2,...,am,然后將相鄰兩個數取平均值,將特征划分成m-1個值。對於這m-1個點,分別計算以該點作為二元分類點時的信息增益比,選擇信息增益比最大的點作為該連續特征的二元離散分類點,注意,與離散特征不同的是,如果當前節點為連續屬性,則該屬性后面還可以參與分裂(有待考究,有見到過離散變量出現重用的情況)。然而,這種做法同樣也會產生一些缺點,進行二叉分支時,可能會分出一個比較小的Node出來,而另一個Node則會非常龐大,在后續進一步分裂時這個特征還可以再分裂,那么會不斷地向下生成一個較深的樹,最終造成過擬合現象。

CART決策樹

  CART決策樹的分裂規則是采用基尼系數的大小作為特征選擇和樹分裂標准的,采用該指標能夠簡化熵模型中的對數運算,同時又保留了熵的含義。前面提到基尼系數越大數據越不純,相反,基尼系數越小數據就越純,對於特征的選擇就越好,基尼系數的計算公式如下:

   對於特征X,假設X有2個不同的值,根據X將樣本划分成兩塊D1和D2,那么有:

  這里需要說明的是,CART決策樹是強制二叉樹,即無論特征X有多少個值,在進行分裂時只會分裂出兩個節點,這與ID3和C4.5有所不同,在ID3和C4.5中,若特征X有3個取值,選擇該特征進行划分時會划分出三個節點,而在CART中相當於ovr的思想。比如特征X取值{A1,A2,A3},那么在進行特征分裂時,會選擇{A1}、{A2,A3}和{A2}、{A1,A3}和{A3}、{A1,A2}的組合分別計算基尼系數,若計算出{A2}、{A1,A3}組合的基尼系數最小,則將會分裂出兩個節點,此時由於特征A並沒有完全分開,在后面進行分裂時,該特征將會進一步重用。

  同時CART算法不但能夠用於分類,還可以對連續型數據做回歸,稱之為CART回歸樹。在分類樹中采用的是基尼系數進行度量,而在回歸樹中,采用常用的和方差的度量方式,即對於特征X,若划分點為xp,xp將數據划分成兩塊D1和D2,那么要使兩塊數據的和方差最小,即:

    其中cjp為兩塊樣本數據輸出的平均值。

  回歸樹的預測最終根據葉子節點的平均值或者中位數作為預測結果。下面給出CART算法決策樹的構建流程:

  """

  輸入是訓練集D,基尼系數的閾值,樣本個數閾值。

  輸出是決策樹T

  • 對於當前節點的數據集D,如果樣本個數小於預設閾值或沒有特征,則返回決策子樹,停止遞歸;
  • 計算數據集的基尼系數,若基尼系數小於預設值,則返回決策子樹,停止遞歸;
  • 計算當前節點現有的各個特征的每個特征值對數據集D的基尼系數,選取基尼系數最小的特征值x及其特征X,根據這個特征值和特征,將數據集D划分為兩部分D1和D2,分裂出兩個節點Node1和Node2,分別為左右節點;
  • 對Node1和Node2分別遞歸上述過程,生成決策樹

  """

決策樹的剪枝

  前面在C4.5中提到對於連續型數據進行划分時會逐漸向下發展成很深的樹,造成過擬合,同理,對於其他的樹的構建,理論上只要樹的深度足夠深,就能夠完全擬合訓練數據,但這也造成了模型在測試數據上的泛化能力,造成過擬合現象。因此在構建決策樹時或構建完成后需要進行剪枝操作,防止過擬合。剪枝可以分為預剪枝和后剪枝。

  預剪枝實際上就是在樹的分裂過程中預設的節點停止分裂的條件,在實際應用中通常不多見。

  后剪枝是指在樹生成后,剪掉樹的的多余的節點,降低模型的復雜度。通常做法分為兩種:(1)利用交叉驗證,產生所有可能剪枝后的決策樹,驗證剪枝后的決策樹的泛化能力,選出最好的一顆;(2)加入正則化,即綜合考慮不確定性和模型的復雜度,加上一個損失,作為新的分別標准重新度量,再利用交叉驗證,驗證剪枝后的決策樹的泛化能力,選出最好的一顆。這里主要說明第二種方式:

  首先先來看剪枝時的度量損失,對於任意在節點t的一顆子樹T,損失函數表示為:

  其中α表示正則化參數,與線性回歸的一樣,C(Tt)表示原度量標准,分類樹中為基尼系數,回歸樹中為和方差,|Tt|為子樹T的葉子結點個數。α=0表示未剪枝,α→∞時,表示僅保留根節點。

如果此時將其剪掉,僅保留根節點,那么損失變為:

 

   當α=0或很小時,則有,當α增大到一定程度時會出現:

  此時α滿足下式:

  此時表示Tt和T具有相同的損失函數,但是T的節點更少,因此可以對Tt進行剪枝操作,剪掉其他的葉節點,Tt成為了一個葉子結點。

  通過求取設置不同的α,從不剪枝到剪至只剩1個根節點,記為 {T0,T1,T2,...,Tn},通過交叉驗證的方法選出最好的決策樹作為最終的結果。

  下面給出決策樹剪枝的算法過程:

  """

  輸入建立好的完整CART決策樹T0

  輸出最優的決策樹Tα

  • 初始化k=0,T=T0,最優子樹合集為T={T0},α=∞;
  • 從葉子節點開始從下向上計算各內部節點t的訓練誤差損失函數Cα(Tt),葉子節點的個數|Tt|,以及正則化的閾值α:

  • αkmin;自上而下訪問子樹t的內部節點,若滿足:

   則進行剪枝,並決定葉節點t的,若是分類樹,類別屬於概率最高的類別,若是回歸樹,則是所有樣本輸出的均值,這樣得到了αk對應的最優子樹Tk,將放入子樹Tk集合T中;

  • k=k+1,T=Tk,如果T不是由根節點單獨組成的樹,則遞歸執行上述步驟,否則就得到了最優子樹集合T;
  • 利用交叉驗證在T中選出最優的子樹Tα。

"""

 

 


 

至此,決策樹的算法基本原理這里已經簡單介紹完了,其中涉及較多原理部分可能需要進一步深挖,目前的層面就先到這里了,后面回頭看的時候再深入理解,進一步補充,接下來將根據算法原理對決策樹進行邏輯編寫,然后借助一些數據集去建立模型和實現,最后一部分介紹一下決策樹與集成學習的關系,並對集成學習的原理進行簡要介紹。

參考:

《Python機器學習實戰》

決策樹算法原理博客https://www.cnblogs.com/pinard/p/6053344.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM