1. 程式人生 > >周志華《Machine Learning》學習筆記(5)--決策樹

周志華《Machine Learning》學習筆記(5)--決策樹

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

4、決策樹

4.1 決策樹基本概念

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

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

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

這裡寫圖片描述

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

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

4.2 決策樹的構造

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

這裡寫圖片描述

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

4.2.1 ID3演算法

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

這裡寫圖片描述

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

這裡寫圖片描述

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

4.2.2 C4.5演算法

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

這裡寫圖片描述

4.2.3 CART演算法

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

這裡寫圖片描述

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

這裡寫圖片描述

4.3 剪枝處理

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

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

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

不剪枝處理的決策樹
預剪枝處理決策樹
後剪枝處理決策樹

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

4.4 連續值與缺失值處理

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

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

這裡寫圖片描述

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

這裡寫圖片描述

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

這裡寫圖片描述

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

這裡寫圖片描述