機器學習之決策樹


背景

決策樹是數據挖掘中一種最基本的分類與回歸方法,與其他算法相比,決策樹的原理淺顯易懂,計算復雜度較小,而且輸出結果易於理解,因此在實際工作中有着廣泛的應用

基本算法

決策樹分類算法的流程如下:

  1. 初始化根結點,此時所有的觀測樣本均屬於根結點
  2. 根據下文中介紹的划分選擇,選擇當前最優的划分屬性。根據屬性取值的不同對觀測樣本進行分割
  3. 對分割后得到的節點重復使用步驟2,直到
    • 分割得到的觀測樣本屬於同一類
    • 屬性用完或者達到預先設定的條件,如樹的深度。以葉子節點中大多數樣本的類別作為該葉子節點的類別

划分選擇

從上述算法可以看出,決策樹學習的關鍵是步驟2,即如何選擇最優划分屬性。一般而言,隨着划分的不斷進行,我們希望決策樹的分支節點所包含的樣本盡可能的屬於同一個類別。即節點的純度越高。於是特征選擇問題就轉化為了純度的定義問題。目前有3種常見的決策樹算法

  • ID3
  • C4.5
  • CART

ID3與信息增益

信息熵是度量樣本集合純度最常用的一種指標。假定當前樣本集合D中第k類樣本所占的比例為\(p_k\) \((k = 1, 2, 3, ...,|y|)\),則D的信息熵定義為

\[Ent(D) = - \sum_{k=1}^{|y|}p_k\log_{2}p_k \]

  • 信息熵越大,說明這個節點的純度越低;當節點的類別均勻分布時,信息熵為1;當只包含一類時,信息熵為0

信息增益

信息增益的定義是分類前的節點信息熵減去分類后子節點熵的加權和。即不純度的減少量,也即純度的增加量。特征選擇的規則是選擇使該節點信息增益最大的屬性分割該節點
假定離散屬性a有v個可能的取值\((a_1,a_2,a_3,...,a_V)\),若使用a來對樣本集進行划分,則會產生V個分支節點。其中第V個分支節點包含了樣本集合D中在屬性a上取值為\(a_V\)的樣本\(D^V\)。我們可以根據信息熵的公式計算信息熵。考慮到不同分支節點包含的樣本數不同,樣本數越多的分支節點權重越大,給分支節點賦予權重\(\frac{D^v}{D}\)。可以計算出以屬性a做為划分屬性,最后得到的信息增益如下:

\[Gain(D,a) = Ent(D) - \sum_{v=1}^{V}\frac{D^v}{D}Ent(D^v) \]

我們來舉個例子說明一下
假設我們的數據集如下

no age income student credit_rating buys_computer
1 <=30 high no fair no
2 <=30 high no excellent no
3 [30,40) high no fair yes
4 >40 medium no fair yes
5 >40 low yes fair yes
6 >40 low yes excellent no
7 [30,40) low yes excellent yes
8 <=30 medium no fair no
9 <=30 low yes fair yes
10 >40 medium yes fair yes
11 <=30 medium yes excellent yes
12 [30,40) high yes fair yes
13 [30,40) medium no excellent yes
14 >40 medium no excellent no
  • 特征x包括age, income, student, credit_rating, y變量buys_computer

我們根據信息增益來確定下一步要選擇的划分特征

  • 划分前的信息增益
    共有9個正例,5個負例

\[Ent(D) = -\frac{1}{14}\log_2\frac{9}{14} - \frac{5}{14}\log_2\frac{5}{14}=0.940 \]

  • 按照age划分
    使用p表示正例的個數,n表示負例的個數,E(p,n)表示熵
    age共有3個取值

    • <=30的正例2個,負例3個,信息熵為E(2,3)=0.971
    • [31,40)的正例4個,負例0個,信息熵為E(4,0)=0
    • 40的正例3個,負例2個,信息熵為E(3,2)=0.971

\[\begin{eqnarray*} Gain(age) & = & Ent(D) - \frac{5}{14}*E(2,3) + \frac{4}{14}*E([4,0)) + \frac{5}{14}*E(3,2) \\ & = & 0.940 - \frac{5}{14}*0.971 + \frac{4}{14}*0 + \frac{5}{14}*0.971 \\ & = & 0.246 \end{eqnarray*}\]

  • 按照其他的屬性分割
    • Gain(income) = 0.029
    • Gain(student) = 0.151
    • Gain(credit_rating) = 0.048

可以看出在當前選擇age做為划分屬性信息增益最大,所以我們的第一個屬性選擇age

C4.5

在上面的分析中,我們有意漏掉了no屬性,它表示每個樣本的編號。如果使用no做為划分屬性,得到的信息增益為0.940,遠大於其他候選划分屬性。這很好理解,使用no將產生14個分支節點,每個分支節點僅包含一個樣本。這些分支節點的純度已達到最大,但是很顯然這樣的決策樹不具有泛化能力。信息增益存在的問題是傾向於選擇包含多取值的參數。為了避免這個問題,著名的C4.5算法不直接使用信息增益,而是使用增益率。增益率定義為:

\[Gain\_ratio(D,a) = \frac{Gain(D,a)}{IV(a)} \]

\[IV(a) = -\sum_{v=1}^{V}\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|} \]

\(IV(a)\)的定義可以看出,當a的取值只有一個時,取值為0;當a的取值有多個,且每個取值的觀測數完全一樣時,取值最大。a的取值數目越多,則IV(a)的值越大。增益率准則對可取值數目較少的屬性有所偏好。為了克服這個問題,C4.5算法采用了一個啟發式的算法:先從候選划分屬性中找出信息增益高於平均水平的屬性。再從中選擇增益率最高的

CART

CART決策樹使用基尼指數來選擇划分屬性,基尼值的定義如下:

\[\begin{eqnarray*} Gini(D) & = & \sum_{K=1}^{|y|}\sum_{{k}'\neq k}p_kp_{k'} \\ & = & 1 - \sum_{K=1}^{|y|}{p_k}^2 \end{eqnarray*}\]

直觀來說,Gini(D)反映了從數據集D中隨機抽取兩個樣本,其類別標記不一致的概率,因此Gini(D)越小,則數據集D純度越高。基尼值在節點取值分布均勻時取最大值1-1/V,在只包含一個類別時取最小值0.
屬性a的基尼指數定義為

\[Gini\_index(D,a) = \sum_{v=1}^{V}\frac{|D_v|}{|D|}Gini(D^v) \]

於是,我們在候選屬性集合A中,選擇那個使得划分后基尼指數最小的屬性作為最優划分屬性

\[a_* = \arg\min_{a\in A}Gini\_index(D,a) \]

剪枝

在決策樹學習中為了盡可能的正確分類訓練樣本,節點划分過程將不斷重復,有時會造成決策樹分支過多,這時就可能因訓練樣本學的太好了,導致泛化能力較低。為了解決這個問題,有兩種解決辦法:預剪枝,后剪枝

預剪枝

常用的有三種方法

  1. 預先設定一個樹的最大深度,如果分裂后樹的深度達到閾值,則停止分裂
  2. 設定一個分裂閾值,若分裂得到的信息增益不大於這個閾值,則停止分裂
  3. 按照樹的准確度,如果分裂后樹的准確度提升,則分裂

優缺點

預剪枝使得決策樹的很多分支都沒有展開,這不僅降低了過擬合的風險,還顯著減少了決策樹訓練和預測的時間開銷。但是另一方面,有些分支的當前划分雖然不能帶來泛化性能的提升,甚至可能導致泛化性能暫時下降,但在其基礎上進行的后續划分卻有可能導致泛化性能顯著上升。所以基於貪心策略的預剪枝可能帶來欠擬合的風險

后剪枝

首先生成與訓練集完全擬合的決策樹,然后自下而上地逐層剪枝,如果一個節點的子節點被刪除后,決策樹的准確度沒有降低,那么就將該節點設置為葉節點(基於的原則是Occam剪刀:具有相似效果的兩個模型選擇較簡單的那個)

優缺點

優點

  • 決策樹易於理解和解釋.人們在通過解釋后都有能力去理解決策樹所表達的意義。
  • 對於決策樹,數據的准備往往是簡單或者是不必要的.其他的技術往往要求先把數據一般化,比如去掉多余的或者空白的屬性。
  • 同時接受離散和連續的數據,不需要做預處理和歸一化

代碼

隨機森林

簡介

隨機森林(Random Forest RF)是一種新興起的、高度靈活的機器學習算法。近年來,得益於其廣泛適用、易於理解以及高准確率等方面的優勢,它在各個領域的關注度與受歡迎程度都有着顯著的提升。從市場營銷到醫療保健保險,隨機森林既可以用來做市場營銷模擬的建模,統計客戶的來源,保留和流失等情況,也可用來預測不同疾病的風險和病患者的易感性。

生成規則

通過上面決策樹的介紹,我們已經掌握了生成樹的方法,那么從一棵樹到一片森林,其生成規則如下:

  1. 如果訓練集大小為N,對於每棵樹而言,隨機且有放回地從訓練集中的抽取N個訓練樣本(bootstrap抽樣方法),作為該樹的訓練集;每棵樹的訓練集都是不同的,但里面包含重復的訓練樣本。
  2. 如果每個樣本的特征維度為M,指定一個常數m,且\(m \ll M\),隨機地從M個特征中選取m個特征子集,每次樹進行分裂時,從這m個特征中選擇最優的;
  3. 每棵樹都盡最大程度的生長,並且沒有剪枝過程。

在森林中,每棵樹都是獨立的,99.9%不相關的樹做出的預測結果涵蓋了所有的情況,這些預測結果將會彼此抵消。少數優秀的樹的預測結果將會超脫於芸芸“噪音”,做出一個好的預測。將若干個弱分類器的分類結果進行投票選擇,從而組成一個強分類器,這就是隨機森林bagging的思想。
不過我們需要認識到:bagging不用單棵決策樹來做預測,具體哪個變量起到重要作用變得未知,所以bagging改進了預測准確率但損失了解釋性。
在生成隨機森林時,為什么要有放回的抽樣呢?這里引用博客[Machine Learning & Algorithm] 隨機森林(Random Forest)的解釋:
如果不是有放回的抽樣,那么每棵樹的訓練樣本都是不同的,都是沒有交集的,這樣每棵樹都是"有偏的",都是絕對"片面的"(當然這樣說可能不對),也就是說每棵樹訓練出來都是有很大的差異的;而隨機森林最后分類取決於多棵樹(弱分類器)的投票表決,這種表決應該是"求同",因此使用完全不同的訓練集來訓練每棵樹這樣對最終分類結果是沒有幫助的,這樣無異於是"盲人摸象"。
這樣,我們對隨機森林中的“隨機”進行了詳細的解釋,它包含兩個方面:隨機抽取樣本,隨機抽取特征。這兩個隨機性的引入對隨機森林的分類性能至關重要。由於它們的引入,使得隨機森林不容易陷入過度擬合,並且具有很好得抗噪能力(比如:對缺省值不敏感)。

隨機森林分類效果

  1. 森林中任意兩棵樹的相關性: 相關性越大,錯誤率越大
  2. 森林中每棵樹的分類能力: 每棵樹的分類能力越強,整棵森林的錯誤率越低

減小特征選擇個數m,樹的相關性和分類能力也會相應的降低;增大m,兩者也會隨之增大。所以關鍵問題是如何選擇最優的m(或者是范圍),這也是隨機森林唯一的一個參數。

袋外錯誤率

上面我們提到,構建隨機森林的關鍵問題就是如何選擇最優的m,要解決這個問題主要依據計算袋外錯誤率oob error(out-of-bag error)。

隨機森林有一個重要的優點就是,沒有必要對它進行交叉驗證或者用一個獨立的測試集來獲得誤差的一個無偏估計。它可以在內部進行評估,也就是說在生成的過程中就可以對誤差建立一個無偏估計。

我們知道,在構建每棵樹時,我們對訓練集使用了不同的bootstrap sample(隨機且有放回地抽取)。所以對於每棵樹而言(假設對於第k棵樹),大約有1/3的訓練實例沒有參與第k棵樹的生成,它們稱為第k棵樹的oob樣本。

而這樣的采樣特點就允許我們進行oob估計,它的計算方式如下:

  1. 對每個樣本,計算它作為oob樣本的樹對它的分類情況(約1/3的樹);
  2. 然后以簡單多數投票作為該樣本的分類結果;
  3. 最后用誤分個數占樣本總數的比率作為隨機森林的oob誤分率。

信息熵的通俗解釋

下面是引用自 通俗理解信息熵

信息量

信息的大小跟隨機事件的概率有關。越小概率的事情發生了產生的信息量越大,如湖南產生的地震了;越大概率的事情發生了產生的信息量越小,如太陽從東邊升起來了(肯定發生嘛,沒什么信息量)。這很好理解!

例子

腦補一下我們日常的對話:
師兄走過來跟我說,立波啊,今天你們湖南發生大地震了。
我:啊,不可能吧,這么重量級的新聞!湖南多低的概率發生地震啊!師兄,你告訴我的這件事,信息量巨大,我馬上打電話問問父母什么情況。
又來了一個師妹:立波師兄,我發現了一個重要情報額,原來德川師兄有女朋友額~德川比師妹早進一年實驗室,全實驗室同學都知道了這件事。我大笑一聲:哈哈哈哈,這件事大家都知道了,一點含金量都沒有,下次八卦一些其它有價值的新聞吧

因此一個具體事件的信息量應該是隨着其發生概率而遞減的,且不能為負。
但是這個表示信息量函數的形式怎么找呢?
隨着概率增大而減少的函數形式太多了!不要着急,我們還有下面這條性質
如果我們有倆個不相關的事件x和y,那么我們觀察到的倆個事件同時發生時獲得的信息應該等於觀察到的事件各自發生時獲得的信息之和,即:
\(h(x,y) = h(x) + h(y)\)
由於x,y是倆個不相關的事件,那么滿足\(p(x,y) = p(x)*p(y)\)

根據上面推導,我們很容易看出h(x)一定與p(x)的對數有關(因為只有對數形式的真數相乘之后,能夠對應對數的相加形式,可以試試)。因此我們有信息量公式如下:
\(h(x)=-log_{2}p(x)\)

下面解決倆個疑問?

  1. 為什么有一個負號
    其中,負號是為了確保信息一定是正數或者是0,總不能為負數吧!
  2. 為什么底數為2
    這是因為,我們只需要信息量滿足低概率事件x對應於高的信息量。那么對數的選擇是任意的。我們只是遵循信息論的普遍傳統,使用2作為對數的底!

信息熵

下面我們正式引出信息熵。
信息量度量的是一個具體事件發生了所帶來的信息,而熵則是在結果出來之前對可能產生的信息量的期望——考慮該隨機變量的所有可能取值,即所有可能發生事件所帶來的信息量的期望。即
\(H(x)=-sum (p(x)log_{2}p(x) )\)
轉換一下為:

\[Ent(D) = - \sum_{k=1}^{y}p_k\log_{2}p_k \]

參考文獻


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM