1. 程式人生 > >機器學習回顧篇(8):CART決策樹演算法

機器學習回顧篇(8):CART決策樹演算法

注:本系列所有部落格將持續更新併發布在github和gitee上,您可以通過github、gitee下載本系列所有文章筆記檔案。

1 引言

上一篇部落格中介紹了ID3和C4.5兩種決策樹演算法,這兩種決策樹都只能用於分類問題,而本文要說的CART(classification and regression tree)決策樹不僅能用於分類問題,也能用於迴歸問題。

與ID3演算法和C4.5演算法相比,CART 還有個特性就是其所有非葉子結點都只有兩個子樹,也就是說在根據特徵屬性分裂資料集時,無論該特徵屬性有多少個可能取值,都只有兩種選擇——‘是’和‘否’,以上文中判斷是否是程式設計師資料集為例,如果根據近視程度進行分裂,可以將資料集分為{‘輕微’}和{‘中等’,‘嚴重’}兩個資料集(當然也可以是其兩種組合)然後在進一步迭代中進一步細化分資料集。

下面,我們分別說說CART演算法如何解決分類問題和迴歸問題。

2 分類問題

對於分類問題,CART演算法採用基尼指數作為最優分裂特徵屬性選擇標準。

先來說說基尼指數,與熵一樣,基尼指數越小則資料集不確定性越小,代表著資料集純度越高。給定資料集$X$包含$L$個分類,那麼資料集$X$的基尼指數為:

 $$Gini(X) = \sum\limits_l^L {\frac{{|{X_l}|}}{{|X|}}(1 - \frac{{|{X_l}|}}{{|X|}})}  = 1 - {\sum\limits_{l = 1}^L {\left( {\frac{{|{X_l}|}}{{|X|}}} \right)} ^2}$$

假設$A$是資料集$X$中包含若干個可能取值的一個特徵屬性,$a$是$A$的其中一個可能取值,將資料集$X$按照$a$進行劃分,就可以分為兩個資料集,分別是${X_1} = \left\{ {x \in X|{x_A} = a} \right\}$和${X_2} = \left\{ {x \in X|{x_A} \ne a} \right\}$,那麼在特徵$A$下,集合$X$的基尼指數為:

$$Gini(X,A) = \left| {\frac{{{X_1}}}{X}} \right|Gini({X_1}) + \left| {\frac{{{X_2}}}{X}} \right|Gini({X_2})$$

接下來,我們通過例項演示如果應用基尼指數選擇最優分裂特徵屬性。還是使用上篇部落格中介紹ID3演算法時使用過的資料集,如下所示。先來計算三個特徵屬性各個可能取值的基尼指數。

對屬性$A$的“穿格子襯衫”這個值計算基尼指數:

$$Gini(X,{A_1}) = \frac{5}{{10}} \times \left\{ {2 \times \frac{4}{5} \times \frac{1}{5}} \right\} + \frac{5}{{10}} \times \left\{ {2 \times \frac{3}{5} \times \frac{2}{5}} \right\} = 0.4$$

對屬性$A$的“不穿格子襯衫”這個值計算基尼指數,由於只有兩個屬性,無論按照哪個屬性來計算結果都一樣,所以:

$$Gini(X,{A_2}){\text{ = }}Gini(X,{A_1}) = 0.4$$

對屬性$B$的“嚴重”這個值計算基尼指數:

$$Gini(X,{B_1}) = \frac{3}{{10}} \times \left\{ {2 \times \frac{2}{3} \times \frac{1}{3}} \right\} + \frac{7}{{10}} \times \left\{ {2 \times \frac{5}{7} \times \frac{2}{7}} \right\} = 0.42$$

對屬性$B$的“中等”這個值計算基尼指數:

$$Gini(X,{B_2}) = \frac{4}{{10}} \times \left\{ {2 \times \frac{4}{4} \times \frac{0}{4}} \right\} + \frac{6}{{10}} \times \left\{ {2 \times \frac{3}{6} \times \frac{3}{6}} \right\} = 0.3$$

對屬性$B$的“輕微”這個值計算基尼指數:

$$Gini(X,{B_3}) = \frac{3}{{10}} \times \left\{ {2 \times \frac{1}{3} \times \frac{2}{3}} \right\} + \frac{7}{{10}} \times \left\{ {2 \times \frac{6}{7} \times \frac{1}{7}} \right\} = 0.46$$

對屬性$C$的“嚴重”這個值計算基尼指數:

$$Gini(X,{C_1}) = \frac{3}{{10}} \times \left\{ {2 \times \frac{0}{3} \times \frac{3}{3}} \right\} + \frac{7}{{10}} \times \left\{ {2 \times \frac{4}{7} \times \frac{3}{7}} \right\} = 0.34$$

對屬性$C$的“中等”這個值計算基尼指數:

$$Gini(X,{C_2}) = \frac{3}{{10}} \times \left\{ {2 \times \frac{1}{3} \times \frac{2}{3}} \right\} + \frac{7}{{10}} \times \left\{ {2 \times \frac{5}{7} \times \frac{2}{7}} \right\} = 0.42$$

對屬性$C$的“輕微”這個值計算基尼指數:

$$Gini(X,{C_3}) = \frac{3}{{10}} \times \left\{ {2 \times \frac{1}{3} \times \frac{2}{3}} \right\} + \frac{7}{{10}} \times \left\{ {2 \times \frac{6}{7} \times \frac{1}{7}} \right\} = 0.46$$

可見,屬性$B$的“中等“取值時具有最小的基尼指數,所以這個值作為當前資料集的最優分裂特徵屬性值。分裂後,可以獲得兩個資料集,對獲得的資料集繼續計算基尼指數,選擇最優分裂特徵屬性值,如此迭代形成一顆完整的決策樹。

對於連續型特徵屬性,可以參照C4.5演算法對連續型特徵屬性的處理方法,只不過在CART演算法中是計算基尼指數。

3 迴歸問題

此時,我們研究的已經是迴歸問題了(關於迴歸與分類,在討論線性迴歸演算法的時候已經分析過,如果還不清楚,傳送門走起,所以,請轉變思路,對於任意一個$x \in X$,經過決策樹後的輸出$f(x)$的可能取值已經不再像之前的分類決策樹那樣,$f(x)$的取值只可能是在$X$中出現過的那幾種取值,迴歸樹最後的輸出$f(x)$可能是之前沒有出現過的,甚至連可能值的個數都不固定。所以,對於迴歸樹,首先解決的問題就是如何確定$f(x)$的可能值。

對於資料集$X$,假設我們在其特徵屬性$A$上早上一個值$a$將資料集劃分成兩類:

$${X_1} = \{ x|{x_A} \leqslant a\} $$

$${X_2} = \{ x|{x_A} > a\} $$

在這兩個類上的輸出值$f(x)$分別為${c_1}$和${c_2}$,那麼根據特徵屬性$A$的值$a$對$X$進行劃分,所產生的總誤差是:

$$Los{s_{A,a}} = \sum\limits_{x \in {X_1}} {(y - {c_1}} {)^2} + \sum\limits_{x \in {X_2}} {(y - {c_2}} {)^2}$$

式中,$y$是$x$對應的真實值。我們的目標就是使得$Los{s_{A,a}}$最小化時的${c_1}$和${c_2}$,目標函式為:

$${\min \sum\limits_{x \in {X_1}} {{{(y - {c_1})}^2}}  + \min \sum\limits_{x \in {X_2}} {{{(y - {c_2})}^2}} }$$

那麼,當${c_1}$和${c_2}$取什麼值的的時候$Los{s_{A,a}}$最小呢?根據最小二乘的性質可知,當${c_1}$和${c_2}$分為為${X_1}$和${X_2}$中所有$y$的平均值的時候${c_1}$和${c_2}$去的最小值,即:

$${c_i} = ave(y|x \in {X_i})$$

所以,如果根據$a$劃分之後得到的是葉子結點,那麼最終輸出的值就是所屬樣本子集所有$y$的平均值。

$$f(x)={c_i} = ave(y|x \in {X_i})$$

對數如何確定輸出值的問題,就已經解決了。接下來還剩兩個個問題需要解決,那就是選擇哪個屬性作為最優分割特徵屬性以及選擇哪個值作為最佳的分割點。

對於這個問題,可以通過遍歷資料集各特徵屬性的可能取值的方式來解決:對資料集$X$中各特徵屬性$A$,計算其所有取值$a$下的$Los{s_{A,a}}$,然後對比所有$Los{s_{A,a}}$,取值最小的$Los{s_{A,a}}$所對應的特徵屬性$A$為當前最優分裂特徵屬性,$a$為最佳分裂點。

至此,如何確定各分支的輸出值、如何選擇最優分割特徵屬性和分割點的問題都已解決,最後總結一下CART演算法在迴歸問題中的決策樹構建流程:

(1)對當前資料集$X$,計算所有特徵屬性$A$下所有取值$a$作為分割點時的最小$Los{s_{A,a}}$;

(2)對比所有$Los{s_{A,a}}$,選擇最小的$Los{s_{A,a}}$所對應的特徵屬性$A$為當前最優分裂特徵屬性,$a$為最佳分裂點將資料集劃分都左右兩個子樹中;

(3)對左右兩個子樹的資料集重複(1)、(2)步驟繼續劃分,直到節點中資料集滿足指定條件則決策樹構建完成。

4 樹剪枝

無論是面對分類問題,還是迴歸問題,最終生成的樹都有可能過於複雜,容易發生過擬合的情況,所以決策樹構建完成後,有必要進一步完成數剪枝。

本文代價複雜度剪枝 Cost-Complexity Pruning(CCP) 方法,過程如下:

輸入:CART演算法生成的決策樹$T_0$  
輸出:剪枝後的最優決策樹${T_\alpha }$  
(1)令$k=0$, $T=T_0$,$\alpha  =  + \infty $;   
(2)自上而下地對各內部節點計算$C({T_t})$,$|{T_t}|$以及

$$g(t) = {{C(t) - C({T_t})} \over {|{T_t}| - 1}}$$

$$\alpha  = \min (\alpha ,g(t))$$ 

其中,$T_t$表示以$t$為根節點的子樹,${C(t)}$是對$t$進行剪枝後對訓練資料集的預測誤差,${C({T_t})}$是對訓練資料集的預測誤差,${|{T_t}|}$是$T_t$的葉子結點個數;

(3)自上而下地訪問內部節點$t$,如果有$g(t)=\alpha$,則對$t$進行剪枝,並對葉子結點$t$以多數表決法決定輸出,得到樹$T$;

(4)令$k=k+1$,${\alpha _k} = \alpha $,${T_k} = T$;

(5)如果$T$不是由根節點單獨構成的樹,則回到步驟(3); 

(6)採用交叉驗證法在子樹序列${T_0},{T_1}, \cdots ,{T_k} = T$選取最優的子樹${T_\alpha }$。

要理解CART決策樹的整個剪枝過程,關鍵是明白$g(t)$的含義,對於一顆理想的決策樹,我們當然希望預測誤差越小越好,樹的規模也越小越好,但是兩者卻不能兩全,因為往往預測誤差隨著樹規模的增大而減小,所以單獨考慮預測誤差變化或者樹規模變化都不合適,最好是選擇一個衡量標準能夠同時考慮到預測誤差變化量和樹規模變化,例如兩者的比值。

仔細$g(t)$的計算髮現,分子是剪枝前後預測誤差相減,也就是預測誤差變化量,分子是剪枝前後葉子結點數的變化量,所以我們可以認為兩者的比值就是樹$t$每個葉子節點所帶來的的預測誤差的變化量,或者說樹$t$所帶來的的預測誤差變化率——這就是$g(t)$的含義。
為什麼每次對$g(t)$最小的節點進行剪枝呢?因為$g(t)$越小代表對$t$對整個決策樹的作用越小,對其進行剪枝對決策樹的準確率影響也是最想的,當然應該優先被剪枝。

如果還不明白,那麼通過下面的例子來理解吧(例子來源於:https://www.jianshu.com/p/b90a9ce05b28)。 

有下面這個座標中中的資料集,以及根據資料集構建好的決策樹,如下圖所示:

此時,${\alpha _1} = 0$,樹中共有3個節點,對每個節點分別計算其$g(t)$:

$t_1$、$t_2$節點的$g(t)$最小,我們選擇剪枝少的節點,也就是$t_3$進行剪枝,並且令${\alpha _2} = {1 \over 8}$。剪枝後決策樹如下:

剩下兩個節點,繼續計算每一個節點的$g(t)$:

顯然,$t_2$的$g(t)$更小,所以對$t_2$進行剪枝,並令${\alpha _3} = {1 \over 8}$:

這時候僅剩下一個$t_1$,計算後有$g({t_3}) = {1 \over 4}$,所以${\alpha _4} = {1 \over 4}$

完成上述所有計算後,我們得到序列${\alpha _0} = 0,{\alpha _2} = {1 \over 8},{\alpha _3} = {1 \over 8},{\alpha _4} = {1 \over 4}$,以及對應的子樹。接下來剩餘的工作就是利用獨立的驗證資料集計算每個子樹的平方誤差或者基尼指數,選擇誤差最小的那個子樹作為最優的剪枝後的樹。

5 總結

在本文末尾對3種決策樹演算法做一個簡單對比總結:

相關推薦

機器學習回顧8CART決策演算法

注:本系列所有部落格將持續更新併發布在github和gitee上,您可以通過github、gitee下載本系列所有文章筆記檔案。 1 引言 上一篇部落格中介紹了ID3和C4.5兩種決策樹演算法,這兩種決策樹都只能用於分類問題,而本文要說的CART(classification and regression

機器學習回顧2最小二乘法

1 引言 在機器學習常用的優化演算法中,梯度下降法和最小二乘法佔盡了風騷。梯度下降法上一篇中已經詳細介紹過了,那麼這一篇,我們繼續說一說最小二乘法。 2 什麼是最小二乘法 描述預測模型準確程度有多重不同的方法: (1)誤差和最小化。這種方法存在的問題是正負誤差會相互抵消,導致描述不準確。 (2)誤差

機器學習回顧4邏輯迴歸

1 引言 邏輯不邏輯,迴歸非迴歸。 回想當年初次學習邏輯迴歸演算法時,看到”邏輯迴歸“這個名字,第一感覺是這是一個與線性迴歸類似的迴歸類別的演算法,只不過這個演算法突出”邏輯“,或者與某個以”邏輯“命名的知識點有關。可後來卻發現,這是

機器學習回顧5樸素貝葉斯演算法

1 引言 說到樸素貝葉斯演算法,很自然地就會想到貝葉斯概率公式,這是我們在高中的時候就學過的只是,沒錯,這也真是樸素貝葉斯演算法的核心,今天我們也從貝葉斯概率公式開始,全面擼一擼樸素貝葉斯演算法。 2 貝葉斯概率公式 2.1 聯合概率與全概率公式 定義1:完備事件組 ${A_1} \cup {A_2

機器學習回顧6KNN演算法

  1 引言¶   本文將從演算法原理出發,展開介紹KNN演算法,並結合機器學習中常用的Iris資料集通過程式碼例項演示KNN演算法用法和實現。

機器學習回顧7決策演算法ID3、C4.5

  注:本系列所有部落格將持續更新併發布在github上,您可以通過github下載本系列所有文章筆記檔案。   1 演算法概述¶

機器學習回顧10感知機模型

  注:本系列所有部落格將持續更新併發布在github和gitee上,您可以通過github、gitee下載本系列所有文章筆記檔案。   1 引言¶ 感知機是一種簡單且易於實現的二分類判別模型,主要思想是通過誤分類

機器學習回顧11支援向量機SVM

  1. 引言¶ SVM,Support Vector Machine,也就是我們中文名的支援向量機,我相信,只要是與機器學習有過照面的童鞋或多或少都聽說過這個名字。作為機器學習家族中的老牌成員,其經典自不必說。從原理和特性上講,SVM

機器學習回顧12整合學習之Bagging與隨機森林

  1 引言¶ 整合學習演算法是當下炙手可熱的一類演算法,在諸多機器學習大賽中都頻繁出現它的身影。準確來說,整合學習演算法並不是一個單獨的機器學習演算法,而是通過構建多個學習器,博採眾家之長,共同求解問題的一種思想。古語有云:&ldquo

機器學習回顧13整合學習之AdaBoost

  在上一篇部落格中,我們總結了整合學習的原理,並展開介紹了整合學習中Bagging和隨機森林這一分枝演算法,在本篇部落格中,我們繼續介紹另一個分枝——Boosting,並對Boosting系列中的經典演算法Adaboost

機器學習回顧14主成分分析法PCA

  1 引言¶ 在展開資料分析工作時,我們經常會面臨兩種困境,一種是原始資料中特徵屬性太少,“巧婦難為無米之炊”,很難挖掘出潛在的規律,對於這種情況,我們只能在收集這一環節上多下功夫;另一種困境剛好相反,那就是特徵

機器學習回顧15整合學習之GDBT

          1 引言¶ 梯度提升樹演算法(Gradient Boosting Decision Tree,GBDT)是一個非常經典的機器學習演算法,和我們前面介紹過的Adaboost演算法一樣,都是提

機器學習回顧16蒙特卡洛演算法

          蒙特卡羅(MC,Monte Carlo)方法是一種隨機取樣模擬求解的方法,又被稱統計試驗方法或者統計模擬方法。起初,蒙特卡羅方法的提出是20世紀40年代馮·諾伊曼,

學習筆記使用決策演算法檢測POP3暴力破解

1.資料蒐集     載入KDD 99中的資料: def load_kdd99(filename): x=[] with open(filename) asf: for line in f: line=line.st

機器學習實戰教程線性回歸基礎

學習 reg style spa 目標 pub auto 機器 輸入 一 什麽是回歸?   回歸的目的是預測數值型的目標值,最直接的辦法是依據輸入,寫入一個目標值的計算公式。   假如你想預測小姐姐男友汽車的功率,可能會這麽計算:               Ho

機器學習實戰教程決策實戰之為自己配個隱形眼鏡

原文連結:cuijiahua.com/blog/2017/1… 一、前言 上篇文章機器學習實戰教程(二):決策樹基礎篇之讓我們從相親說起講述了機器學習決策樹的原理,以及如何選擇最優特徵作為分類特徵。本篇文章將在此基礎上進行介紹。主要包括: 決策樹構建 決策樹視覺化 使用決

機器學習實戰教程樸素貝葉斯實戰之新浪新聞分類

原文連結: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_5_bayes_2.html 一、前言 上篇文章機器學習實戰教程(四):樸素貝葉斯基礎篇之言論過濾器講解了樸素貝葉斯的基礎知識。本篇文章將在此基礎上進行擴充套件,你將看到以下內容: 拉普拉

機器學習實戰教程樸素貝葉斯基礎之言論過濾器

word 最可 dog 一個 mac github上 開課 和數 基礎上 原文鏈接: Jack-Cui,https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html 一、前言 樸素貝葉斯算法是有監督的學習算法,解決的是分類問題,

深入理解java虛擬機器系列初為什麼要學習JVM?

前言 本來想著關於寫JVM這個專欄,直接寫知識點乾貨的,但是想著還是有必要開篇講一下為什麼要學習JVM,這樣的話讓一些學習者心裡有點底的感覺比較好... 原因一:面試 不得不說,隨著網際網路門檻越來越高,JVM知識也是中高階程式設計師階段必問的一個話題!現在不像以前了,以前會點html都好找工作,現在由於學習

中國mooc北京理工大學機器學習第二周分類

kmeans 方法 輸入 nump arr mod 理工大學 each orm 一、K近鄰方法(KNeighborsClassifier) 使用方法同kmeans方法,先構造分類器,再進行擬合。區別是Kmeans聚類是無監督學習,KNN是監督學習,因此需要劃分出訓練集和測試