數據挖掘算法03 - CART

CART

CART 算法

另一種常見的決策樹是 CART 算法(Classification and Regression Trees,分類與迴歸樹)。這種算法和 ID3、C4.5 相比,主要有兩處不同:

  • 在分類時,CART 不再採用信息增益或信息增益率,而是採用基尼指數(Gini)來選擇最好的特徵並進行數據的劃分;
  • 在 ID3 和 C4.5 決策樹中,算法根據特徵的屬性值劃分數據,可能會劃分出多個組。而 CART 算法採用了二叉樹,每次把數據切成兩份,分別進入左子樹、右子樹。

當然,CART 算法和 ID3、C4.5 也有類似的地方。首先,CART 中每一次迭代都會降低基尼指數,這類似於 ID3、C4.5 降低信息熵的過程。另外,基尼指數描述的也是純度,與信息熵的含義相似。我們可以用下面這個公式來計算每個集合的純度。

其中,n 爲集合 P 中所包含的不同分組(或分類)數量。如果集合 P 中所包含的不同分組越多,那麼這個集合的基尼指數越高,純度越低

然後,我們需要計算整個數據集的基尼指數。

其中,m 爲全集使用特徵 T 劃分後,所形成的子集數量。Pj 爲第 j 個集合。

無論是何種決策樹算法,來自信息論的幾個重要概念:信息熵、信息增益、信息增益率、基尼指數都起到了重要的作用。如果你能很好的學習並運用這些概念,那麼決策樹這種類型的算法就不難理解了。

CART 分類樹的工作流程

我們知道決策樹的核心就是尋找純淨的劃分,因此引入了純度的概念。在屬性選擇上,我們是通過統計“不純度”來做判斷的,ID3 是基於信息增益做判斷,C4.5 在 ID3 的基礎上做了改進,提出了信息增益率的概念。實際上 CART 分類樹與 C4.5 算法類似,只是屬性選擇的指標採用的是基尼係數。

基尼係數本身反應了樣本的不確定度。當基尼係數越小的時候,說明樣本之間的差異性小,不確定程度低。分類的過程本身是一個不確定度降低的過程,即純度的提升過程。所以 CART 算法在構造分類樹的時候,會選擇基尼係數最小的屬性作爲屬性的劃分。

假設 t 爲節點,那麼該節點的 GINI 係數的計算公式爲:

這裏 p(Ck|t) 表示節點 t 屬於類別 Ck 的概率,節點 t 的基尼係數爲 1 減去各類別 Ck 概率平方和。

節點 D 的基尼係數等於子節點 D1 和 D2 的歸一化基尼係數之和,用公式表示爲:

歸一化基尼係數代表的是每個子節點的基尼係數乘以該節點佔整體父親節點 D 中的比例。

節點 D 被屬性 A 劃分後的基尼係數越大,樣本集合的不確定性越大,也就是不純度越高。

如何使用 CART 算法來創建分類樹

通過上面的講解你可以知道,CART 分類樹實際上是基於基尼係數來做屬性劃分的。在 Python 的 sklearn 中,如果我們想要創建 CART 分類樹,可以直接使用 DecisionTreeClassifier 這個類。創建這個類的時候,默認情況下 criterion 這個參數等於 gini,也就是按照基尼係數來選擇屬性劃分,即默認採用的是 CART 分類樹。

CART 迴歸樹的工作流程

CART 迴歸樹劃分數據集的過程和分類樹的過程是一樣的,只是迴歸樹得到的預測結果是連續值,而且評判“不純度”的指標不同。在 CART 分類樹中採用的是基尼係數作爲標準,那麼在 CART 迴歸樹中,如何評價“不純度”呢?實際上我們要根據樣本的混亂程度,也就是樣本的離散程度來評價“不純度”。

樣本的離散程度具體的計算方式是,先計算所有樣本的均值,然後計算每個樣本值到均值的差值。我們假設 x 爲樣本的個體,均值爲 u。爲了統計樣本的離散程度,我們可以取差值的絕對值,或者方差。

其中差值的絕對值爲樣本值減去樣本均值的絕對值:

方差爲每個樣本值減去樣本均值的平方和除以樣本個數:

所以這兩種節點劃分的標準,分別對應着兩種目標函數最優化的標準,即用最小絕對偏差(LAD),或者使用最小二乘偏差(LSD)。這兩種方式都可以讓我們找到節點劃分的方法,通常使用最小二乘偏差的情況更常見一些。

如何使用 CART 迴歸樹做預測

這裏我們使用到 sklearn 自帶的波士頓房價數據集,該數據集給出了影響房價的一些指標,比如犯罪率,房產稅等,最後給出了房價。

CART 決策樹的剪枝

CART 決策樹的剪枝主要採用的是 CCP 方法,它是一種後剪枝的方法,英文全稱叫做 cost-complexity prune,中文叫做代價複雜度。這種剪枝方式用到一個指標叫做節點的表面誤差率增益值,以此作爲剪枝前後誤差的定義。用公式表示則是:

其中 Tt 代表以 t 爲根節點的子樹,C(Tt) 表示節點 t 的子樹沒被裁剪時子樹 Tt 的誤差,C(t) 表示節點 t 的子樹被剪枝後節點 t 的誤差,|Tt|代子樹 Tt 的葉子數,剪枝後,T 的葉子數減少了|Tt|-1。

所以節點的表面誤差率增益值等於節點 t 的子樹被剪枝後的誤差變化除以剪掉的葉子數量。

  • 生成子樹序列:因爲我們希望剪枝前後誤差最小,所以我們要尋找的就是最小α值對應的節點,把它剪掉。這時候生成了第一個子樹。重複上面的過程,繼續剪枝,直到最後只剩下根節點,即爲最後一個子樹。
  • 驗證:得到了剪枝後的子樹集合後,我們需要用驗證集對所有子樹的誤差計算一遍。可以通過計算每個子樹的基尼指數或者平方誤差,取誤差最小的那個樹,得到我們想要的結果。

總結

今天我給你講了 CART 決策樹,它是一棵決策二叉樹,既可以做分類樹,也可以做迴歸樹。你需要記住的是,作爲分類樹,CART 採用基尼係數作爲節點劃分的依據,得到的是離散的結果,也就是分類結果;作爲迴歸樹,CART 可以採用最小絕對偏差(LAD),或者最小二乘偏差(LSD)作爲節點劃分的依據,得到的是連續值,即迴歸預測結果。

最後我們來整理下三種決策樹之間在屬性選擇標準上的差異:

  • ID3 算法,基於信息增益做判斷;
  • C4.5 算法,基於信息增益率做判斷;
  • CART 算法,分類樹是基於基尼係數做判斷。迴歸樹是基於偏差做判斷。

實際上這三個指標也是計算“不純度”的三種計算方式。

在工具使用上,我們可以使用 sklearn 中的 DecisionTreeClassifier 創建 CART 分類樹,通過 DecisionTreeRegressor 創建 CART 迴歸樹。

你可以用代碼自己跑一遍我在文稿中舉到的例子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章