[TOC] 更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlhtml
決策樹C4.5算法雖然對決策樹ID3算法作了很大的改良,可是缺點也是很明顯的,沒法處理迴歸問題、使用較爲複雜的熵來做爲特徵選擇的標準、生成的決策樹是一顆較爲複雜的多叉樹結構,CART算法針對這些問題又作了進一步的優化。python
CART的英文名全稱是classification and regression tree,因此有時候也把CART稱它爲分類迴歸樹,分類迴歸樹由特徵選擇、樹的生成以及剪枝組成,既能夠用於分類也能夠用於迴歸。算法
# 基尼指數和熵示例圖 import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties %matplotlib inline font = FontProperties(fname='/Library/Fonts/Heiti.ttc') p = np.arange(0.001, 1, 0.001) gini = 2*p*(1-p) entropy = -(p*np.log2(p) + (1-p)*np.log2(1-p))/2 error = 1-np.max(np.vstack((p, 1-p)), 0) plt.plot(p, entropy, 'r-', label='基尼指數') plt.plot(p, gini, 'g-', label='熵之半$(1/2*H(p))$') plt.plot(p, error, 'b-', label='分類偏差率') plt.xlabel('p', fontproperties=font) plt.ylabel('損失', fontproperties=font) plt.legend(prop=font) plt.show()
![png](http://www.chenyoude.com/ml/02-23 決策樹CART算法_7_0.png?x-oss-process=style/watermark)數據結構
上圖能夠看出二分類問題中基尼指數和熵的曲線很是接近,所以基尼指數能夠做爲熵的一個近似替代。而CART算法就是使用了基尼指數來選擇決策樹的特徵,同時爲了進一步簡化基尼指數的計算,CART算法每次對某個特徵進行二分,所以CART算法構造的決策樹是一顆二叉樹模型。機器學習
CART算法相似於C4.5算法對連續值特徵的處理,只是CART算法使用基尼指數取代了信息增益比對連續值作了處理。函數
假設現有一個特徵$F$的特徵值爲連續值,從大到小排序爲$f_1,f_2,\ldots,f_m$,CART算法對相鄰樣本間的特徵值$f_i,f_{i+1}$取平均數,一共能夠獲得$m-1$個劃分點,其中第$j$個劃分點能夠表示爲學習
對於這$m-1$個劃分點,分別計算以該點做爲二元分類點的基尼指數,選擇基尼指數最小的點做爲該連續特徵的二元離散分類點,把改點記做$f_t$,則特徵值小於$f_t$的點記做$c_1$;特徵值大於$f_t$的點記做$c_2$,這樣就實現了連續特徵值的離散化。測試
CART算法對離散值特徵的處理採用的是不停的二分離散化特徵的思想。優化
假設一個訓練集$D$的某個特徵$F$有$f_1,f_2,f_3$三種類別。若是咱們使用的是ID3算法或者是C4.5算法,則會生成$3$個子節點,即三叉子節點,也所以致使決策樹變成一顆多叉樹。可是CART算法會基於這三個特徵造成$f_1$和$f_2,f_3$、$f_2$和$f_1,f_3$、$f_3$和$f_1,f_2$這三種組合,而且在這三個組合中找到基尼指數最小的組合,而後生成二叉子節點。網站
假設$f_1$和$f_2,f_3$在這三者中基尼指數最小,則生成的二叉作子節點爲$f_1$,二叉右子節點爲$f_2,f_3$。因爲右子節點並無被徹底分開,所以在以後會繼續求出$f_2$和$f_3$的基尼指數,而後找到最小的基尼指數來劃分特徵$F$。
迴歸CART樹和分類CART樹剪枝策略除了在特徵選擇的時候一個使用了均方偏差,另外一個使用了基尼指數,其餘內容都同樣。
不管是C4.5算法仍是CART算法造成的決策樹都很容易對訓練集過擬合,所以可使用剪枝的方式解決過擬合問題,這相似於線性迴歸中的正則化。
CART算法採用的過後剪枝法,即先生成決策樹,而後產生全部可能的剪枝後的CART樹,而後使用交叉驗證來檢驗各類剪枝的效果,選擇返回泛化能力最好的剪枝方法。即CART樹的剪枝方法可分爲兩步:
在剪枝過程當中,子樹$T$的損失函數爲
其中$T$是任意子樹,$\alpha \quad \alpha\geq0$爲正則化參數,它權衡訓練數據的擬合程度與模型的複雜度;$C(T)\(是訓練數據的預測偏差(分類樹使用基尼指數度量,迴歸樹使用均方差度量),\)|T|$是子樹$T$的葉子節點的數量。
當$\alpha=0$時沒有正則化,即原始的決策樹爲最優子樹;當$\alpha$逐漸增大時,則正則化強度越大,生成的最優子樹相比較原生的子樹就越小;當$\alpha=\infty$時,即正則化強度達到最大,此時由原始的決策樹的根節點組成的單節點樹爲最優子樹。所以對於固定的$\alpha$,從子樹的損失函數中能夠看出必定存在使損失函數$C_\alpha(T)$最小的惟一子樹$T_a$,$T_a$在損失函數最小的意義下是最優的。
能夠遞歸的方法對書進行剪枝。將$\alpha$從小增大,$0=\alpha_0<\alpha_1<\cdots\alpha_n<+\infty$,產生一系列的區間$[\alpha_i,\alpha_{i+1}),i=0,1,\ldots,n$;剪枝獲得的子序列對應着區間$\alpha{\in}{[\alpha_i,\alpha_{i+1})}\(的最優子樹序列\){T_0,T_1,\ldots,T_n}$(注:每一個區間內是有可能有多個子樹的),序列中的子樹是嵌套的。
從原始的決策樹$T_0$開始剪枝,對$T_0$的任意內部節點$t$,以$t$爲單結點樹的損失函數是
以$t$爲根節點的子樹$T_t$的損失函數是
當$\alpha=0$以及$\alpha$充分小時(最優子樹爲原始的決策樹),有不等式
當$\alpha$增大時,在某一$\alpha$有
當$\alpha$繼續增大時(最優子樹爲根節點組成的單節點樹),有
而且只要當$\alpha = {\frac {C(t)-C(T_t)} {|T_t|-1} }$(注:當$T_t$和$t$有相同的損失函數時該公式由$t$和$T_t$的損失函數聯立獲得)。因爲$t$的節點少,所以$t$比$T_t$更可取,所以能夠對子樹$T_t$剪枝,也就是將它的子節點所有剪掉,變爲一個葉子節點$t$。
上面說到能夠計算出每一個子樹是否剪枝的閾值$\alpha$,若是把全部的節點是否剪枝的值$\alpha$都計算出來,而後分別針對不一樣的$\alpha$所對應的剪枝後的最優子樹作交叉驗證,這樣就能夠選擇一個最優的$\alpha$,經過這個$\alpha$則能夠用對應的最優子樹做爲最終結果。
假設如今有一個原始的決策樹$T_0$。
最優子樹$T_\alpha$。
假設有訓練數據集$D$,中止計算的條件:節點中的樣本個數小於預約閾值,或樣本集的基尼指數小於預約閾值,或沒有更多特徵。
CART樹
CART算法從根節點開始,用訓練集遞歸的創建CART樹。
迴歸CART樹和分類CART樹的創建算法和過程大部分是相同的,因此本文只討論二者生成決策樹的區別,二者的區別有如下兩點
分類CART樹用基尼指數最小化準則,而回歸CART樹用均方偏差最小化準則做爲特徵和劃分點選擇的方法。
對任意的劃分特徵$F$,對應的任意劃分點$s$把訓練集$D$劃分紅兩個子集$D_1$和$D_2$,求出使得兩個子集$D_1$和$D_2$以及兩個子集之和的均方差最小的對應劃分點$s$特徵$F$和劃分點$s$,即
其中已經假設樣本按照某個特徵$F$和劃分點$s$劃分紅功,則輸入一個$x$會有一個輸出值$c_m$。$c_1$則是$D_1$數據集中全部的$x$的樣本輸出均值,$c_2$是$D_2$數據集中全部的$x$的樣本輸出均值。
使用該方法生成的迴歸CART樹一般稱做最小二乘迴歸樹(least squares regression tree)。
分類CART樹選擇機率最大的類別做爲樣本$A$的類別的方式不一樣的是:迴歸CART樹因爲輸出的不是類別,而是一個連續值,所以它一般採用的是使用最終葉子的均值或者中位數來預測輸出結果。
CART樹是決策樹的一次創新,摒棄了信息熵使用了基尼指數,基於C4.5算法能夠處理迴歸問題,可使用剪枝防止過擬合,解釋型強。
CART樹能夠說是完美的,可是它最大的一個問題就是CART算法會把全部的特徵所有用於構造決策樹中,這對於生成決策樹來說是一個很是大的問題,在集成學習中使用隨機森林將能一點程度的減輕該問題。
因爲隨機森林屬於集成學習,因此下一篇很遺憾的告訴你不是講隨機森林,而將帶你走入機率的天堂,即樸素貝葉斯法。