引言
本文是統計學習方法第二版的讀書筆記。主要學習了決策樹的生成算法。
決策樹主要優點是模型具有可讀性,分類速度快。
建議先看下機器學習入門——決策樹圖解(附代碼)
決策樹模型與學習
決策樹模型
分類決策樹模型是一種描述對實例進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種類型:內部節點和葉節點。內部節點表示一個特徵或屬性,葉節點表示一個類。
上圖是一個決策樹的示意圖,圓和方框分別表示內部結點和葉結點。
決策樹與if-then規則
可以將決策樹看成一個if-then規則的集合。由決策樹的根節點到葉節點的每一條路徑構建一條規則;路徑上內部節點的特徵對應着規則的條件,而葉節點對應着規則的結論。 決策樹對應的if-then規則集合具有一個重要的性質:互斥並且完備。即每個實例都被一條規則所覆蓋,而且只被一條規則所覆蓋。覆蓋是指實例的特徵滿足規則的條件。
決策樹與條件概率分佈
決策樹還表示給定特徵條件下類的條件概率分佈。
上圖(a)表示了特徵空間的一個劃分,1x1的大正方形表示特徵空間。這個正方形被4個小矩形分隔,每個小矩形表示一個單元,也就是決策樹的一個規則。X取值爲單元的集合,這裏假設Y的取值爲+1,−1。小矩形中的數字表示單元的類。
當決策樹滿足上面這條規則時,得到的劃分就如下圖所示:
決策樹學習
假設給定訓練數據集
D={(x1,y1),(x2,y2),⋯,(xN,yN)}
其中,xi=(xi1,xi2,⋯,xin)爲輸入實例(特徵向量),n爲特徵個數,yi∈{1,2,⋯,K}爲類標記,i=1,2,⋯,N ,N爲樣本容量。
決策樹學習的目標是根據給定的訓練數據構建一個決策樹模型,是它能夠實例進行正確的分類。
決策樹學習本質上是從訓練數據中歸納出一組分類規則。能對訓練數據進行正確分類的決策樹可能有多個,也可能一個都沒有。我們需要一個與訓練數據矛盾較小的決策樹,同時具有很好的泛化能力。
決策樹學習用損失函數表示這一目標。決策樹學習的損失函數通常是正則化的極大似然函數。
決策樹學習的算法通常是一個遞歸地選擇最優特徵,並根據該特徵對訓練數據進行分割,使得對各個子數據集有一個最好的分類的過程。該過程對應着特徵空間的劃分,也對應着決策樹的構建。
開始,構建根節點,將所有訓練數據都放在根節點。選擇一個最優特徵,按照該特徵將訓練數據分隔成子集,使得各個子集有一個在當前條件下最好的分類。
若這些子集已經能被基本正確分類,那麼構建葉節點,將這些子集分到所對應的葉節點中去; 如果還有子集不能被基本正確分類,那麼針對這些子集選擇新的最優特徵,繼續對其進行分割,構建相應的節點。
如果遞歸地進行下去,直到所有訓練數據子集都被基本正確分類,或沒有適合的特徵爲止。這樣就生成了一顆決策樹。
以上方法生成的決策樹可能對訓練數據有很好的分類能力,但對未知的測試數據卻未必有很好的分類能力,即可能發生過擬合現象。我們需要對已生成的樹自下而上進行剪枝,將樹變得更簡單,從而使它具有更好的泛化能力。
如果特徵數量很多,也可以在決策樹學習開始的時候,對特徵進行選擇,只留下對訓練數據有足夠分類能力的特徵。
可以看出,決策樹學習算法包含特徵選擇、決策樹的生成與決策樹的剪枝過程。
決策樹學習常用的算法有ID3、C4.5與CART。
特徵選擇
特徵選擇問題
特徵選擇在於選取對訓練數據具有分類能力的特徵。這樣可以提高決策樹學習的效率。如果利用一個特徵進行分類的結果與隨機分類的結果沒有很大差別,則稱這個特徵是沒有分類能力的。通常特徵選擇的準則是信息增益或信息增益比。
下面通過一個例子來說明特徵選擇問題。下面是一個由15個樣本組成的貸款申請訓練數據。數據包含貸款申請人的4個特徵:年齡,有3個可能值;有工作,有2個可能值;有自己的房子,有2個可能值;以及信貸情況,有3個可能值。
最後一列是類別,是否同意貸款。
希望通過所給的訓練數據學習一個貸款申請的決策樹,用來對未來的貸款申請進行分類,當新客戶提出貸款申請時,根據申請人的特徵利用決策樹決定是否批准貸款申請。
首先要做的是特徵選擇,即決定用哪個特徵來劃分特徵空間。直觀上,如果一個特徵具有更好的分類能力,按照這一特徵將訓練數據分割成子集,使得各個子集在當前條件下有最好的分類,那麼就應該選擇這個特徵。信息增益(information gain)就能夠很好地表示這一直觀的準則。
信息增益
在信息論中,熵(entropy)表示隨機變量不確定性的度量。設X是一個取有限個值的離散隨機變量,其概率分佈爲
P(X=xi)=pi,i=1,2,⋯,n
則隨機變量X的熵定義爲
H(X)=−i=1∑npilogpi(5.1)
在上式中,若pi=0,則定義0log0=0。通常上式的對數以2爲底或以e爲底(自然對數),這時熵的單位爲別稱作比特或納特。由定義可知,熵只依賴於X的分佈,而與X的取值無關,所以也將X的熵記爲H(p),即
H(p)=−i=1∑npilogpi(5.2)
熵越大,隨機變量的不確定性越大。當隨機變量只取兩個值,例如1,0時,即X的分佈爲:
P(X=1)=p,P(X=0)=1−p,0≤p≤1
熵爲
H(p)=−plog2p−(1−p)log2(1−p)(5.4)
這時,熵H(p)隨概率p的曲線如圖所示
當p=0或p=1時H(p)=0,隨機變量完全沒有不確定性。當p=0.5時,H(p)=1,熵取最大值,隨機變量不確定性最大。
條件熵H(Y∣X)表示在已知隨機變量X的條件下隨機變量Y的不確定性。H(Y∣X)定義爲X給定條件下Y的條件概率分佈的熵對X的數學期望
H(Y∣X)=i=1∑npiH(Y∣X=xi)(5.5)
這裏pi=P(X=xi),i=1,2,⋯,n
當熵和條件熵中的概率由極大似然估計得到時,所對應的熵與條件熵分別稱爲經驗熵(empirical entropy)和經驗條件熵(empirical conditional entropy)。
信息增益表示得知特性X的信息而使得類Y的信息不確定性減少的程度。
特徵A對訓練數據集D的信息增益g(D,A)定義爲集合D的經驗熵H(D)與特徵A給定條件下D的經驗條件熵H(D∣A)之差,即
g(D,A)=H(D)−H(D∣A)(5.6)
一般地,熵H(Y)與條件熵H(Y∣X)之差稱爲互信息(mutual information)。決策樹學習中的信息增益等價於訓練數據集中類與特徵的互信息。
給定訓練集D和特徵A,經驗熵H(D)表示對數據集D進行分類的不確定性。而經驗條件熵H(D∣A)表示在特徵A給定的條件下對數據集D進行分類的不確定性。 那麼它們的差,即信息增益,就表示由於特徵A而使得對數據集D的分類的不確定性減少的程度。顯然,信息增益依賴於特徵,不同的特徵往往具有不同的信息增益。信息增益大的特徵具有更強的分類能力。
那麼就得到根據信息增益準則的特徵選擇方法:對訓練數據集(或子集)D,計算每個特徵的信息增益,並比較它們的大小,選擇信息增益最大的特徵。
設訓練數據集爲D,∣D∣表示樣本個數。設有K個類Ck,k=1,2,⋯,K,∣Ck∣爲屬於類Ck的樣本個數,所有類別的樣本個數之和等於樣本總數,即∑k=1K∣Ck∣=∣D∣。設特徵A有n個不同的取值{a1,a2,⋯,an},根據特徵A的取值將D劃分爲n個子集D1,D2,⋯,Dn,∣Di∣爲Di的樣本個數,有∑i=1n∣Di∣=∣D∣。 子集Di中屬於類Ck的樣本集合爲Dik,∣Dik∣爲Dik的樣本個數。
於是就可以表示信息增益的算法了:
- 計算數據集D的經驗熵H(D)
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣(5.7)
- 計算特徵A對數據集D的經驗條件熵H(D∣A)(其實就是H(Di)的加權和)
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣(5.8)
- 計算信息增益
g(D,A)=H(D)−H(D∣A)(5.9)
對例子中給出的訓練數據集D,根據信息增益準則來選擇最優特徵。
首先計算經驗熵H(D),根據每個類別的佔比計算即可:
H(D)=−159log2159−156log2156=0.971
然後計算各特徵對數據集D的信息增益。分別以A1,A2,A3,A4表示年齡、有工作、有自己的房子和信貸情況4個特徵,D1,D2,D3分別是D中A1(年齡)取值爲青年、中年和老年的樣本子集。
以H(D1)爲例,表示年齡取值爲青年的情況
總共有5個,其中3個類別爲否;2個類別爲是。把樣本子集D1代入公式(5.7)中,得
H(D1)=−(52log252+53log253)=0.971
哈哈,這裏巧了,和H(D)是一樣的,但是還要乘以一個權重,這個權重就是年齡爲青年的樣本數量佔總樣本數量的比重。這裏是155。
同理可以計算出H(D2)和H(D3)。
此時計算特徵A1對數據集D的信息增益就好理解了,爲下式:
g(D,A1)=H(D)−[155H(D1)+155H(D2)+155H(D3)]=0.971−[155(−52log252−53log253)+155(−53log253−52log252)+155(−54log254−51log251)]=0.971−0.888=0.083
同理可計算g(D,A2)
g(D,A2)=H(D)−[155H(D1)+1510H(D2)]=0.971−[155×0+1510(−104log2104−106log2106)]=0.324
g(D,A3)
g(D,A3)=0.971−[156×0+159(−93log293−96log296)]=0.971−0.551=0.420
g(D,A4)=0.971−0.608=0.363
最後,比較各特徵的信息增益。由於特徵A3(有自己的房子)的信息增益最大,所以選擇特徵A3作爲最優特徵。
信息增益比
以信息增益作爲劃分訓練數據集的特徵,存在偏向於選擇取值較多的特徵的問題。使用信息增益比(information gain ratio)可以對這一問題進行校正。這是特徵選擇的另一準則。
特徵A對訓練數據集D的信息增益比gR(D,A)定義爲其信息增益g(D,A)與訓練數據集D關於特徵A的值的熵HA(D)之比,即
gR(D,A)=HA(D)g(D,A)(5.10)
其中,HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣,n是特徵A的取值個數。
決策樹的生成
ID3算法
輸入:訓練數據集D,特徵集A閾值ε;
輸出:決策樹T
- 若D中所有實例屬於同一類Ck,則T爲單節點樹,並將類Ck作爲該節點的類標記,返回T;
- 若A爲空集,則T爲單節點樹,並將D中實例數最大的類Ck作爲該節點的類標記,返回T;
- 否則,按上面介紹的算法計算A中各特徵對D的信息增益,選擇信息增益最大的特徵Ag;
- 如果Ag的信息增益小於閾值ε(設置閾值防止分的過細),則置T爲單節點樹,並將D中實例數最大的類Ck作爲該節點的類標記,返回T;
- 否則,對Ag的每一可能值ai,依Ag=ai將D分割爲若干非空子集Di,將Di中實例數最大的類作爲標記,構建子節點,由節點及其子節點構成樹T,返回T;
- 對第i個子節點,以Di爲訓練集,以A−{Ag}爲特徵集,遞歸地調用步1~5,得到子樹Ti,返回Ti。
C4.5算法
C4.5算法除了在生成的過程中使用信息增益比來選擇特徵,其他過程和ID3算法是一樣的。
在這兩個算法中通過設定閾值來控制生成的樹的深度或寬度,這種做法稱爲預剪枝。還有一種做法是生成決策樹以後,再進行剪枝,叫做後剪枝。
決策樹的剪枝
上面介紹的決策樹生成算法遞歸地產生決策樹,直到不能繼續下去爲止。這樣產生的樹往往對訓練數據的分類很準確,但對未知的測試數據的分類卻沒有那麼準確,即出現過擬合現象。 解決這個問題的辦法是考慮降低決策樹的複雜度,對已生成的決策樹進行簡化。
在決策樹學習中將已生成的樹進行簡化的過程稱爲剪枝。剪枝從已生成的樹上裁掉一些子樹或葉節點,並將其根節點或父節點作爲新的葉節點,從而簡化分類樹模型。
決策樹的剪枝往往通過極小化決策樹整體的損失函數來實現。
決策樹損失函數
Cα(T)=C(T)+α∣T∣(5.11)
其中
C(T)=t=1∑∣T∣NtHt(T)
樹T的葉節點個數爲∣T∣,t呢是樹T的葉節點,該葉節點有Nt個樣本點,其中k類的樣本點有Ntk個。Ht(T)爲葉節點t上的經驗熵,α≤0爲參數,是對樹規模的一個懲罰。
C(T)表示模型對訓練數據的預測誤差,即模型與訓練數據的擬合程度,當葉子節點的熵越小,也就是損失越小,代表混亂程度越低,分類的時候越好分;
∣T∣表示模型複雜度。當葉子節點數越大,說明決策樹越複雜,泛化能力越差。較大的α促使選擇較簡單的樹。當α=0意味着只考慮模型與訓練數據的擬合程度,不考慮複雜度。
剪枝,就是當α確定時,選擇損失函數最小的模型。決策樹生成算法學習局部的模型,而決策樹剪枝學習整體的模型。
下面介紹剪枝算法。簡單來說就是如果減去某個分支,使該分支變成葉子節點,得到的新樹對應的損失函數更小,那麼就可以剪枝,否則不能剪枝。
樹的剪枝算法
- 計算每個節點的經驗熵
- 遞歸地從樹的根節點向上回縮
- 如果一組葉節點回縮到父節點之後和之前的整體樹分別爲TA與TB,對應的損失函數分別是Cα(TA)與Cα(TB),若Cα(TA)≤Cα(TB),則進行剪枝,將父節點變成新的葉節點
- 返回步驟2,直到不能繼續爲止,得到損失函數最小的子樹Tα
CART算法
分類與迴歸樹(classification and regression tree,CART)模型是應用廣泛的決策樹學習方法。既可以用於分類也可以用於迴歸。
它生成的決策樹是一顆二叉樹。上面介紹的ID3算法和C4.5算法中,如果其中一個特徵有多個(大於兩個)類別,那麼就要分多個分支。但是CART算法不管有多少個類別,只分成兩部分。
還是以這個數據爲例,如果以有工作這個特徵來分,只有兩個分支,是和否;但是如果以年齡來分,此時有三個分支了,要怎麼分呢,其實很簡單,可以左邊分支是青年(或中年、老年),右邊是非青年(或非中年、非老年)。只能從這個三個裏面選擇一種作爲分類的依據,CART此時是通過基尼指數來判斷選擇哪個分支作爲分類的依據。
基尼指數
分類問題中,假設有K個類,樣本點屬於第k個類的概率爲pk,則概率分佈的基尼指數定義爲
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2(5.12)
這裏用到了∑k=1Kpk=1
對於二分類問題,若樣本點屬於第1個類的概率是p,則概率分佈的基尼指數爲
Gini(p)=2p(1−p)(5.13)
對於給定的樣本集合D,其基尼指數爲
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2(5.14)
如果樣本集合D根據特徵A是否取某一可能值a被分割成D1和D2兩部分,即
D1={(x,y)∈D∣A(x)=a},D2=D−D1
則在特徵A的條件下,集合D的基尼指數定義爲
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)(5.15)
基尼指數Gini(D)表示集合D的不確定性,基尼指數Gini(D,A)表示經A=a分割後集合D的不確定性。基尼指數越大,不確定性就越大。
CART生成算法
根據訓練數據集,從根節點開始,遞歸地對每個節點進行以下操作,構建二叉決策樹:
- 設節點的訓練數據集爲D,計算現有特徵對該數據集的基尼指數。此時,對每個特徵A,對其可能取的每個值a,根據樣本點對A=a的測試爲“是”或“否”將D分割爲D1和D2兩部分,利用式(5.15)計算A=a時的基尼指數。
- 在所有可能的特徵A以及它們所有可能的切分點a中,選擇基尼指數最小的特徵及其對應的切分點作爲最優特徵與最優切分點。根據最優特徵和最優切分點,從現節點生成兩個子節點,將訓練數據集依特徵分配到兩個子節點中去。
- 對兩個子節點遞歸地調用步驟1,2,直到滿足停止條件
- 生成CART決策樹
其中算法停止計算的條件是節點中的樣本數小於預定閾值,或樣本集的基尼指數小於預定閾值,或沒有更多特徵。
還是通過這個例子來熟悉一下吧,應用CART算法生成決策樹。
和上文一樣,分別以A1,A2,A3,A4表示年齡、有工作、有自己的房子和信貸情況4個特徵,並以1,2,3表示年齡的值爲青年、中年和老年,以1,2表示有工作和有自己的房子的值爲是和否,以1,2,3表示信貸情況的值爲非常好、好和一般。
先求特徵A1的基尼指數
A1表示值爲青年,以該值將數據集分爲青年和非青年兩部分。其中青年部分有5個樣本,非青年部分有10個樣本。在年齡爲青年中類別爲否的有3個;爲是的有2個。 二在非青年中類別爲是的有7個;爲否的有3個。根據式(5.15)和式(5.13),得:
Gini(D,A1=1)=155(2×52×(1−52))+1510(2×107×(1−107))=0.44
同理求得
Gini(D,A1=2)=0.48
Gini(D,A1=3)=0.44
由於Gini(D,A1=1)和Gini(D,A1=3)相等且最小,所以A1=1和A1=3都可以選作A1的最優切分點。
求特徵A2和A3的基尼指數:
Gini(D,A2=1)=155(2×1×(1−1))+1510(2×104×(1−104))=0.32
Gini(D,A3=1)=0.27
由於A2和A3只有一個切分點(它們都只能分出兩個分支),所以它們就是最優切分點。
再求特徵A4的基尼指數:
Gini(D,A4=1)=0.36
Gini(D,A4=2)=0.47
Gini(D,A4=3)=0.32
Gini(D,A4=3)最小,所以A4=3爲A4的最優切分點。
在A1,A2,A3,A4幾個特徵中,Gini(D,A3=1)=0.27最小,所以選擇特徵A3作爲最優特徵,A3=1作爲最優切分點。
於是根節點生成兩個子節點,一個是葉節點。
對另一個節點繼續使用以上方法在A1,A2,A4中選擇最優特徵及其最優切分點,結果是A2=1。並且依據計算可知,所得節點都是葉節點。
參考
- 李航.統計學習方法第二版