1. 程式人生 > >機器學習之分類迴歸樹CART

機器學習之分類迴歸樹CART

CART:Classification and regression tree,分類與迴歸樹。(是二叉樹)

CART是決策樹的一種,主要由特徵選擇,樹的生成和剪枝三部分組成。它主要用來處理分類和迴歸問題,下面對分別對其進行介紹。

1、迴歸樹:使用平方誤差最小準則

訓練集為:D={(x1,y1), (x2,y2), …, (xn,yn)}。

輸出Y為連續變數,將輸入劃分為M個區域,分別為R1,R2,…,RM,每個區域的輸出值分別為:c1,c2,…,cm則迴歸樹模型可表示為:

則平方誤差為:

假如使用特徵j的取值s來將輸入空間劃分為兩個區域,分別為:

我們需要最小化損失函式,即:

  其中c1,c2分別為R1,R2區間內的輸出平均值。(此處與統計學習課本上的公式有所不同,在課本中裡面的c1,c2都需要取最小值,但是,在確定的區間中,當c1,c2取區間輸出值的平均值時其平方會達到最小,為簡單起見,故而在此直接使用區間的輸出均值。)

  為了使平方誤差最小,我們需要依次對每個特徵的每個取值進行遍歷,計算出當前每一個可能的切分點的誤差,最後選擇切分誤差最小的點將輸入空間切分為兩個部分,然後遞迴上述步驟,直到切分結束。此方法切分的樹稱為最小二乘迴歸樹。

最小二乘迴歸樹生成演算法:

1)依次遍歷每個特徵j,以及該特徵的每個取值s,計算每個切分點(j,s)的損失函式,選擇損失函式最小的切分點。

2)使用上步得到的切分點將當前的輸入空間劃分為兩個部分

3)然後將被劃分後的兩個部分再次計算切分點,依次類推,直到不能繼續劃分。

4)最後將輸入空間劃分為M個區域R1,R2,…,RM,生成的決策樹為:

其中cm為所在區域的輸出值的平均。

  總結:此方法的複雜度較高,尤其在每次尋找切分點時,需要遍歷當前所有特徵的所有可能取值,假如總共有F個特徵,每個特徵有N個取值,生成的決策樹有S個內部節點,則該演算法的時間複雜度為:O(F*N*S)

2、分類樹:使用基尼指數最小化準則

基尼指數:假如總共有K類,樣本屬於第k類的概率為:pk,則該概率分佈的基尼指數為:

基尼指數越大,說明不確定性就越大。

對於二類分類:

使用特徵A=a,將D劃分為兩部分,即D1(滿足A=a的樣本集合),D2(不滿足A=a的樣本集合)。則在特徵A=a的條件下D的基尼指數為:

Gini(D):表示集合D的不確定性。

Gini(A,D):表示經過A=a分割後的集合D的不確定性。

CART生成演算法:

1)依次遍歷每個特徵A的可能取值a,對每一個切分點(A, a)計算其基尼指數。

2)選擇基尼指數最小的切分點作為最優切分點。然後使用該切分點將當前資料集切分成兩個子集。

3)對上步切出的兩個子集分別遞迴呼叫1)和2),直至滿足停止條件。(演算法停止的條件是樣本個數小於預定閥值,或者樣本集的基尼指數小於預定閥值或者沒有更多特徵)

4)生成CART決策樹。

3、CART樹剪枝

  通過CART剛生成的決策樹我們記為T0,然後從T0的底端開始剪枝,直到根節點。在剪枝的過程中,計算損失函式:

  

  注:引數此處為了方便編輯使用a來表示。

  a>=0,C(T)為訓練資料的預測誤差,|T|為模型的複雜度。

  對於一個固定的a,在T0中一定存在一顆樹Ta使得損失函式Ca(T)最小。也就是每一個固定的a,都存在一顆相應的使得損失函式最小的樹。這樣不同的a會產生不同的最優樹,而我們不知道在這些最優樹中,到底哪顆最好,於是我們需要將a在其取值空間內劃分為一系列區域,在每個區域都取一個a然後得到相應的最優樹,最終選擇損失函式最小的最優樹。

  現在對a取一系列的值,分別為:a0<a1<…<an<+無窮大。產生一系列的區間[ai,ai+1)。在每個區間內取一個值ai,對每個ai,我們可以得到一顆最優樹Tai。於是我們得到一個最優樹列表{T0,T1,…,Tn}。

  那麼對於一個固定的a,如何找到最優的子樹?

  現在假如節點t就是一棵樹,一顆單節點的樹,則其損失函式為:

Ca(t)=C(t)+a*1

  對於一個以節點t為根節點的樹,其損失函式為:

Ca(Tt)=C(Tt)+a*|Tt|

  當a=0時,即沒有剪枝時,Ca(t) > Ca(Tt)。因為使用決策樹分類的效果肯定比將所有樣本分成一個類的效果要好。即使出現過擬合。

   然而,隨著a的增大,Ca(t)和Ca(Tt)的大小關係會出現變化(即Ca(t)- Ca(Tt)隨著a單調遞減。只是猜測,未經證明)。所以會出現Ca(t)= Ca(Tt),即t和Tt有相同的損失函式,而t的節點少,故而選擇t。

當Ca(t)= Ca(Tt)時,即:

  據上分析,在T0中的每個內部節點t,計算a的值,它表示剪枝後整體損失函式減少的程度。在T0中剪去a最小的子樹Tt,將得到的新的樹記為T1,同時將此a記為a1。即T1為區間[a1,a2)上的最優樹。

  a與損失函式之間的關係分析:當a=0時,此時未進行任何剪枝,因為產生過擬合,所以損失函式會較大,而隨著a的增大,產生的過擬合會慢慢消退,因而,損失函式會慢慢減小,當a增大到某一值時,損失函式會出現一個臨界值,因而a超過此臨界值繼續增大的話損失函式就會因而模型越來越簡單而開始增大。所以我們需要找到一個使損失函式最小的臨界點a。

  如何找到使損失函式最小的a呢?我們通過嘗試的方式,依次遍歷生成樹的每一個內部節點,分別計算剪掉該內部節點和不剪掉該內部節點時的整體損失函式,當這兩種情況的損失函式相等時,我們可以得到一個a,此a表示當前需要剪枝的最小a。這樣每個內部節點都能計算出一個a。此a表示整體損失函式減少的程度。

  那麼選擇哪個a來對生成樹進行剪枝呢?我們選擇上面計算出的最小的a來進行剪枝。假如我們選擇的不是最小的a進行剪枝的話,則至少存在兩處可以剪枝的內部節點,這樣剪枝後的損失函式必然會比只剪枝一處的損失要大(這句話表述的可能不準確),為了使得損失函式最小,因而選最小的a來進行剪枝。

  在選出a之後,我們就需要計算該a對應的使損失函式最小的子樹。即從樹的根節點出發,逐層遍歷每個內部節點,計算每個內部節點處是否需要剪枝。剪枝完之後的樹便是我們所需要的樹。

CART剪枝演算法:

1)設k=0,T=T0, a=+無窮大

2)自下向上地對各內部節點進行遍歷,計算C(Tt),|Tt|及g(t)

a=min(a, g(t));

3)自上向下訪問各內部節點t,若g(t)=a,則進行剪枝,並對t以多數表決的方式決定其類。得到樹T

4)若T不是由根節點單獨構成的樹,則重複步驟3)得到一系列的子樹。

5)最後使用交叉驗證的方式從子樹序列中選取最優子樹

CART 有時也可以不進行裁剪的,樹較小的時候,例如JDA人臉檢測演算法中就沒有裁剪樹!