分類與迴歸樹(Classification andRegression Trees, CART)算法由Breiman等人於1984年提出,是分類數據挖掘算法的其中一種。CART採用一種二分遞歸分割的技術,將當前的樣本集分爲兩個子樣本集,使得生成的決策樹的每個非葉子節點都有兩個分支。CART算法生成的決策樹是結構簡潔的二叉樹。分類樹下面有兩個關鍵的思想。第一個是關於遞歸地劃分自變量空間的想法;第二個想法是用驗證數據進行剪枝。
CART算法使用如下結構的學習樣本集:
其中,L是訓練樣本集,是屬性向量(Attribute Vectors),其屬性可以是離散的或者是有序的的;Y是標籤向量(Label Vectors),其屬性可以是離散的或者是有序的。Y是離散值,稱爲分類決策樹;或Y是有序的數量值時,稱爲迴歸決策樹樹。
何爲數值型變量、離散型變量?
數值型變量:對記錄的值從小到大排列,計算每個值作爲臨界點產生的子節點的異質性統計量,能夠使異質性減小程度最大的臨界值便是最佳的劃分點。
分類型變量:列出劃分爲兩個子集的所有可能組合,計算每種組合生成子節點的異質性,同樣,找到使異質性減小程度最大的臨界值就是最佳的劃分點。最佳的的劃分就是使得GINI值最小的劃分。
CART樹的生成
在對數據進行預處理之後,開始構建決策樹,決策樹的核心算法是確定決策樹分枝準則,該準則涉及到兩個方面問題:⑴如何在衆多的輸入變量中選擇出一個最佳的分組變量;⑵如何在分組變量的衆多取值中尋找到最佳的分割值。
首先在生成原始樹中引入差異係數(diversity index)的概念。此係數用於測度各個個結點內n(n>=2)個類樣本的分佈情況。在這裏我們採用的是CART算法中最常用的雜質函數基尼係數(GINI),公式如下:
(3-1)
其中,p(j/t)爲目標類別j在節點t中出現的比例。對於所有的P,所以GINI係數一定爲正數,除非其中的一個P爲1,而其他比爲0。節點T在X屬性下分爲N1和N2兩個部分,那麼GAIN指數就是:
(3-2)
而對訓練集進行劃分時,劃分的規則是利用二叉樹的表示形式,CART算法的開始是從根節點進行劃分,對各個結點進行重複遞歸的過程[18]:
(1)對於每個結點,選擇各個屬性的最優劃分點。根據樣本中對於分割規則“否”或“是”的回答,將結點劃分爲左右兩個子結點,從規則中尋找變量X ,如果 最小值 ,X 那麼這就是當前屬性的最優劃分點。
(2)在上步驟所得到的最優劃分點中選擇對此結點最優的分割點,成爲此結點的分割規則。分割規則的確定依據是使(2)式最小。
(3)重複對此結點分割出來的兩個結點進行分割這一過程。直到樣本全部屬於同一類爲止,或者持續到葉結點樣本個數極少(如少於5個),這時建成的樹層次多,葉結點多,此時該樹爲。
我們來看一個實例:
tid |
有房者 |
婚姻狀況 |
年收入 |
拖欠貸款者 |
1 2 3 4 5 6 7 8 9 10 |
是 否 否 是 否 否 是 否 否 否 |
單身 已婚 單身 已婚 離異 已婚 離異 單身 已婚 單身 |
125K 100K 70K 120K 95K 60K 220K 85K 75K 90K |
否 否 否 否 是 否 否 是 否 是 |
- 以有無房子作爲分裂屬性計算它的Gini值
有房 |
無房 |
拖欠貸款 |
0 |
3 |
是 |
3 |
4 |
否 |
Gini(有房)=1-(3/3)²-(0/3)²=0
Gini(無房)=1-(4/7)²-(3/7)²=0.4849
Gini=0.3×0+0.7×0.4898=0.343
- 以婚否作爲分裂屬性計算它的Gini值
單身 |
已婚 |
離異 |
拖欠貸款 |
2 |
0 |
1 |
是 |
2 |
4 |
1 |
否 |
Gini(單身)=1-(2/4)²-(2/4)²=0.5
Gini(已婚)=1-(0/4)²-(4/4)²=0
Gini(離異)=1-(1/2)²-(1/2)²=0.5
Gini=4/10×0.5+4/10×0+2/10×0.5=0.3
- 以組合條件作爲分裂屬性計算它的Gini值
單身 |
已婚或離異 |
拖欠貸款 |
2 |
1 |
是 |
2 |
5 |
否 |
Gini(已婚或離異)=1-(5/6)²-(1/6)²=0.2778
Gini(單身)=1-(2/4)²-(2/4)²=0.5
Gini=6/10×0.2778+4/10×0.5=0.3667
已婚 |
單身或離異 |
拖欠貸款 |
0 |
3 |
是 |
4 |
3 |
否 |
Gini(單身或離異)=1-(3/6)²-(3/6)²=0.5
Gini(已婚)=1-(4/4)²-(0/4)²=0
Gini=6/10×0.5+4/10×0=0.3
離異 |
單身或已婚 |
拖欠貸款 |
1 |
2 |
是 |
1 |
6 |
否 |
Gini(單身或已婚)=1-(6/8)²-(2/8)²=0.375
Gini(離異)=1-(1/2)²-(1/2)²=0.5
Gini=8/10×0.375+2/10×0.5=0.4
剪枝
當分類迴歸樹劃分得太細時,會對噪聲數據產生過擬合作用。因此我們要通過剪枝來解決。剪枝又分爲前剪枝和後剪枝:前剪枝是指在構造樹的過程中就知道哪些節點可以剪掉,於是乾脆不對這些節點進行分裂,在N皇后問題和揹包問題中用的都是前剪枝;後剪枝是指構造出完整的決策樹之後再來考查哪些子樹可以剪掉。
Simplified pruning algorithm:
DEFINE: r(t)= training data misclassification rate in node t(節點t的誤分率)
p(t)= fraction of the training data in node t(節點t上的數據在整個數據集上的比率)
R(t)= r(t)*p(t)(是節點t的誤差代價,如果該節點被剪枝)
t_left=left child of node t
t_right=right child of node t(節點t的左右孩子)
|T| = number of terminal nodes in tree T(決策樹最終的節點個數)
BEGIN: Tmax=largest tree grown
Current_Tree=Tmax
For all parents t of two terminal nodes
Remove all splits for which R(t)=R(t_left) + R(t_right)
Current_tree=Tmax after pruning
PRUNE: If |Current_tree|=1 then go to DONE
For all parents t of two terminal nodes
Remove node(s) t for which R(t)-R(t_left) - R(t_right) is minimum
Current_tree=Current_Tree after pruning
決策樹的優缺點
優點:
1.可以生成可以理解的規則。
2.計算量相對來說不是很大。
3.可以處理連續和種類字段。
4.決策樹可以清晰的顯示哪些字段比較重要
缺點:
1.對連續性的字段比較難預測。
2.對有時間順序的數據,需要很多預處理的工作。
3.當類別太多時,錯誤可能就會增加的比較快。
4.一般的算法分類的時候,只是根據一個字段來分類。
參考:
《CART算法在新浪微博客戶分類中的應用研究》(本文大量參考了該文,如有侵權請聯繫刪除)
《機器學習十大算法:CART》