自學數據挖掘十大算法之CART

分類與迴歸樹(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》

發佈了47 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章