西瓜書總複習之第4章-決策樹

4、決策樹

(本文僅爲個人方便複習回顧)

之前的線性模型從最簡單的最小二乘法開始,討論輸入屬性有一個和多個的情形,接着通過廣義線性模型延伸開來,將預測連續值的迴歸問題轉化爲分類問題,從而引入了對數機率迴歸,最後線性判別分析LDA將樣本點進行投影,多分類問題實質上通過劃分的方法轉化爲多個二分類問題進行求解。本篇將討論另一種被廣泛使用的分類算法–決策樹(Decision Tree)。

4.1 決策樹基本概念

顧名思義,決策樹是基於樹結構來進行決策的,在網上看到一個例子十分有趣,放在這裏正好合適。現想象一位捉急的母親想要給自己的女娃介紹一個男朋友,於是有了下面的對話:


  女兒:多大年紀了?
  母親:26。
  女兒:長的帥不帥?
  母親:挺帥的。
  女兒:收入高不?
  母親:不算很高,中等情況。
  女兒:是公務員不?
  母親:是,在稅務局上班呢。
  女兒:那好,我去見見。

這個女孩的挑剔過程就是一個典型的決策樹,即相當於通過年齡、長相、收入和是否公務員將男童鞋分爲兩個類別:見和不見。假設這個女孩對男人的要求是:30歲以下、長相中等以上並且是高收入者或中等以上收入的公務員,那麼使用下圖就能很好地表示女孩的決策邏輯(即一顆決策樹)。

1.png

在上圖的決策樹中,決策過程的每一次判定都是對某一屬性的“測試”,決策最終結論則對應最終的判定結果。一般一顆決策樹包含:一個根節點、若干個內部節點和若干個葉子節點,易知:

* 每個非葉節點表示一個特徵屬性測試。
* 每個分支代表這個特徵屬性在某個值域上的輸出。
* 每個葉子節點存放一個類別。
* 每個節點包含的樣本集合通過屬性測試被劃分到子節點中,根節點包含樣本全集。

4.2 決策樹的構造

決策樹的構造是一個遞歸的過程,有三種情形會導致遞歸返回:(1) 當前結點包含的樣本全屬於同一類別,這時直接將該節點標記爲葉節點,並設爲相應的類別;(2) 當前屬性集爲空,或是所有樣本在所有屬性上取值相同,無法劃分,這時將該節點標記爲葉節點,並將其類別設爲該節點所含樣本最多的類別;(3) 當前結點包含的樣本集合爲空,不能劃分,這時也將該節點標記爲葉節點,並將其類別設爲父節點中所含樣本最多的類別。算法的基本流程如下圖所示:

2.png

可以看出:決策樹學習的關鍵在於如何選擇劃分屬性,不同的劃分屬性得出不同的分支結構,從而影響整顆決策樹的性能。屬性劃分的目標是讓各個劃分出來的子節點儘可能地“純”,即屬於同一類別。因此下面便是介紹量化純度的具體方法,決策樹最常用的算法有三種:ID3,C4.5和CART。

4.2.1 ID3算法

ID3算法使用信息增益爲準則來選擇劃分屬性,“信息熵”(information entropy)是度量樣本結合純度的常用指標,假定當前樣本集合D中第k類樣本所佔比例爲pk,則樣本集合D的信息熵定義爲:

3.png

假定通過屬性劃分樣本集D,產生了V個分支節點,v表示其中第v個分支節點,易知:分支節點包含的樣本數越多,表示該分支節點的影響力越大。故可以計算出劃分後相比原始數據集D獲得的“信息增益”(information gain)。

4.png

信息增益越大,表示使用該屬性劃分樣本集D的效果越好,因此ID3算法在遞歸過程中,每次選擇最大信息增益的屬性作爲當前的劃分屬性。

4.2.2 C4.5算法

ID3算法存在一個問題,就是偏向於取值數目較多的屬性,例如:如果存在一個唯一標識,這樣樣本集D將會被劃分爲|D|個分支,每個分支只有一個樣本,這樣劃分後的信息熵爲零,十分純淨,但是對分類毫無用處。因此C4.5算法使用了“增益率”(gain ratio)來選擇劃分屬性,來避免這個問題帶來的困擾。首先使用ID3算法計算出信息增益高於平均水平的候選屬性,接着C4.5計算這些候選屬性的增益率,增益率定義爲:

5.png

4.2.3 CART算法

CART決策樹使用“基尼指數”(Gini index)來選擇劃分屬性,基尼指數反映的是從樣本集D中隨機抽取兩個樣本,其類別標記不一致的概率,因此Gini(D)越小越好,基尼指數定義如下:

6.png

進而,使用屬性α劃分後的基尼指數爲:

7.png

4.3 剪枝處理

從決策樹的構造流程中我們可以直觀地看出:不管怎麼樣的訓練集,決策樹總是能很好地將各個類別分離開來,這時就會遇到之前提到過的問題:過擬合(overfitting),即太依賴於訓練樣本。剪枝(pruning)則是決策樹算法對付過擬合的主要手段,剪枝的策略有兩種如下:

* 預剪枝(prepruning):在構造的過程中先評估,再考慮是否分支。
* 後剪枝(post-pruning):在構造好一顆完整的決策樹後,自底向上,評估分支的必要性。

評估指的是性能度量,即決策樹的泛化性能。之前提到:可以使用測試集作爲學習器泛化性能的近似,因此可以將數據集劃分爲訓練集和測試集。預剪枝表示在構造數的過程中,對一個節點考慮是否分支時,首先計算決策樹不分支時在測試集上的性能,再計算分支之後的性能,若分支對性能沒有提升,則選擇不分支(即剪枝)。後剪枝則表示在構造好一顆完整的決策樹後,從最下面的節點開始,考慮該節點分支對模型的性能是否有提升,若無則剪枝,即將該節點標記爲葉子節點,類別標記爲其包含樣本最多的類別。

8.png

9.png

10.png

上圖分別表示不剪枝處理的決策樹、預剪枝決策樹和後剪枝決策樹。預剪枝處理使得決策樹的很多分支被剪掉,因此大大降低了訓練時間開銷,同時降低了過擬合的風險,但另一方面由於剪枝同時剪掉了當前節點後續子節點的分支,因此預剪枝“貪心”的本質阻止了分支的展開,在一定程度上帶來了欠擬合的風險。而後剪枝則通常保留了更多的分支,因此採用後剪枝策略的決策樹性能往往優於預剪枝,但其自底向上遍歷了所有節點,並計算性能,訓練時間開銷相比預剪枝大大提升。

4.4 連續值與缺失值處理

對於連續值的屬性,若每個取值作爲一個分支則顯得不可行,因此需要進行離散化處理,常用的方法爲二分法,基本思想爲:給定樣本集D與連續屬性α,二分法試圖找到一個劃分點t將樣本集D在屬性α上分爲≤t與>t。

* 首先將α的所有取值按升序排列,所有相鄰屬性的均值作爲候選劃分點(n-1個,n爲α所有的取值數目)。
* 計算每一個劃分點劃分集合D(即劃分爲兩個分支)後的信息增益。
* 選擇最大信息增益的劃分點作爲最優劃分點。

11.png

現實中常會遇到不完整的樣本,即某些屬性值缺失。有時若簡單採取剔除,則會造成大量的信息浪費,因此在屬性值缺失的情況下需要解決兩個問題:(1)如何選擇劃分屬性。(2)給定劃分屬性,若某樣本在該屬性上缺失值,如何劃分到具體的分支上。假定爲樣本集中的每一個樣本都賦予一個權重,根節點中的權重初始化爲1,則定義:

12.png

對於(1):通過在樣本集D中選取在屬性α上沒有缺失值的樣本子集,計算在該樣本子集上的信息增益,最終的信息增益等於該樣本子集劃分後信息增益乘以樣本子集佔樣本集的比重。即:

13.png

對於(2):若該樣本子集在屬性α上的值缺失,則將該樣本以不同的權重(即每個分支所含樣本比例)劃入到所有分支節點中。該樣本在分支節點中的權重變爲:

14.png

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