決策樹算法之分類迴歸樹 CART(Classification and Regression Trees)【1】

分類迴歸樹 CART 是決策樹家族中的基礎算法,它很是直覺(intuitive),但看網上的文章,不多能把它講的通俗易懂(也許是我理解能力不夠),幸運的是,我在 Youtube 上看到了這個視頻,可讓你在沒有任何機器學習基礎的狀況下掌握 CART 的原理,下面我嘗試着把它寫出來,以加深印象.算法

決策樹的結構

下圖是一個簡單的決策樹示例:機器學習

假設上面這個決策樹是一個用來判斷病人是否患有心臟病的系統,當病人前來就醫時,系統首先會問他:血液循環是否正常?此時若是病人回答是,系統會走左邊的分支,並繼續問:血管是否不堵塞?若是此時病人回答是,系統便會判斷該病人沒有患心臟病,反之則會判斷他患有心臟病。同理,若是病人的第一個問題的回答是否,則決策樹會走到右邊的分支,接下來會繼續後面的提問,直到來到樹的根部,以輸出結果。學習

可見,決策樹是一個二叉樹結構的模型,它能夠被用來解決分類問題或迴歸問題,該樹的非葉子節點本質上是一些條件表達式,用來決定樹根到葉子的路徑,而葉子節點即是該模型的預測結果。網站

本文主要介紹如何構建一棵分類樹:ui

如何構建一棵分類樹

在構造這棵「判斷心臟病的決策樹」以前,咱們有一堆病人的診斷數據,以下編碼

胸口疼痛 血液循環正常 血管堵塞 患有心臟病
... ... ... ...

剛開始,咱們可使用「胸口疼痛」或者「血液循環正常」或者「血管堵塞」這三個特徵中的一個來做爲樹根,但這樣作會存在一個問題:任何上述特徵都沒法將是否患有心臟病分類得徹底正確,以下:3d

既然沒有絕對最優的答案,咱們通常會選擇一個相對最優的答案,即在這 3 個特徵中選擇一個相對最好的特徵做爲樹根,如何衡量它們的分類好壞呢?咱們可使用不純度(impurity)這個指標來度量,例以下圖中,P1(藍色機率分佈)相對於 P2(橙色機率分佈) 來講就是不純的。對於一個節點的分類結果來講(上圖黃色節點),固然但願它的分佈越純越好。cdn

計算一個分佈的不純度有不少方法,這裏使用的是基尼係數(Gini coefficient)——基尼係數越高,越不純,反之越純。計算基尼係數的公式很簡單:視頻

Gini = 1 - p_1^2 - \dots - p_i^2

這裏 p_i 表示離散機率分佈中的機率值,咱們來算一下上圖中 P1 和 P2 的基尼係數blog

Gini(P1) = 1 - 5 \times 0.2^2 = 0.8
Gini(P2) = 1 - 1^2 - 4 \times 0^2 = 0

可見 P1 的基尼係數更高,其更不純。

有了以上基礎,接下來咱們就能夠依次計算不一樣特徵分類的基尼不純度,從中選一個值最低的特徵來做爲樹根,以「胸口疼痛」特徵爲例,其左邊和右邊的分類結果的基尼不純度爲:

G(ChestPain_Y) = 1 - (\frac{105}{105+39})^2 - (\frac{39}{105+39})^2 = 0.395
G(ChestPain_N) = 1 - (\frac{34}{34+127})^2 - (\frac{127}{34+127})^2 = 0.336

那麼,「胸口疼痛」這個節點總體的不純度則爲左右兩個不純度的加權平均,以下:

G(ChestPain) = \frac{105+39}{105+39+34+125} \times 0.395 + \frac{34+125}{105+39+34+125} \times 0.336 = 0.364

同理,咱們也能夠計算出「血液循環正常」和「血管堵塞」的基尼不純度分別爲 0.360 和 0.381。相比之下,「血液循環正常」的值最小,該特徵即是咱們的樹根。

在選出了樹根後,原來的一份數據被樹根分紅了兩份,後續要作的事情相信不少同窗已經猜到了:對於新產生的兩份數據,每份數據再使用一樣的方法,使用剩下的特徵來產生非葉子節點,如此遞歸下去,直到知足下面兩個條件中的任意一條:

  1. 每條路徑上全部特徵都使用過
  2. 使用新特徵沒有使分類結果更好(此時不產生新的節點)

上述第 1 個條件很容易理解,咱們一塊兒來看下第 2 個條件,假設在建樹的過程當中,其中一條路徑以下:

如今咱們須要決定黃色的這部分數據是否還須要被「胸口疼痛」這個特徵分類,假設用「胸口疼痛」來分類該數據的結果以下:

接下來咱們就要對分類先後作效果對比,依然計算它們的基尼不純度,在分類前,基尼不純度爲:

G(before) = 1-(\frac{102}{102+13})^2 -(\frac{13}{102+13})^2 = 0.201

而使用「胸口疼痛」分類以後,基尼不純度爲(省去計算細節):

G(ChestPain) = 0.286

顯然繼續分類只會使結果更糟,因此該分支的創建提早結束了,且分支上只有「血液循環正常」和「血管堵塞」這兩個特徵來進行分類。

值得一提的是,在建樹過程當中,即使候選節點的基尼不純度更低,但若是該指標的下降不能超過必定的閾值,也不建議繼續加節點,這種作法能夠在必定程度上緩解過擬合的問題。例如:假設該閾值設定爲0.05,即使 G(胸口疼痛) 爲 0.16,也不繼續將「胸口疼痛」做爲該分支上的一個節點用來分類,由於此時基尼不純度只下降了 0.04,低於閾值 0.05。

如何處理離散型數據

上面例子中的數據是隻有 0 或者 1 的布爾類型的數據,若是遇到其餘類型的數據該怎麼處理呢?先來看一下離散型數據,這種類型的數據須要考慮 2 種狀況:

  1. 有順序的離散型數據,例如電商網站把商品的評論分爲:好評、中評和差評
  2. 順序無關的離散型數據,例如商品可能的顏色有:紅色、黃色和藍色

有順序的離散型數據

假如咱們有如下數據,它根據用戶對商品的評價來判斷用戶是否喜歡該商品,其中,對商品的評價被編碼爲 1(差評)、2(中評) 和 3(好評):

商品評價 是否喜歡
1 0
3 1
2 1
2 0
3 1
1 1
3 0

以上問題實際上等價於選擇一個評價值,它可以更好的把人們的喜愛分開,這個值能夠是 1 或者 2,即當商品評價「小於等於1」或者「小於等於2」時,判斷用戶不喜歡它,不然爲喜歡它,這裏沒有「小於等於3」這個選項,由於該選項會包含全部的數據,沒有分類價值;因而,根據上述兩個選項,咱們能夠對數據作以下 2 種分類:

接下來分別計算它們的基尼不純度,其中左邊的結果 G(1) = 0.486,而右邊 G(2) = 0.476;因而,當使用「商品評價」這個特徵來作分類時,該特徵的切分點(cutoff)爲「小於等於2」。

順序無關的離散型數據

咱們再來看一個根據商品的顏色來判斷用戶是否喜歡該商品的例子,有以下數據:

商品顏色 是否喜歡
RED 1
YELLOW 1
BLUE 0
YELLOW 1
BLUE 1
RED 0

對於以上數據,其做爲節點的判斷條件有如下 6 種可能:

  1. 紅色表示喜歡
  2. 黃色表示喜歡
  3. 藍色表示喜歡
  4. 紅色或黃色表示喜歡
  5. 紅色或藍色表示喜歡
  6. 黃色或藍色表示喜歡

相似的,咱們對每一種可能的分類結果計算其基尼不純度,而後再選擇最低的那個值對應的條件。

如何處理連續型數據

最後咱們再來看看特徵是連續型數據的狀況,例如咱們經過人的身高來判斷是否患有心臟病,數據以下:

身高 患有心臟病
220 1
180 1
225 1
155 0
190 0

處理這類數據的思路和上面幾種作法一致,也就是尋找一個使基尼不純度最低的 cutoff。具體步驟是,先對身高進行排序,而後求相鄰兩個數據之間的平均值,以每一個平均值做爲分界點,對目標數據進行分類,並計算它們的基尼不純度,以下:

身高 相鄰平均值 基尼不純度
225
222.5 0.4
220
205 0.27
190
185 0.47
180
167.5 0.3
155

因此,在使用「身高」來建樹時,其切分點爲 205,即」小於205」被判斷爲未患心臟病,而」不小於205「的會被診斷爲患病。

總結

本文主要介紹了 CART 中的分類樹的構建算法原理,及遇到了不一樣類型的數據時,該算法會如何處理,固然這並非分類樹的所有,由於決策樹容易致使過擬合的緣由,在建樹以後,每每會伴隨着」剪枝「的操做,這些內容以及迴歸樹部分會放在後面再作介紹。

參考:StatQuest: Decision Trees

相關文章
相關標籤/搜索