算法思想
決策樹(decision tree)是一個樹結構(可以是二叉樹或非二叉樹)。
其每個非葉節點表示一個特征屬性上的測試,每個分支代表這個特征屬性在某個值域上的輸出,而每個葉節點存放一個類別。
使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特征屬性,並按照其值選擇輸出分支,直到到達葉子節點,將葉子節點存放的類別作為決策結果。
總結來說:
決策樹模型核心是下面幾部分:
- 結點和有向邊組成
- 結點有內部結點和葉結點倆種類型
- 內部結點表示一個特征,葉節點表示一個類
一、ID3算法
“信息熵”是度量樣本集合不確定度(純度)的最常用的指標。
在我們的ID3算法中,我們采取信息增益這個量來作為純度的度量。我們選取使得信息增益最大的特征進行分裂!
信息熵是代表隨機變量的復雜度(不確定度),條件熵代表在某一個條件下,隨機變量的復雜度(不確定度)。而我們的信息增益恰好是:信息熵-條件熵。
•當前樣本集合 D 中第 k 類樣本所占的比例為 pk ,則 D 的信息熵定義為
•離散屬性 a 有 V 個可能的取值 {a1,a2,…,aV};樣本集合中,屬性 a 上取值為 av 的樣本集合,記為 Dv。
•用屬性 a 對樣本集 D 進行划分所獲得的“信息增益”
•信息增益表示得知屬性 a 的信息而使得樣本集合不確定度減少的程度
在決策樹算法中,我們的關鍵就是每次選擇一個特征,特征有多個,那么到底按照什么標准來選擇哪一個特征。
這個問題就可以用信息增益來度量。如果選擇一個特征后,信息增益最大(信息不確定性減少的程度最大),那么我們就選取這個特征。
選擇指標就是在所有的特征中,選擇信息增益最大的特征。那么如何計算呢?看下面例子:
正例(好瓜)占 8/17,反例占 9/17 ,根結點的信息熵為
計算當前屬性集合{色澤,根蒂,敲聲,紋理,臍部,觸感}中每個屬性的信息增益
色澤有3個可能的取值:{青綠,烏黑,淺白}
D1(色澤=青綠) = {1, 4, 6, 10, 13, 17},正例 3/6,反例 3/6
D2(色澤=烏黑) = {2, 3, 7, 8, 9, 15},正例 4/6,反例 2/6
D3(色澤=淺白) = {5, 11, 12, 14, 16},正例 1/5,反例 4/5
3 個分支結點的信息熵
那么我們可以知道屬性色澤的信息增益是:
同理,我們可以求出其它屬性的信息增益,分別如下:
於是我們找到了信息增益最大的屬性紋理,它的Gain(D,紋理) = 0.381最大。
於是我們選擇的划分屬性為“紋理”
如下:
於是,我們可以得到了三個子結點,對於這三個子節點,我們可以遞歸的使用剛剛找信息增益最大的方法進行選擇特征屬性,
比如:D1(紋理=清晰) = {1, 2, 3, 4, 5, 6, 8, 10, 15},第一個分支結點可用屬性集合{色澤、根蒂、敲聲、臍部、觸感},基於 D1各屬性的信息增益,分別求的如下:
於是我們可以選擇特征屬性為根蒂,臍部,觸感三個特征屬性中任選一個(因為他們三個相等並最大),其它倆個子結點同理,然后得到新一層的結點,再遞歸的由信息增益進行構建樹即可
我們最終的決策樹如下:
啊,那到這里為止,我們已經知道了構建樹的算法,上面也說了有了樹,我們直接遍歷決策樹就能得到我們預測樣例的類別。那么是不是大功告成了呢?
結果是:不是的
我們從上面求解信息增益的公式中,其實可以看出,信息增益准則其實是對可取值數目較多的屬性有所偏好!
現在假如我們把數據集中的“編號”也作為一個候選划分屬性。我們可以算出“編號”的信息增益是0.998
因為每一個樣本的編號都是不同的(由於編號獨特唯一,條件熵為0了,每一個結點中只有一類,純度非常高啊),也就是說,來了一個預測樣本,你只要告訴我編號,其它特征就沒有用了,這樣生成的決策樹顯然不具有泛化能力。
於是我們就引入了信息增益率來選擇最優划分屬性!
二、C4.5算法
首先我們來看信息增益率的公式:
由上圖我們可以看出,信息增益率=信息增益/IV(a),說明信息增益率是信息增益除了一個屬性a的固有值得來的。
我們來看IV(a)的公式:
屬性a的固有值:
IV(觸感) = 0.874 ( V = 2 )
IV(色澤) = 1.580 ( V = 3 )
IV(編號) = 4.088 ( V = 17
由上面的計算例子,可以看出IV(a)其實能夠反映出,當選取該屬性,分成的V類別數越大,IV(a)就越大,如果僅僅只用信息增益來選擇屬性的話,那么我們偏向於選擇分成子節點類別大的那個特征。
但是在前面分析了,並不是很好,所以我們需要除以一個屬性的固定值,這個值要求隨着分成的類別數越大而越小。於是讓它做了分母。這樣可以避免信息增益的缺點。
那么信息增益率就是完美無瑕的嗎?
當然不是,有了這個分母之后,我們可以看到增益率准則其實對可取類別數目較少的特征有所偏好!畢竟分母越小,整體越大。
於是C4.5算法不直接選擇增益率最大的候選划分屬性,候選划分屬性中找出信息增益高於平均水平的屬性(這樣保證了大部分好的的特征),再從中選擇增益率最高的(又保證了不會出現編號特征這種極端的情況)
三、CART算法
CART是一課二叉樹
當CART是分類樹時,采用GINI值作為節點分裂的依據;當CART是回歸樹時,采用樣本的最小方差作為節點分裂的依據;
分類樹?回歸樹?
分類樹的作用是通過一個對象的特征來預測該對象所屬的類別,而回歸樹的目的是根據一個對象的信息預測該對象的屬性,並以數值表示。
CART既能是分類樹,又能是決策樹,如上表所示,如果我們想預測一個人是否已婚,那么構建的CART將是分類樹;如果想預測一個人的年齡,那么構建的將是回歸樹。
假設我們構建了兩棵決策樹分別預測用戶是否已婚和實際的年齡,如圖1和圖2所示:
圖1 預測婚姻情況決策樹 圖2 預測年齡的決策樹
圖1表示一棵分類樹,其葉子節點的輸出結果為一個實際的類別,在這個例子里是婚姻的情況(已婚或者未婚),選擇葉子節點中數量占比最大的類別作為輸出的類別;
圖2是一棵回歸樹,預測用戶的實際年齡,是一個具體的輸出值。怎樣得到這個輸出值?一般情況下選擇使用中值、平均值或者眾數進行表示,圖2使用節點年齡數據的平均值作為輸出值。
CART如何選擇分裂的屬性?
如果是分類樹,CART采用GINI值衡量節點純度;如果是回歸樹,采用樣本方差衡量節點純度。節點越不純,節點分類或者預測的效果就越差。
GINI值的計算公式:
節點越不純,GINI值越大。以二分類為例,如果節點的所有數據只有一個類別,則 ,如果兩類數量相同,則
。
回歸方差計算公式:
方差越大,表示該節點的數據越分散,預測的效果就越差。如果一個節點的所有數據都相同,那么方差就為0,此時可以很肯定得認為該節點的輸出值;如果節點的數據相差很大,那么輸出的值有很大的可能與實際值相差較大。
因此,無論是分類樹還是回歸樹,CART都要選擇使子節點的GINI值或者回歸方差最小的屬性作為分裂的方案。即最小化(分類樹):
或者(回歸樹):
CART如何分裂成一棵二叉樹?
節點的分裂分為兩種情況,連續型的數據和離散型的數據。
CART對連續型屬性的處理與C4.5差不多,通過最小化分裂后的GINI值或者樣本方差尋找最優分割點,將節點一分為二,在這里不再敘述,詳細請看C4.5。
對於離散型屬性,理論上有多少個離散值就應該分裂成多少個節點。但CART是一棵二叉樹,每一次分裂只會產生兩個節點,怎么辦呢?很簡單,只要將其中一個離散值獨立作為一個節點,其他的離散值生成另外一個節點即可。這種分裂方案有多少個離散值就有多少種划分的方法,舉一個簡單的例子:如果某離散屬性一個有三個離散值X,Y,Z,則該屬性的分裂方法有{X}、{Y,Z},{Y}、{X,Z},{Z}、{X,Y},分別計算每種划分方法的基尼值或者樣本方差確定最優的方法。
以屬性“職業”為例,一共有三個離散值,“學生”、“老師”、“上班族”。該屬性有三種划分的方案,分別為{“學生”}、{“老師”、“上班族”},{“老師”}、{“學生”、“上班族”},{“上班族”}、{“學生”、“老師”},分別計算三種划分方案的子節點GINI值或者樣本方差,選擇最優的划分方法,如下圖所示:
第一種划分方法:{“學生”}、{“老師”、“上班族”}
預測是否已婚(分類):
預測年齡(回歸):
第二種划分方法:{“老師”}、{“學生”、“上班族”}
預測是否已婚(分類):
預測年齡(回歸):
第三種划分方法:{“上班族”}、{“學生”、“老師”}
預測是否已婚(分類):
預測年齡(回歸):
綜上,如果想預測是否已婚,則選擇{“上班族”}、{“學生”、“老師”}的划分方法,如果想預測年齡,則選擇{“老師”}、{“學生”、“上班族”}的划分方法。
如何剪枝?
CART采用CCP(代價復雜度)剪枝方法。代價復雜度選擇節點表面誤差率增益值最小的非葉子節點,刪除該非葉子節點的左右子節點,若有多個非葉子節點的表面誤差率增益值相同小,則選擇非葉子節點中子節點數最多的非葉子節點進行剪枝。
可描述如下:
令決策樹的非葉子節點為。
a)計算所有非葉子節點的表面誤差率增益值
b)選擇表面誤差率增益值最小的非葉子節點
(若多個非葉子節點具有相同小的表面誤差率增益值,選擇節點數最多的非葉子節點)。
c)對進行剪枝
表面誤差率增益值的計算公式:
其中:
表示葉子節點的誤差代價,
,
為節點的錯誤率,
為節點數據量的占比;
表示子樹的誤差代價,
,
為子節點i的錯誤率,
表示節點i的數據節點占比;
表示子樹節點個數。
算例:
下圖是其中一顆子樹,設決策樹的總數據量為40。
該子樹的表面誤差率增益值可以計算如下:
求出該子樹的表面錯誤覆蓋率為 ,只要求出其他子樹的表面誤差率增益值就可以對決策樹進行剪枝。
流程圖:
總結:
(1)CART是一棵二叉樹,每一次分裂會產生兩個子節點,對於連續性的數據,直接采用與C4.5相似的處理方法,對於離散型數據,選擇最優的兩種離散值組合方法。
(2)CART既能是分類數,又能是二叉樹。如果是分類樹,將選擇能夠最小化分裂后節點GINI值的分裂屬性;如果是回歸樹,選擇能夠最小化兩個節點樣本方差的分裂屬性。
(3)CART跟C4.5一樣,需要進行剪枝,采用CCP(代價復雜度的剪枝方法)。