決策樹(decision tree)是一種基本的分類與迴歸方法.決策樹呈樹形結構,在分類問題中,表示基於特徵對實例進行分類的過程,它能夠認爲是if-then規則的集合,也能夠認爲是定義在特徵空間與類空間上的條件機率分佈,其主要優勢是模型具備可讀性,分類速度快.決策樹學習一般包括3個步驟:特徵選擇,決策樹的生成和決策樹的修剪html
分類決策樹是一種描述對實例進行分類的樹形結構.決策樹由結點(node)和有向邊(directed edge)組成.結點有三種類型:根結點(root node),內部結點(internal node)和葉結點(leaf node).內部結點表示一個特徵或屬性,葉結點表示一個類node
用決策樹分類,從根結點開始,對實例的某一特徵進行測試,根據測試結果,將實例分配到其子結點;這時每個子結點對應着該特徵的一個取值.如此遞歸地對實例進行測試並分配,直至達到葉結點,最後將實例分到葉結點的類中python
下圖是一個決策樹的示意圖web
from IPython.display import Image Image(filename="./data/5_1.png",width=500)
能夠將決策樹當作一個if-then規則的集合.將決策樹轉換成if-then規則的過程是這樣的:由決策樹的根結點到葉結點的每一條路徑構建一條規則;路徑上內部結點的特徵對應着規則的條件,而葉結點的類對應着規則的結論.決策樹的路徑或其對應的if-then規則集合具備一個重要的性質;互斥而且完備.這就是說,每個實例都被一條路徑或一條規則所覆蓋,並且只被一條路徑或一條規則所覆蓋.這裏所謂覆蓋是指實例的特徵與路徑上的特徵一致或實例知足規則的條件算法
決策樹還表示給定特徵條件下類的條件機率分佈,這一條件機率分佈定義在特徵空間的一個劃分(partition)上.將特徵空間劃分爲互不相交的單元(cell)或區域(region),並在每一個單元定義一個類的機率分佈就構成了一個條件機率分佈.決策樹一條路徑對應於劃分中的一個單元.決策樹所表示的條件機率分佈由各個單元給定條件下類的條件機率分佈組成.假設X爲表示通知的隨機變量,Y爲表示類的隨機變量,那麼這個條件機率分佈能夠表示爲 .X取值於給定劃分下單元的集合,Y取值於類的集合.各葉結點(單元)上的條件機率每每偏向某一個類,即屬於某一類的機率較大.決策樹分類時將該結點的實例強行分到條件機率大的那一類去app
Image(filename="./data/5_3.png",width=500)
圖a示意地表示了特徵空間的一個劃分.圖中的大正方形表示特徵空間.這個大正方形被若干個小矩形分割,每一個小矩形表示一個單元.特徵空間劃分上的單元構成了一個集合,X取值爲單元的集合.爲簡單起見,假設只有兩類:正類和負類,即Y取值爲+1和-1.小矩形中的數字表示單元的類.圖b示意地表示特徵空間劃分肯定時,特徵(單元)給定條件下類的條件機率分佈.圖b中條件機率分佈對應於圖a的劃分.當某個單元c的條件機率知足 時,則認爲這個單元屬於正類,即落在這個單元的實例都被視爲正例.圖c爲對應於圖b中條件機率分佈的決策樹svg
決策樹學習,假設給定訓練數據集:
函數
其中, 爲輸入實例(特徵向量),n爲特徵個數, 爲類標記, ,N爲樣本容量.學習的目標是根據給定的訓練數據集構建一個決策樹模型,使它可以對實例進行正確的分類性能
決策樹學習本質上是從訓練數據集中概括出一組分類規則.與訓練數據集不相矛盾的決策樹(即能對訓練數據進行正確分類的決策樹)可能有多個,也可能一個也沒有.咱們須要的是一個與訓練數據矛盾較小的決策樹.同屬具備很好的泛化能力.從另外一個角度看,決策樹學習是由訓練數據集估計條件機率模型.基於特徵空間劃分的類的條件機率模型有無窮多個.咱們選擇的條件機率模型應該不只對訓練數據有很好的擬合,並且對未知數據有很好的預測學習
特徵選擇在於選取對訓練數據具備分類能力的特徵.這樣能夠提升決策樹學習的效率.若是利用一個特徵進行分類的結果與隨機分類的結果沒有很大差異.則稱這個特徵是沒有分類的能力的.經驗上扔掉這樣的特徵對決策樹學習的精度影響不大,一般特徵選擇的準則是信息增益或信息增益比
首先經過一個例子來講明特徵選擇問題
ID | 年齡 | 有工做 | 有本身的房子 | 信貸狀況 | 類別 |
---|---|---|---|---|---|
1 | 青年 | 否 | 否 | 通常 | 否 |
2 | 青年 | 否 | 否 | 好 | 否 |
3 | 青年 | 是 | 否 | 好 | 是 |
4 | 青年 | 是 | 是 | 通常 | 是 |
5 | 青年 | 否 | 否 | 通常 | 否 |
6 | 中年 | 否 | 否 | 通常 | 否 |
7 | 中年 | 否 | 否 | 好 | 否 |
8 | 中年 | 是 | 是 | 好 | 是 |
9 | 中年 | 否 | 是 | 很是好 | 是 |
10 | 中年 | 是 | 是 | 很是好 | 是 |
11 | 老年 | 否 | 是 | 很是好 | 是 |
12 | 老年 | 否 | 是 | 好 | 是 |
13 | 老年 | 是 | 否 | 好 | 是 |
14 | 老年 | 是 | 否 | 很是好 | 是 |
15 | 老年 | 否 | 否 | 通常 | 否 |
但願經過所給的訓練數據學習一個貸款申請的決策樹,用以對將來的貸款申請進行分類,即當新的客戶提出貸款申請時,根據申請人的特徵利用決策樹決定是否批准貸款申請
from IPython.display import Image Image(filename="./data/5_4.png",width=500)
兩個決策樹均可以今後延續下去,問題是:究竟選擇哪一個特徵更好些?這就要求肯定選擇特徵的準則.直觀上,若是一個特徵具備更好的分類能力,或者說按照這一特徵將訓練數據集分割成子集,使得各個子集在當前條件下有最好的分類,那麼就更應該選擇這個特徵.信息增益(information gain)就可以很好地表示這一直觀的準則
在信息論與機率統計中,熵(entropy)是表示隨機變量不肯定性的度量.設X是一個取有限個值的離散隨機度量,其機率分佈爲:
則隨機變量X的熵定義爲:
若
,則定義
.一般對數以2爲底數或以e爲底(天然對數),這時熵的單位分佈稱做比特(bit).由定義可知,熵只依賴X的分佈.而與X的取值無關,因此也可將X的熵記做
,即:
熵越大,隨機變量的不肯定性就越高.從定義可驗證:
當隨機變量只取兩個值,例如1,0時,即X的分佈爲:
熵爲:
這時,熵 隨機率p變化的曲線以下圖(單位爲比特):
Image(filename="./data/5_5.png",width=500)
當p=0或p=1時 ,隨機變量徹底沒有不肯定性.當p=0.5時, ,熵取值最大,隨機變量不肯定性最大
設有隨機變量
,其聯合機率分佈爲:
條件熵
表示在已知隨機變量X的條件下隨機變量Y的不肯定性.隨機變量
給定的條件下隨機變量
的條件熵(conditional entropy)
.定義爲
給定條件下Y的條件機率分佈的熵對
的數學指望:
這裏,
信息增益(information gain)表示得知特徵X的信息而使得類Y的信息的不肯定性減小的程度
特徵A對訓練數據集D的信息增益
,定義爲集合D的經驗熵
與特徵A給定條件下D的經驗條件熵
之差,即:
通常地,熵 與條件熵 之差稱爲互信息(mutual information).決策樹學習中的信息增益等價於訓練數據集中類與特徵的互信息
根據信息增益準則的特徵選擇方法是:對訓練數據集(或子集)D,計算其每一個特徵的信息增益,並比較它們的大小,選擇信息增益最大的特徵
設訓練數據集爲D,|D|表示其樣本容量,即樣本個數.設有K個類 ,k= , 爲屬於類 的樣本個數, .設特徵A有n個不一樣的取值 ,根據特徵A的取值將D劃分爲n個子集 , 爲 的樣本個數, .記子集 中屬於類 的樣本的集合爲 ,即 , 爲 的樣本個數,因而信息增益的算法以下:
信息增益的算法
輸入:訓練數據集D和特徵A
輸出:特徵A對訓練數據集D的信息增益
實例1:對前面貸款所給的訓練數據集D,根據信息增益準則選擇最優特徵
Image(filename="./data/5_6.png",width=500)
最後,比較各特徵的信息增益值,因爲特徵 (有本身的房子)的信息增益值最大,因此選擇特徵 做爲最優特徵
信息增益比的大小是相對於訓練數據集而言的,並無絕對意義.在分類問題困難時,也就是說在訓練數據集的經驗熵大的時候,信息增益值會偏大,反之,信息增益值會偏小.使用信息增益比(information gain ratio)能夠對這一問題進行校訂.這是特徵選擇的另外一準則
特徵A對訓練數據集D的信息增益比
定義爲其信息增益
與訓練數據集D的經驗熵
之比:
ID3算法的核心是在決策樹各個結點上應用信息增益準則選擇特徵,遞歸地構建決策樹.具體方法是:從根結點(root node)開始,對結點計算全部可能的特徵的信息增益,選擇信息增益最大的特徵做爲結點的特徵,由該特徵的不一樣取值創建子結點;再從子結點遞歸地調用以上方法,構建決策樹;直到全部特徵的信息增益均很小或沒有特徵能夠選擇爲止.最後獲得一個決策樹.ID3至關於用極大似然法進行機率模型的選擇
ID3算法
輸入:訓練數據集D,特徵集A,閾值
輸出:決策樹T
實例2:對貸款表的訓練數據集,利用ID3算法創建決策樹
from IPython.display import Image Image(filename="./data/5_7.png",width=500)
選擇信息增益最大的特徵 (有工做)做爲結點的特徵.因爲 有兩個可能取值,從這一結點引出兩個子結點:一個對應"是"(有工做)的子結點,包含3個樣本,它們屬於同一類,因此這是一個葉結點,類標記爲"是";另外一個是對應"否"(無工做)的子結點,包含6個樣本,它們也屬於同一類,因此這也是一個葉結點,類標記爲"否"
這樣生成一個以下圖所示的決策樹,該決策樹只用了兩個特徵(有兩個內部結點):
Image(filename="./data/5_8.png",width=500)
實例:用ID3對天氣數據集樣本數據分析,生成決策樹
Day | Outlook | Temperature | Humidity | Wind | Play ball |
---|---|---|---|---|---|
D1 | Sunny | Hot | High | Weak | No |
D2 | Sunny | Hot | High | Strong | No |
D3 | Overcast | Hot | High | Weak | Yes |
D4 | Rain | Mild | High | Weak | Yes |
D5 | Rain | Cool | Normal | Weak | Yes |
D6 | Rain | Cool | Normal | Strong | No |
D7 | Overcast | Cool | Normal | Strong | Yes |
D8 | Sunny | Mild | High | Weak | No |
D9 | Sunny | Cool | Normal | Weak | Yes |
D10 | Rain | Mild | Normal | Weak | Yes |
D11 | Sunny | Mild | Normal | Strong | Yes |
D12 | Overcast | Mild | High | Strong | Yes |
D13 | Overcast | Hot | Normal | Weak | Yes |
D14 | Rain | Mild | High | Strong | No |
from IPython.display import Image Image(filename="./data/5_12.png",width=500)
Outlook屬性有三種取值—sunny,overcast和rain,分對應3個分支,將數據集劃分爲3個子集 , 和
Image(filename="./data/5_13.png",width=500)
而後,在Sunny分支下,遞歸調用Decision Tree( ,R-outlook,C)分別計算得Temperature屬性的信息增益增益度爲0.57,Humidity屬性的信息增益度爲0.97,Wind屬性的信息增益度爲0.02.所以在此分支下再以屬性Humidity對子集 劃分,獲得子集 和 ,這兩個子集的全部樣本都屬於同一類別,所以中止樹的分裂,添加兩個葉子節點,並寫上子集的類別便可
Image(filename="./data/5_14.png",width=500)
在生成決策樹之後,能夠方便地提取決策樹描述的知識,並表示成if-then形式的分類規則.沿着根節點到葉子節點每一條路徑對應一條決策規則.如IF {Outlook=Sunny,Humidity=High} then {Play ball=No}
在生成決策樹的過程當中,除了要選擇測試屬性,還要判斷是否中止樹的分裂.中止樹的分裂的條件以下,只要知足如下3個條件中的一條,便可中止樹的分支構造:
ID3採用信息增益度做爲評價標準.信息增益度的缺點是傾向於選擇取值較多的屬性,但在有些狀況下這類屬性可能不會提供太多有價值的信息.其次ID3算法只能對離散型屬性的數據集構造決策樹
ID3算法只有樹的生成,因此該算法生成的樹容易產生過擬合
C4.5算法與ID3算法類似,C4.5算法對ID3算法進行了改進.C4.5在生成的過程當中,用信息增益比來選擇特徵
C4.5對ID3算法進行了如下幾方面的改進:
C4.5的生成算法
輸入:訓練數據集D,特徵集A,閥值
輸出:決策樹T
信息增益率(gain ratio)定義爲:
Outlook的增益率是0.25/1.577=0.16
一般進行剪枝是爲了處理因爲數據中的噪聲和離羣點致使的過度擬合問題,剪枝通常採用自下而上的方式,在生成決策樹後進行
C4.5算法對連續屬性的處理有兩種方法:一種是基於信息增益度的;另外一種是基於Risannen的最小描述長度原理
實例:用下表的數據,使用C4.5創建決策樹的算法
天氣 | 溫度 | 溼度 | 風速 | 適動 |
---|---|---|---|---|
晴 | 炎熱 | 高 | 弱 | 取消 |
晴 | 炎熱 | 高 | 強 | 取消 |
陰 | 炎熱 | 高 | 弱 | 進行 |
雨 | 適中 | 高 | 弱 | 進行 |
雨 | 寒冷 | 正常 | 弱 | 進行 |
雨 | 寒冷 | 正常 | 強 | 取消 |
陰 | 寒冷 | 正常 | 強 | 進行 |
晴 | 適中 | 高 | 弱 | 取消 |
晴 | 寒冷 | 正常 | 弱 | 進行 |
雨 | 適中 | 正常 | 弱 | 進行 |
晴 | 適中 | 正常 | 強 | 進行 |
陰 | 適中 | 高 | 強 | 進行 |
陰 | 炎熱 | 正常 | 弱 | 進行 |
雨 | 適中 | 高 | 強 | 取消 |
from IPython.display import Image Image(filename="./data/5_15.png",width=500)
Image(filename="./data/5_16.png",width=500)
Image(filename="./data/5_17.png",width=500)
決策樹生成算法遞歸地產生決策樹,直到不能繼續下去爲止.這樣產生的樹每每對訓練數據的分類很準確,但對未知的測試數據的分類卻沒有那麼準確,即出現過擬合現象.過擬合的緣由在於學習時過多地考慮如何提升對訓練數據的正確分類,從而構建出過於複雜的決策樹,解決這個問題的辦法是考慮決策樹的複雜度,對已生成的決策樹進行簡化
在決策樹學習中將已生成的樹進行簡化的過程稱爲剪枝(pruning).具體地,剪枝從已生成的樹上裁掉一些子樹或葉結點,並將其根結點或父結點做爲新的葉結點,從而簡化分類樹模型
介紹一種簡單的決策樹學習的剪枝算法
決策樹的剪枝每每經過極小化決策樹總體的損失函數(loss function)或代價函數(cost function)來實現
決策樹生成只考慮了經過提升信息增益(或信息增益比)對訓練數據進行更好的擬合,而決策樹剪枝經過優化損失函數還考慮了減少模型複雜度.決策樹生成學習局部的模型,而決策樹剪枝學習總體的模型
樹的剪枝算法
輸入:生成算法產生的整個T,參數
輸出:修剪後的子樹
Image(filename="./data/5_9.png",width=500)
決策樹的剪枝算法能夠由一種動態規劃的算法實現.相似的動態規劃算法可參考文獻
CART一樣由特徵選擇,樹的生成及剪枝組成,既能夠用於分類也能夠用於迴歸.如下將用於分類與迴歸的樹統稱爲決策樹
CART的輸入和輸出變量能夠是離散型和連續型,而C4.5的輸出變量只能是離散型
CART是在給定輸入隨機變量X條件下輸出隨機變量Y的條件機率分佈的學習方法.CART假設決策樹是二叉樹,內部結點特徵的取值爲"是"和"否",左分支時取值爲"是"的分支,右分支是取值爲"否"的分支.這樣的決策樹等價於遞歸地二分每一個特徵,將輸入空間即特徵空間劃分爲有限個單元,並在這些單元上肯定預測的機率分佈,也就是在輸入給定的條件下輸出的條件機率分佈
CART算法由如下兩步組成:
決策樹的生成就是遞歸地構建二叉決策樹的過程.對迴歸樹用平方偏差最小化準則,對分類樹用基尼指數(Gini index)最下化準則,進行特徵選擇,生成二叉樹
基尼指數:在分類問題中,假設有K個類,樣本點屬於第k類的機率爲
,則機率分佈的基尼指數定義爲:
對於二類分類問題,若樣本點屬於第1個類的機率是p,則機率分佈的基尼指數爲:
對於給定的樣本集合D,其基尼指數爲:
這裏,
是D中屬於第k類的樣本子集,K是類的個數
若是樣本結合D根據特徵A是否取某一可能值
被分割成
和
兩部分,即:
則在特徵A的條件下,集合D的基尼指數定義爲:
基尼指數 表示集合D的不肯定性,基尼指數 表示經A=a分割後集合D的不肯定性,基尼指數值越大,樣本結合的不肯定性也就越大,這一點與熵類似
Image(filename="./data/5_10.png",width=500)
實例3:根據貸款表所給訓練數據集,應用CART算法生成決策樹
Image(filename="./data/5_11.png",width=500)
CART剪枝算法從"徹底生長"的決策樹的底端剪去一些子樹,便決策樹變小(模型變簡單),從而可以對未知數據有更準確的預測.CART剪枝算法由兩步組成,首先從生成算法產生的決策樹 底端開始不斷剪枝,直到 的根結點,造成一個子樹序列 ;而後經過交叉驗證法在獨立的驗證數據集上對子樹序列進行測試,從中選擇最優子樹
由於在樹生成過程當中可能存在不能提升分類純度的劃分節點,且存在過擬合訓練數據的狀況,這時須要使用一份單獨的測試數據來評估每棵剪枝樹的預測性能,從而選取最優樹
實例:割草機制造商欲把城市中的家庭成分願意購買割草機和不肯意購買的兩類.在這個城市中隨機抽取12個擁有割草機的家庭和12個非擁有割草機的家庭做爲樣本.這裏的自變量是收入( )和草地面積( ).類別邊浪有兩個類別:擁有和非擁有
觀察序號 | 收入(千美圓) | 草地面積(平方尺) | 擁有者=1,非擁有者=2 |
---|---|---|---|
1 | 60 | 18.4 | 1 |
2 | 80.5 | 16.8 | 1 |
3 | 64.8 | 21.6 | 1 |
4 | 61.5 | 20.8 | 1 |
5 | 87 | 23.6 | 1 |
6 | 110.1 | 19.2 | 1 |
7 | 108 | 17.6 | 1 |
8 | 82.8 | 22.4 | 1 |
9 | 69 | 20 | 1 |
10 | 93 | 20.8 | 1 |
11 | 51 | 22 | 1 |
12 | 81 | 20 | 1 |
13 | 75 | 19.6 | 2 |
14 | 52.8 | 20.8 | 2 |
15 | 64.8 | 17.4 | 2 |
16 | 52.8 | 20.2 | 2 |
17 | 84 | 17.6 | 2 |
18 | 49.2 | 17.6 | 2 |
19 | 59.4 | 16 | 2 |
20 | 66 | 18.4 | 2 |
21 | 47.4 | 16.4 | 2 |
22 | 33 | 18.8 | 2 |
23 | 51 | 14 | 2 |
24 | 63 | 14.8 | 2 |
將表圖例
from IPython.display import Image Image(filename="./data/5_18.png",width=800)
在使用CART算法時,首先使用 進行分類.由圖能夠直觀地發現兩個矩形部分更加同質(即統一類別的點更多地彙集在一塊兒)
Image(filename="./data/5_19.png",width=500)
經過觀察得知,每個矩形都是同質的.即包含一種類別的點.該算法每一次劃分都將節點劃分爲兩個子節點
Image(filename="./data/5_20.png",width=600)