1. 程式人生 > >決策樹-CART迴歸樹

決策樹-CART迴歸樹

1、什麼是CART?

CART,又名分類迴歸樹,是在ID3的基礎上進行優化的決策樹,學習CART記住以下幾個關鍵點:

(1)CART既能是分類樹,又能是分類樹;

(2)當CART是分類樹時,採用GINI值作為節點分裂的依據;當CART是迴歸樹時,採用樣本的最小方差作為節點分裂的依據;

(3)CART是一棵二叉樹。

分類樹的作用是通過一個物件的特徵來預測該物件所屬的類別,而回歸樹的目的是根據一個物件的資訊預測該物件的屬性,並以數值表示。

      CART既能是分類樹,又能是決策樹,如上表所示,如果我們想預測一個人是否已婚,那麼構建的CART將是分類樹;如果想預測一個人的年齡,那麼構建的將是迴歸樹。

2、CART如何選擇分裂的屬性?

      分裂的目的是為了能夠讓資料變純,使決策樹輸出的結果更接近真實值。那麼CART是如何評價節點的純度呢?如果是分類樹,CART採用GINI值衡量節點純度;如果是迴歸樹,採用樣本方差衡量節點純度。節點越不純,節點分類或者預測的效果就越差。

GINI值的計算公式:

                               

      節點越不純,GINI值越大。以二分類為例,如果節點的所有資料只有一個類別,則 ,如果兩類數量相同,則 。

迴歸方差計算公式:

                                                    

                           

      方差越大,表示該節點的資料越分散,預測的效果就越差。如果一個節點的所有資料都相同,那麼方差就為0,此時可以很肯定得認為該節點的輸出值;如果節點的資料相差很大,那麼輸出的值有很大的可能與實際值相差較大。

      因此,無論是分類樹還是迴歸樹,CART都要選擇使子節點的GINI值或者回歸方差最小的屬性作為分裂的方案。即最小化(分類樹):

                               

或者(迴歸樹):

                                                      

                                               

3、如何剪枝?

為防止過擬合,需要對生成的樹進行剪枝。

      CART採用CCP(代價複雜度)剪枝方法。代價複雜度選擇節點表面誤差率增益值最小的非葉子節點,刪除該非葉子節點的左右子節點,若有多個非葉子節點的表面誤差率增益值相同小,則選擇非葉子節點中子節點數最多的非葉子節點進行剪枝。

CCP(代價複雜度)剪枝方法描述如下:

令決策樹的非葉子節點為

a)計算所有非葉子節點的表面誤差率增益值 

b)選擇表面誤差率增益值最小的非葉子節點(若多個非葉子節點具有相同小的表面誤差率增益值,選擇節點數最多的非葉子節點)。

c)對進行剪枝

表面誤差率增益值的計算公式:

                               

其中:

表示葉子節點的誤差代價, , 為節點的錯誤率, 為節點資料量的佔比;

表示子樹的誤差代價, , 為子節點i的錯誤率, 表示節點i的資料節點佔比;

表示子樹節點個數。

算例:

下圖是其中一顆子樹,設決策樹的總資料量為40。

該子樹的表面誤差率增益值可以計算如下:

 

求出該子樹的表面錯誤覆蓋率為 ,只要求出其他子樹的表面誤差率增益值就可以對決策樹進行剪枝。

4、例子講解

接下來將以一個實際的例子對CART進行介紹:

                                                                    表1 原始資料表

看電視時間

婚姻情況

職業

年齡

3

未婚

學生

12

4

未婚

學生

18

2

已婚

老師

26

5

已婚

上班族

47

2.5

已婚

上班族

36

3.5

未婚

老師

29

4

已婚

學生

21

分類樹和迴歸樹是怎麼做決策的?假設我們構建了兩棵決策樹分別預測使用者是否已婚和實際的年齡,如圖1和圖2所示:

                                      圖1 預測婚姻情況決策樹                                               圖2 預測年齡的決策樹

       圖1表示一棵分類樹,其葉子節點的輸出結果為一個實際的類別,在這個例子裡是婚姻的情況(已婚或者未婚),選擇葉子節點中數量佔比最大的類別作為輸出的類別;

       圖2是一棵迴歸樹,預測使用者的實際年齡,是一個具體的輸出值。怎樣得到這個輸出值?一般情況下選擇使用中值、平均值或者眾數進行表示,圖2使用節點年齡資料的平均值作為輸出值。

CART如何分裂成一棵二叉樹?

     節點的分裂分為兩種情況,連續型的資料和離散型的資料。

     CART對連續型屬性的處理與C4.5差不多,通過最小化分裂後的GINI值或者樣本方差尋找最優分割點,將節點一分為二,在這裡不再敘述,詳細請看C4.5

     對於離散型屬性,理論上有多少個離散值就應該分裂成多少個節點。但CART是一棵二叉樹,每一次分裂只會產生兩個節點,怎麼辦呢?很簡單,只要將其中一個離散值獨立作為一個節點,其他的離散值生成另外一個節點即可。這種分裂方案有多少個離散值就有多少種劃分的方法,舉一個簡單的例子:如果某離散屬性一個有三個離散值X,Y,Z,則該屬性的分裂方法有{X}、{Y,Z},{Y}、{X,Z},{Z}、{X,Y},分別計算每種劃分方法的基尼值或者樣本方差確定最優的方法。

     以屬性“職業”為例,一共有三個離散值,“學生”、“老師”、“上班族”。該屬性有三種劃分的方案,分別為{“學生”}、{“老師”、“上班族”},{“老師”}、{“學生”、“上班族”},{“上班族”}、{“學生”、“老師”},分別計算三種劃分方案的子節點GINI值或者樣本方差,選擇最優的劃分方法,如下圖所示:

第一種劃分方法:{“學生”}、{“老師”、“上班族”}

預測是否已婚(分類):

                    

預測年齡(迴歸):

            

第二種劃分方法:{“老師”}、{“學生”、“上班族”}

 

預測是否已婚(分類):

                    

預測年齡(迴歸):

            

第三種劃分方法:{“上班族”}、{“學生”、“老師”}

 預測是否已婚(分類):

                    

預測年齡(迴歸):

            

綜上,如果想預測是否已婚,則選擇{“上班族”}、{“學生”、“老師”}的劃分方法,如果想預測年齡,則選擇{“老師”}、{“學生”、“上班族”}的劃分方法。