決策樹是比較容易的理解的機器學習算法,算法學習過程就是利用數據的屬性構造樹的過程,根據構建的樹,逐步向下決策,最後得到結果。決策樹利用樹結構進行決策,和人類理解決策問題時的思路很像,比如對於”是否要買下這套房子?”這樣的決策問題,人類會思考“地段位置好嗎?”。位置好,那再看“房子的價格可以接受嗎?”。可以接受,“房子面積夠用嗎?”……經過一些列的決策判斷之後,纔會決定買/不買這套房子。
1. 決策樹的構建過程
決策樹既然採用了樹結構,那麼就會包含樹的根節點,若干中間節點和葉節點,而樹的構建過程是一個遞歸的過程。決策樹算法構建樹的流程可以表示如下:
輸入:訓練集
屬性集
樹生成過程: TreeGenerate( )
1. 生成節點node
2. if 中的樣本都是同一個類別
3. 將node標記爲葉節點,類別爲
4. return
5. if 爲空 or 中的樣本在各個屬性上的取值都一樣
6. 將node標記爲葉節點,類別爲 中樣本最多的類
7. if 爲空
8. 將node標記爲葉節點,類別爲父節點的類
9. 從 中選擇最優劃分屬性 對節點進行劃分, 的每一個屬性值 劃分一個分支
10. for
11. 生成一個分支,分支的屬性集合爲 ,數據集合爲 ,表示 中在 上取值爲 的所有樣本
12. TreeGenerate( )
13. 輸出:一顆決策樹
其中,屬性集有 個和樣本 的維度是保持一致的。
決策樹的構建過程是很明顯的遞歸流程,包括遞歸返回條件和分而治之的思想。在決策樹的構建中,很關鍵的是如何選擇最優劃分屬性,依據什麼準則來選擇當前狀況下的最優劃分屬性呢?最直接的想法是希望每次劃分,都儘可能使得各個分支節點的樣本屬於同一個類。那麼如何用數學語言描述這個想法呢?決策樹一般採用信息增益、增益率和基尼指數。
2. 信息增益
信息增益是比較採用某屬性進行劃分的前後,信息熵的變化,選擇使信息熵變化最大的屬性作爲當前的最優劃分屬性。信息熵是度量樣本純度的常用指標。
假定當前樣本集合爲 ,每類樣本 佔總樣本比例爲 ( ,假設集合 上共有 個類別)。則定義信息熵爲:
信息熵的值越小,則樣本集 的純度越高,即大多樣本都屬於同一個類。比如在所有樣本都是同一個類時, 要麼是0,要麼是1,則 。
針對屬性 進行劃分( 共有 種取值),劃分 個分支,每個分支的樣本集合爲 。則信息增益爲:
考慮根據樣本數對 個分支加上權重,樣本數越多,權重越大,則信息增益重新表示爲:
其中, 表示數據集 中樣本的數量。因此,對於屬性的選擇,就是選擇使得 最大的屬性,如下。著名的 決策樹就是以信息增益爲準則來選擇最優劃分屬性。
3. 增益率
分析信息增益會發現,如果某個屬性包含較多的屬性值,那麼就會把數據集劃分爲很多個子集,那麼每個子集的樣本數量就會相對較少,信息熵也就會較小。因此取值數目越多的屬性,越可能被選擇爲最優劃分屬性。即信息增益準則偏好於取值數目較多的屬性。
爲了削弱信息增益對取值較多屬性的偏好,可以使用增益率作爲選擇最優劃分屬性的準則。增益率的定義爲:
其中, 。 有點像求劃分子集的熵,跟屬性密切相關,且屬性 的取值越多, 越大,那麼就有效的抑制了信息增益對取值較多屬性的偏好。
決策樹算法綜合使用信息增益和增益率。首先確定信息增益高於平均水平的屬性,再從中選擇增益率最大的。
4. 基尼指數
使用基尼指數值來表示數據集 的純度。
表示從 中隨機抽取兩個樣本類別標記不一致的概率。 越小,數據的純度越大。而基尼指數表示爲:
通過選擇使基尼指數最小的屬性。
5. 剪枝
在決策樹中,爲了追求在訓練集上更高的準確率,會導致整棵樹枝繁葉茂。這樣很容易造成模型過擬合,在訓練集上表現很好,而在測試集上的準確率卻不高。
剪枝是決策樹中常用的解決過擬合的手段,包括預剪枝和後剪枝兩種策略。預剪枝是在構造決策樹時,根據該次劃分能否帶來泛化性能的提升決定是否執行此次劃分,即阻止分枝的生成。後剪枝則是先生成一顆完整的決策樹,而後從葉節點開始回溯,考察每個中間節點,若將某個中間節點修改爲葉節點可以提升泛化性能,那麼將該中間節點替換爲葉節點,即剪掉節點下的所有分枝。
不管是預剪枝還是後剪枝,都涉及泛化性能驗證的問題,因此需要將數據分爲訓練集和驗證集,使用訓練集構建決策樹,而使用驗證集評估模型的泛化性能。
5.1 預剪枝
在決策樹的構建過程中,利用驗證集評估當前構建的決策樹的準確率,即根據當前最優屬性劃分後的決策樹的準確率。若執行此次劃分前的準確率小於劃分後的準確率,則執行此次劃分,否則不劃分。在預剪枝中,當前的劃分可能不會提升準確率,但是後續在該劃分下的發展,則可能會達到更高的準確率,但是預剪枝策略直接忽略掉了這種可能性,因此預剪枝策略可能會導致模型欠擬合。
5.2 後剪枝
構建好決策樹之後,從最底層開始層序遍歷決策樹。對於非葉節點,利用驗證集評估基於該結點進行劃分和不劃分的準確率,若不劃分的準確率高於劃分的準確率,則將該節點置爲葉節點。
6. 連續屬性取值
在決策樹的構建中,選擇屬性劃分分枝時,是把屬性的所有可能取值作爲分枝,這對離散取值的屬性是可行的,但對於連續取值的屬性應該怎麼辦呢?
將連續取值離散化是解決該問題的方法。假設 上的數據在屬性 上的取值連續,但是數據集中的樣本數是有限的,把所有樣本在屬性 上的值排序 。以所有相鄰取值的中間點作爲分界點 ,可以把 分爲兩部分,在選擇最優劃分屬性時,把分界點 也作爲需要選擇的屬性之一。因此,分界點 豐富了屬性集合,同一屬性的不同分界點也可以作爲最優的劃分規則,因此在有連續值屬性的決策樹中,相同的屬性可能多次出現在決策樹中。
對於信息增益而言,
缺失值處理
當訓練數據中部分樣本的部分屬性值缺失時會面臨兩個問題,一是如何選擇最優的劃分屬性,二是選擇了劃分屬性後,如何將含有缺失值的樣本劃分到各個子結點中。
(一)含有缺失值時,如何選擇最優劃分屬性。
劃分屬性的依據仍然是選擇劃分後使得數據純度最高的屬性(常用信息增益、信息增益率和基尼指數來衡量數據純度)。這裏以先以信息增益爲例來說明存在缺失值時如何選擇最優的劃分屬性。
在數據集D和屬性集A上選擇最優的劃分屬性,需要衡量A中以每個屬性a進行劃分時的信息增益,並選擇使信息增益最大的屬性a’作爲劃分屬性。對於某個屬性a,因爲缺失值的原因,不能直接在整個數據集D上計算信息增益,而是計算以a爲劃分屬性時,在不包含缺失值的數據集D’上的信息增益Gain(D’)(D’是D的子集,只包含無缺失值的數據)。假設D’中所有樣本的權重與D中所有樣本的權重之和的比值爲epsilon,則a在D上的信息增益Gain(D)=epsilon * Gain(D’)。最後選擇使Gain(D)最大的屬性a作爲劃分屬性。
在這裏爲了方便說明,只以信息增益爲例來解釋存在缺失值時,如何選擇最優劃分屬性。對於信息增益率和基尼指數,同樣可以用相同的策略計算。
(二)選擇最優劃分屬性後,如何將樣本劃分到各個子結點中。
若樣本x在最優劃分屬性a上有取值,則直接將其劃入取值對應的子結點,且保持樣本的權重wx不變。若x在a上取值缺失,則將x劃分到所有子結點中,但樣本權重調整爲wx=wx*|Dv|/|D’|(|Dv|/|D’|表示某個劃分節點中不含缺失值的樣本的權重佔所有不含缺失值樣本權重的比例)。
損失函數
生成決策樹時,會根據訓練數據遞歸地生成子結點,因爲只考慮瞭如何提高訓練數據的準確率,容易構建出複雜的決策樹模型,而導致過擬合。在決策樹中,常用的解決過擬合的手段是剪枝。而剪枝一般是通過最小化決策樹的損失函數來實現(一般也可以通過驗證集的性能進行剪枝)。
對決策樹進行剪枝時,會從樹的葉結點開始向上回退,審查每一箇中間結點,若刪除某個中間結點的所有分支,即將該中間結點置爲葉結點後,損失函數L會減小,那麼說明該操作是有利的,則執行該剪枝。
對於一顆構建好的決策樹而言,損失函數定義爲所有葉結點信息熵的加權和(誤差項)再加上葉結點的個數(懲罰項)。一顆決策樹T,假設其葉結點的個數爲I,i表示某個葉結點,葉結點i上有Ni個樣本,第k類樣本在葉結點i有Nik個(k=1,2,3,…,K,共有K個類),葉結點的信息熵爲Hi。則損失函數L=sum(NiHi)+ lambda * I,其中信息熵Hi=-sum[Nik/Ni * log(Nik/Ni)]。
可以認爲sum(NiHi)表示各個葉結點誤差項的加權和,對於每個葉結點,分類越準,Hi越小,Ni則是作爲葉結點i的誤差項的權重。I則表示懲罰項,表示模型的複雜度,模型越複雜(葉結點越多),I越大。Lambda則是用於平衡誤差項和懲罰項的因子。
7. 隨機森林
隨機森林(random forest, RF)可以簡單的理解爲決策樹的組合,“”樹(決策樹)多了就成了林(隨機森林)”。隨機森林是集成學習策略bagging在決策樹上的應用(關於集成學習更多的瞭解參見我的博客集成學習),它使用決策樹作爲基學習器,但對決策樹的構建略有改動,即在決策樹的構建過程中,對屬性的選擇引入了隨機擾動。
在隨機森林算法中,a. 首先是基於自助採樣法(自助採樣法請參見我的博客機器學習中的模型評估與度量)得到 組訓練樣本。b. 針對每一組訓練樣本構建一棵決策樹。但在隨機森林中,對決策樹中的每一個節點,並不是直接選擇最優屬性進行劃分,而是先從該節點的屬性集中隨機選擇包含 個屬性的子集,再從這個子集中選擇最優屬性進行劃分(推薦選擇 , 表示當前節點的總屬性條目)。c. 得到 棵決策樹,通過bagging策略,即多數投票的方式做最後的決策。