1. 程式人生 > >CART 分類與回歸樹

CART 分類與回歸樹

view ati 發生 最小值 屬性 ssi 沒有 bsp 獨立

from www.jianshu.com/p/b90a9ce05b28

本文結構:

  • CART算法有兩步
  • 回歸樹的生成
  • 分類樹的生成
  • 剪枝

CART - Classification and Regression Trees

分類與回歸樹,是二叉樹,可以用於分類,也可以用於回歸問題,最先由 Breiman 等提出。

分類樹的輸出是樣本的類別, 回歸樹的輸出是一個實數。


CART算法有兩步:

決策樹生成和剪枝。

決策樹生成:遞歸地構建二叉決策樹的過程,基於訓練數據集生成決策樹,生成的決策樹要盡量大;

自上而下從根開始建立節點,在每個節點處要選擇一個最好的屬性來分裂,使得子節點中的訓練集盡量的純。

不同的算法使用不同的指標來定義"最好":

分類問題,可以選擇GINI,雙化或有序雙化;
回歸問題,可以使用最小二乘偏差(LSD)或最小絕對偏差(LAD)。

決策樹剪枝:用驗證數據集對已生成的樹進行剪枝並選擇最優子樹,這時損失函數最小作為剪枝的標準。

這裏用代價復雜度剪枝 Cost-Complexity Pruning(CCP)


回歸樹的生成

回歸樹模型表示為:

技術分享

其中,數據空間被劃分成了 R1~Rm 單元,每個單元上有一個固定的輸出值 cm。
這樣就可以計算模型輸出值與實際值的誤差:

技術分享

我們希望每個單元上的 cm,可以使得這個平方誤差最小化,易知當 cm 為相應單元上的所有實際值的均值時,可以達到最優

技術分享

那麽如何生成這些單元劃分?

假設,我們選擇變量 xj 為切分變量,它的取值 s 為切分點,那麽就會得到兩個區域:

技術分享

當 j 和 s 固定時,我們要找到兩個區域的代表值 c1,c2 使各自區間上的平方差最小,

技術分享

前面已經知道 c1,c2 為區間上的平均,

技術分享

那麽對固定的 j 只需要找到最優的 s,
然後通過遍歷所有的變量,我們可以找到最優的 j,
這樣我們就可以得到最優對(j,s),並得到兩個區間。

上述過程表示的算法步驟為:

技術分享

即:
(1)考慮數據集 D 上的所有特征 j,遍歷每一個特征下所有可能的取值或者切分點 s,將數據集 D 劃分成兩部分 D1 和 D2
(2)分別計算上述兩個子集的平方誤差和,選擇最小的平方誤差對應的特征與分割點,生成兩個子節點。
(3)對上述兩個子節點遞歸調用步驟(1)(2),直到滿足停止條件。


分類樹的生成

(1)對每個特征 A,對它的所有可能取值 a,將數據集分為 A=a,和 A!=a 兩個子集,計算集合 D 的基尼指數:

技術分享

(2)遍歷所有的特征 A,計算其所有可能取值 a 的基尼指數,選擇 D 的基尼指數最小值對應的特征及切分點作為最優的劃分,將數據分為兩個子集。
(3)對上述兩個子節點遞歸調用步驟(1)(2), 直到滿足停止條件。
(4)生成 CART 決策樹。

其中 GINI 指數:

1、是一種不等性度量;
2、是介於 0~1 之間的數,0-完全相等,1-完全不相等;
3、總體內包含的類別越雜亂,GINI指數就越大(跟熵的概念很相似)

定義:
分類問題中,假設有 K 個類,樣本屬於第 k 類的概率為 pk,則概率分布的基尼指數為:

技術分享

樣本集合 D 的基尼指數為:

技術分享

其中 Ck 為數據集 D 中屬於第 k 類的樣本子集。

如果數據集 D 根據特征 A 在某一取值 a 上進行分割,得到 D1 ,D2 兩部分後,那麽在特征 A 下集合 D 的基尼指數為:

技術分享

其中算法的停止條件有:

1、節點中的樣本個數小於預定閾值,
2、樣本集的Gini系數小於預定閾值(此時樣本基本屬於同一類),
3、或沒有更多特征。

下面來看一下例子:

最後一列是我們要分類的目標。

技術分享

例如,按照“體溫為恒溫和非恒溫”進行劃分,計算如下:

恒溫時包含哺乳類5個、鳥類2個

技術分享

非恒溫時包含爬行類3個、魚類3個、兩棲類2個

技術分享

得到特征‘體溫’下數據集的GINI指數:

技術分享

最後我們要選 GINI_Gain 最小的特征和相應的劃分。


剪枝

就是在完整的決策樹上,剪掉一些子樹,使決策樹變小。

技術分享

是為了減少決策樹過擬合,如果每個屬性都被考慮,那決策樹的葉節點所覆蓋的訓練樣本基本都是“純”的,這時候的決策樹對訓練集表現很好,但是對測試集的表現就會比較差。

決策樹很容易發生過擬合,可以改善的方法有:
1、通過閾值控制終止條件,避免樹形結構分支過細。
2、通過對已經形成的決策樹進行剪枝來避免過擬合。
3、基於Bootstrap的思想建立隨機森林。

這裏我們用 代價復雜度剪枝 Cost-Complexity Pruning(CCP) 方法來對 CART 進行剪枝。

技術分享

從整個樹 T0 開始,先剪去一棵子樹,生成子樹 T1,
在 T1 上再剪去一棵子樹,生成子樹 T2,
重復這個操作,直到最後只剩下一個根節點的子樹 Tn,
得到了子樹序列 T0~Tn,
利用獨立的驗證數據集,計算每個子樹的平方誤差或者基尼指數,
選擇誤差最小的那個子樹作為最優的剪枝後的樹。

那麽這個子樹序列是怎麽剪出來的?
因為建模的時候,目標就是讓損失函數達到最優,那剪枝的時候也用損失函數來評判。

損失函數是什麽呢?
對任意子樹 T,損失函數如下形式,cost-complexity function:

技術分享

其中 CT 為誤差(例如基尼指數),|T| 為 T 的葉節點個數,alpha 為非負參數,用來權衡訓練數據的擬合程度和模型的復雜度。

alpha 固定時,一定可以找到一個子樹 T,使得等式右邊達到最小,那麽這個 T 就叫做最優子樹。

對固定的 alpha 找到損失函數最小的子樹 T,二者之間有這樣的關系:alpha 大時,T 偏小,alpha 小時,T 偏大。

那如果將 alpha 從小增大設置為一個序列,T 就可以從大到小得到相應的最優子樹序列,並且還是嵌套的關系。

剪的時候,哪個樹杈是可以被剪掉的呢?
很容易想到的是,如果剪掉後和沒剪時的損失函數一樣或者差別不大的話,那當然是剪掉好了,只留下一個點,就能代表一個樹杈,這樣樹就被簡化了。

以節點 t 為單節點樹時,它的損失函數為:(後面剪枝後就可以用一個點來代替一個樹杈)

技術分享

以節點 t 為根節點的子樹 Tt,它的損失函數為:(後面剪枝這個樹杈)

技術分享

那麽接下來的問題就是能不能找到這樣的點呢?
上面令 alpha=0,就有 Tt 和 t 的損失函數的關系為:

技術分享

那麽增大 alpha,當它為如下形式時:

技術分享

此時,Tt 和 t 的損失函數相等,而 t 的節點少,那麽保留 t 就可以了,Tt 就可以剪掉了。

技術分享

那麽在剪枝算法的第三步時,對每個 t,計算一下 gt,也就是能找到子樹 Tt 和 t 的損失函數相等時的 alpha,

每個點 t 都可以找到符合這樣條件的 alpha,
遍歷所有節點 t 後,找到最小的這個 alpha,

第四步,再把這個 alpha 對應的節點 t 的子樹 Tt 剪掉,
並用多數投票表決法決定 t 上的類別,
這樣得到的剪枝後的樹 T 記為 Tk,
這時的 alpha 記為 alpha k,

經過上面步驟,會得到:
α1?α2? ... ?αk? ...
T1?T2? ... ?Tk? ... ?{root}

例子:

下面這棵樹,有三個點 t1≡root,t2,t3

技術分享

α(1)=0

計算每個點的 gt:

技術分享

t2,t3 時的 gt 相等,此時我們可以選擇剪枝少的點,那就是 t3 剪掉。

技術分享

並且 α(2)=1/8

這時剩下 t1,t2,再繼續計算 gt:

技術分享

t2 的小,所以剪掉 t2:

技術分享

並且令 α(3)=1/8

最後剩下 t1,計算後 gt=1/4,所以 α(4)=1/4。

如此我們得到:α(0)=0,α(1)=1/8,α(2)=1/8,α(3)=1/4
並且得到了相應的子樹,
接下來就可以利用獨立的驗證數據集,計算每個子樹的平方誤差或者基尼指數,
選擇誤差最小的那個子樹作為最優的剪枝後的樹。



作者:不會停的蝸牛
鏈接:http://www.jianshu.com/p/b90a9ce05b28
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。

CART 分類與回歸樹