1. 程式人生 > >機器學習筆記 (六)決策樹

機器學習筆記 (六)決策樹

決策樹

決策樹

決策樹

決策樹是一類常見的機器學習方法,是基於樹結構來進行決策的。一般的,一棵決策樹包含一個根結點、若干個內部結點和若干個葉結點;葉結點對應於決策結果,其他每個結點則對應於一個屬性測試;每個結點包含的樣本集合根據屬性測試的結果被劃分到子節點中;根結點包含樣本全集。從根結點到每個葉結點的路徑對應了一個判定測試序列。決策樹學習的目的是為了產生一棵泛化能力強——即處理未見示例能力強的決策樹。其基本流程遵循“分而治之(divide-and-conquer)”的策略。
在這裡插入圖片描述

決策樹常用於分類問題,樹的根節點包含所有樣本,然後根據一定標準選擇最優劃分屬性,對樣本集進行劃分,得到根節點的子節點,並對每個子節點重複上述過程,直至子節點滿足以下三個條件的任意一個,即將子節點設定為葉子節點:

  1. 當前節點包含的樣本全屬於同一類別,無需劃分;
  2. 當前屬性集為空,或是所有樣本在所有屬性上取值相同,無法劃分;
  3. 當前節點包含的樣本集合為空,不能劃分

在上述第1種情況下,我們將當前節點的類別設定為所有樣本相同的屬性。在第2種情況中,我們將當前節點類別設定成當前節點所含樣本最多的類別。在第3種情況中,將當前節點屬性設定成其父節點中所含樣本最多的類別。

通過上述的介紹,可以發現生成一顆決策樹的關鍵步驟,就是節點切分這個步驟。而節點如何切分,則取決於節點中的樣本要根據哪個屬性(特徵)進行劃分,這也就是決策樹生成中會遇到的第一個問題。所以我們接下來首先討論不同演算法是如何處理這個特徵選取的問題的。緊接著,我們討論剪枝的問題,我們之前討論過,過擬合這個問題是無法避免的,因此不同的模型有不同的處理過擬合的方法,我們也討論一下決策樹在面對過擬合時常用的一些策略。接下來,就是討論一下對於連續值與缺失值的處理,這個在模型應用中是經常會遇到的問題,所以也不能忽視。

劃分選擇

決策樹學習的關鍵是第8行——如何選擇最優劃分屬性。一般而言,隨著劃分過程不斷進行,我們希望決策樹的分支結點包含的樣本儘可能屬於同一類別,即結點的“純度”越來越高。

以下將介紹幾種常見的決策樹劃分選擇指標以及使用他們的具體演算法。假設當前節點的樣本集合D中第k類樣本所佔的比例 p k p_k (k=1,2,3,…,| γ \gamma |)。嘉定離散屬性a有V個可能的取值{ a 1 a^1 , a 2 a^2 ,…, a V a^V },若使用a來對樣本集合D進行劃分,則會產生V個分支節點,其中第v個分支節點包含了D中所有在屬性a上取值為 a v a^v 的樣本,記為 D v D^v

在這裡插入圖片描述

剪枝

過擬合產生的原因

在決策樹學習的過程中,為了儘可能正確分類訓練樣本,節點劃分過程將不斷重複,有時會造成決策樹分支過多,這時就可能因訓練樣本學的“太好”了,以至於把訓練集自身的一些特點當做所有資料都具有的一般性質而導致過擬合。

常用剪枝方法

方法名稱 策略 優點 缺點
預剪枝 在決策樹生成的過程中,對每個節點在劃分前先進行估計,若當前節點的劃分不能帶來決策樹泛化效能提升,則停止劃分並將當前節點標記為葉節點 1. 降低過擬合風險;2. 顯著減少了決策樹的訓練時間開銷和測試時間開銷。 基於“貪心”本質禁止這些分支展開,給預剪枝決策樹帶來了欠擬合的風險
後剪枝 先從訓練集生成一棵完整的決策樹,然後自底向上地對非葉節點進行考察,若將該節點對應的子樹替換為葉節點能帶來決策樹泛化能力提升,則將該子樹替換為葉節點 1. 欠擬合風險小;2. 泛化能力一般優於預剪枝決策樹。 訓練時間開銷比未剪枝決策樹和預剪枝決策樹都要大很多

預剪枝的策略十分明確,但後剪枝的策略則比較多樣性,如何去確定將非葉節點的子樹替換成葉節點後泛化能力是否提升,以怎樣的順序去遍歷非葉節點等不同的策略都可能產生不同的決策樹。

連續值與缺失值處理

連續值處理

對於離散屬性而言,每個屬性的可能取值數量是固定的,以該屬性劃分樣本集合能產生的分支的數量也是確定且有限的。但是實際應用中,我們更多碰到的是連續屬性,即樣本在該屬性上的值是一個實數,此時我們根據該屬性進行劃分的分支數不像離散屬性一樣是有限的,因此我們要採取其他策略來應對連續屬性。

給定樣本集D和連續屬性a,假定a在D上出現了n個不同的取值,將這些值從小到大進行排序,記為{ a 1 a^1 , a 2 a^2 , a 3 a^3 ,…, a n a^n }。我們考慮根據該屬性值可以將樣本集合劃分成n-1個子樣本集合,而這n-1個劃分的劃分點則是 a i + a i + 1 2 \frac{a^i+a^i+1}{2} ,這個劃分點也稱位跳躍點。根據某個跳躍點t,我們可以將樣本在屬性a上取值小於跳躍點的劃分到 D t D^−_t ,大於等於跳躍點的樣本劃分到 D t + D^+_t ,則每個跳躍點都只會產生兩個子分支。

除了以上差別以外,連續屬性和離散屬性還存在一點不一樣,即若當前節點劃分屬性為連續屬性,該屬性還可作為其後代節點的劃分屬性。舉個例子,加入樣本有離散屬性a,連續屬性b,那麼如果根節點根據屬性a進行劃分了,根節點的所有子孫節點都不再考慮根據a進行劃分。但如果根節點根據屬性b進行劃分了,那麼根節點的子孫節點在選擇劃分時仍然可以考慮屬性b。

缺失值處理

現實任務中中常會遇到不完整樣本,即樣本的某些屬性值確實。面對這樣的資料集,如果我們直接拋棄掉所有存在缺失值的樣本的話,對資料資訊而言是極大的浪費。因此,我們需要考慮如何處理這些存在缺失值的樣本。在考慮這個問題時,我們主要思考如何解決以下兩個問題:

  1. 如何在屬性值確實的情況下進行劃分屬性選擇?
  2. 給定劃分屬性,若樣本在該屬性上的值確實,如何對樣本進行劃分?
    給定訓練集D和屬性a,令 D ˉ \bar{D} 表示D中在屬性a上沒有缺失值得樣本子集。對問題1,顯然我們僅可根據 D ˉ \bar{D} 來判斷屬性a的優劣。假定我們為每個樣本x賦予一個權重 w x w_x ,並定義
    { ρ = x D ˉ w x x D w x p k ˉ = x D ˉ w x x D w x ( 1 k γ ) γ k ˉ = x D ˉ w x x D w x ( 1 v V ) \begin{cases} ρ=\frac{∑_{x\in \bar{D}}w_x}{∑_{x\in D}w_x}\\ \bar{pk}=\frac{∑_{x\in \bar{D}}w_x}{∑_{x\in D}w_x} \left ( 1 \leq k \leq \left | \gamma \right | \right )\\ \bar{\gamma k}=\frac{∑_{x\in \bar{D}}w_x}{∑_{x\in D}w_x} \left ( 1 \leq v \leq \left | V\right | \right )\\ \end{cases}
    基於上述定義,我們可以將資訊增益的公式推廣為
    G a i n ( D , a ) = ρ G a i n ( D ˉ , a ) = ρ ( E n t ( D ˉ ) v V r ˉ v E n t ( D ˉ v ) ) Gain(D,a)=ρ∗Gain(\bar D,a)=ρ∗(Ent(\bar D)−\sum_{v\in V}^{}\bar r_vEnt(\bar D^v))

其中 E n t ( D ˉ ) = k γ p ˉ k log