1. 程式人生 > >分類迴歸樹CART(上)

分類迴歸樹CART(上)

分類迴歸樹(CART,Classification And Regression Tree)也屬於一種決策樹,上回文我們介紹了基於ID3演算法的決策樹。作為上篇,這裡只介紹CART是怎樣用於分類的。

分類迴歸樹是一棵二叉樹,且每個非葉子節點都有兩個孩子,所以對於第一棵子樹其葉子節點數比非葉子節點數多1。

表1

名稱 體溫 表面覆蓋 胎生 產蛋 能飛 水生 有腿 冬眠 類標記
恆溫 毛髮 哺乳類
巨蟒 冷血 鱗片 爬行類
鮭魚 冷血 鱗片 魚類
恆溫 毛髮 哺乳類
冷血 有時 兩棲類
巨蜥 冷血 鱗片 爬行類
蝙蝠 恆溫 毛髮 哺乳類
恆溫 哺乳類
豹紋鯊 冷血 鱗片 魚類
海龜 冷血 鱗片 有時 爬行類
豪豬 恆溫 剛毛 哺乳類
冷血 鱗片 魚類
蠑螈 冷血 有時 兩棲類

上例是屬性有8個,每個屬性又有多少離散的值可取。在決策樹的每一個節點上我們可以按任一個屬性的任一個值進行劃分。比如最開始我們按:

1)表面覆蓋為毛髮和非毛髮

2)表面覆蓋為鱗片和非鱗片

3)體溫為恆溫和非恆溫

等等產生當前節點的左右兩個孩子。按哪種劃分最好呢?有3個標準可以用來衡量劃分的好壞:GINI指數、雙化指數、有序雙化指數。下面我們只講GINI指數。

GINI指數

總體內包含的類別越雜亂,GINI指數就越大(跟熵的概念很相似)。比如體溫為恆溫時包含哺乳類5個、鳥類2個,則:

體溫為非恆溫時包含爬行類3個、魚類3個、兩棲類2個,則

所以如果按照“體溫為恆溫和非恆溫”進行劃分的話,我們得到GINI的增益(類比資訊增益):

最好的劃分就是使得GINI_Gain最小的劃分。

終止條件

一個節點產生左右孩子後,遞迴地對左右孩子進行劃分即可產生分類迴歸樹。這裡的終止條件是什麼?什麼時候節點就可以停止分裂了?直觀的情況,當節點包含的資料記錄都屬於同一個類別時就可以終止分裂了。這只是一個特例,更一般的情況我們計算χ2值來判斷分類條件和類別的相關程度,當χ2很小時說明分類條件和類別是獨立的,即按照該分類條件進行分類是沒有道理的,此時節點停止分裂。注意這裡的“分類條件”是指按照GINI_Gain最小原則得到的“分類條件”。

假如在構造分類迴歸樹的第一步我們得到的“分類條件”是:體溫為恆溫和非恆溫。此時:

哺乳類 爬行類 魚類 鳥類 兩棲類
恆溫 5 0 0 2 0
非恆溫 0 3 3 0 2

我在《獨立性檢驗》中講述了χ2的計算方法。當選定置信水平後查表可得“體溫”與動物類別是否相互獨立。

還有一種方式就是,如果某一分支覆蓋的樣本的個數如果小於一個閾值,那麼也可產生葉子節點,從而終止Tree-Growth。

剪枝

當分類迴歸樹劃分得太細時,會對噪聲資料產生過擬合作用。因此我們要通過剪枝來解決。剪枝又分為前剪枝和後剪枝:前剪枝是指在構造樹的過程中就知道哪些節點可以剪掉,於是乾脆不對這些節點進行分裂,在N皇后問題和揹包問題中用的都是前剪枝,上面的χ2方法也可以認為是一種前剪枝;後剪枝是指構造出完整的決策樹之後再來考查哪些子樹可以剪掉。

在分類迴歸樹中可以使用的後剪枝方法有多種,比如:代價複雜性剪枝、最小誤差剪枝、悲觀誤差剪枝等等。這裡我們只介紹代價複雜性剪枝法。

對於分類迴歸樹中的每一個非葉子節點計算它的表面誤差率增益值α。

是子樹中包含的葉子節點個數;

是節點t的誤差代價,如果該節點被剪枝;

r(t)是節點t的誤差率;

p(t)是節點t上的資料佔所有資料的比例。

是子樹Tt的誤差代價,如果該節點不被剪枝。它等於子樹Tt上所有葉子節點的誤差代價之和。

比如有個非葉子節點t4如圖所示:

已知所有的資料總共有60條,則節點t4的節點誤差代價為:

子樹誤差代價為:

以t4為根節點的子樹上葉子節點有3個,最終:

找到α值最小的非葉子節點,令其左右孩子為NULL。當多個非葉子節點的α值同時達到最小時,取最大的進行剪枝。

原始碼。拿表1作為訓練資料,得到剪枝前和剪枝後的兩棵分類迴歸樹,再對錶1中的資料進行分類測試。

C4.5克服了ID3的2個缺點:

1.用資訊增益選擇屬性時偏向於選擇分枝比較多的屬性值,即取值多的屬性

2.不能處理連貫屬性

詳細可參考這篇部落格