注:本系列全部博客將持續更新併發布在github和gitee上,您能夠經過github、gitee下載本系列全部文章筆記文件。html
上一篇博客中介紹了ID3和C4.5兩種決策樹算法,這兩種決策樹都只能用於分類問題,而本文要說的CART(classification and regression tree)決策樹不只能用於分類問題,也能用於迴歸問題。git
與ID3算法和C4.5算法相比,CART 還有個特性就是其全部非葉子結點都只有兩個子樹,也就是說在根據特徵屬性分裂數據集時,不管該特徵屬性有多少個可能取值,都只有兩種選擇——‘是’和‘否’,以上文中判斷是不是程序員數據集爲例,若是根據近視程度進行分裂,能夠將數據集分爲{‘輕微’}和{‘中等’,‘嚴重’}兩個數據集(固然也能夠是其兩種組合)而後在進一步迭代中進一步細化分數據集。程序員
下面,咱們分別說說CART算法如何解決分類問題和迴歸問題。github
對於分類問題,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$的基尼指數爲:spa
$$Gini(X,A) = \left| {\frac{{{X_1}}}{X}} \right|Gini({X_1}) + \left| {\frac{{{X_2}}}{X}} \right|Gini({X_2})$$htm
接下來,咱們經過實例演示如何應用基尼指數選擇最優分裂特徵屬性。仍是使用上篇博客中介紹ID3算法時使用過的數據集,以下所示。先來計算三個特徵屬性各個可能取值的基尼指數。blog
對屬性$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算法中是計算基尼指數。
此時,咱們研究的已是迴歸問題了(關於迴歸與分類,在討論線性迴歸算法的時候已經分析過,若是還不清楚,傳送門走起)因此,請轉變思路,對於任意一個$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)步驟繼續劃分,直到節點中數據集知足指定條件則決策樹構建完成。
不管是面對分類問題,仍是迴歸問題,最終生成的樹都有可能過於複雜,容易發生過擬合的狀況,因此決策樹構建完成後,有必要進一步完成數剪枝。
本文代價複雜度剪枝 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}$,以及對應的子樹。接下來剩餘的工做就是利用獨立的驗證數據集計算每一個子樹的平方偏差或者基尼指數,選擇偏差最小的那個子樹做爲最優的剪枝後的樹。
在本文末尾對3種決策樹算法作一個簡單對比總結:
原文出處:https://www.cnblogs.com/chenhuabin/p/11774926.html