【Python機器學習實戰】決策樹和整合學習(一)

Uniqe發表於2021-08-19

摘要:本部分對決策樹幾種演算法的原理及演算法過程進行簡要介紹,然後編寫程式實現決策樹演算法,再根據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

相關文章