1. 程式人生 > >【機器學習基礎】梯度提升決策樹

【機器學習基礎】梯度提升決策樹

引言

上一節中介紹了《隨機森林演算法》,該演算法使用bagging的方式作出一些決策樹來,同時在決策樹的學習過程中加入了更多的隨機因素。該模型可以自動做到驗證過程同時還可以進行特徵選擇。
這一節,我們將決策樹和AdaBoost演算法結合起來,在AdaBoost中每一輪迭代,都會給資料更新一個權重,利用這個權重,我們學習得到一個g,在這裡我們得到一個決策樹,最終利用線性組合的方式得到多個決策樹組成的G。

1. 加權的決策樹演算法(Weighted Decision Tree Algorithm)

在引言中介紹了,我們利用AdaBoost的思想,為資料賦予不同的權重,而在將要介紹的Adaptive Boosted Decision Tree中,要建立加權的決策樹,所以接下來就要介紹它。
在之前含有權重的演算法中,權重作為衡量資料重要性的一項指標,用來評估訓練誤差,如下面的公式所示:

上面的公式中,權重是包含在誤差的公式中的,也就是說,我們想要構造一個帶有權重的決策樹演算法,需要改造決策樹的誤差度量函式。然而換一個角度,權重也可以等效於資料的重複次數,重複次數越多的資料,說明其越重要。在廣義的隨機演算法中,我們可以根據權重比例來進行隨機取樣(比如,如果權重比例是30%,那麼取樣該資料的概率就是30%),根據這種方式得到一組新的資料,那麼這組新的資料中的比例大概就是和權重的比例呈正比的,也就是說它能夠表達權重對於資料的意義。

在AdaBoost-DTree中,為了簡單起見,我們不去改變AdaBoost的框架,也不去修改決策樹的內部細節,而只是通過基於權重的訓練資料的取樣來實現。

1.1 弱決策樹演算法

在AdaBoost演算法中,我們通過錯誤率εt來計算單個的g的權重αt,那麼如果我們使用決策樹作為g的時候,g是一個完全長成的樹,該樹對整個資料集進行細緻的切分導致Ein=0,那麼這使得εt=0,但計算得到的權重αt會變成無限大。
其意義是,如果使用一個能力很強的樹作為g的話,那麼該演算法會賦予該樹無限大的權重或票數,最終得到了一棵“獨裁”的樹(因為AdaBoost的哲學意義是庶民政治,就是集中多方的意見,及時有的意見可能是錯誤的),違背了AdaBoost的宗旨。

上面的問題出在使用了所有的資料和讓樹完全長成這兩方面。針對這兩個問題,我們要通過剪枝和部分訓練資料得到一個弱一點的樹。
所以實際上,AdaBoost-DTree是通過sampling的方式得到部分訓練資料,通過剪枝的方式限制樹的高度,得到弱一點的決策樹。

1.2 AdaBoost-Stump

什麼樣是樹才是弱決策樹呢?
我們這裡限制這棵樹只有一層,即決策樁(Decision Stump)。這樣我們需要讓CART樹的不純度(impurity)儘可能低,學習一個決策樁。

所以,使用決策樁作為弱分類器的AdaBoost稱為AdaBoost-Stump,它是一種特殊的AdaBoost-DTree。

2. AdaBoost深入解釋和最佳化

我們回顧一下AdaBoost演算法流程:

其中權重un(t+1)通過◆t對un(t)進行修正得到,由於◆t是一個大於1的數,對錯誤資料加大權重以讓演算法更加重視錯分的資料。
我們可以用下面的方式來描述un(t+1):

下面的公式是我們將un(T+1)展開,我們看到圖中橘色的部分∑αt·gt(xn)是G(x)中的分數,它出現在AdaBoost的權重的表示式中,我們稱∑αt·gt(xn)為投票分數(voting score)。

所以,AdaBoost裡面每一個數據的權重,和exp(-yn(voting score on xn))呈正比。

2.1 投票分數(Voting Score)和間隔(Margin)的關係

線性混合(linear blending)等價於將假設看做是特徵轉換的線性模型:

其中αt·gt(xn)如果換作是wT·φ(xn)可能就更清楚了,這與下面給出的在SVM中的margin表示式對比,我們可以明白投票分數∑αt·gt(xn)的物理意義,即可以看做是沒有正規化的邊界(margin)。

所以,yn(voting score)是有符號的、沒有正規化的邊界距離,從這個角度來說,我們希望yn(voting score)越大越好,因為這樣的泛化能力越強。於是,exp(-yn(voting score))越小越好,那麼un(T+1)越小越好。

AdaBoost在迭代過程中,是讓∑un(t)越來越小的過程,在這個過程中,逐漸達到SVM中最大分類間隔的效果。

2.2 AdaBoost誤差函式

上面解釋到了,AdaBoost在迭代學習的過程,就是希望讓∑un(t)越來越小的過程,那麼我們新的目標就是最佳化∑un(T+1)

我們可以畫出0/1錯誤和AdaBoost誤差函式err(s,y) = exp(-ys)的函式曲線,我們發現AdaBoost的誤差函式(稱為exponential error measure)實際上也是0/1錯誤函式的上限函式,於是,我們可以通過最小化該函式來起到最佳化的效果。

2.3 AdaBoost誤差函式的梯度下降求解

為了最小化AdaBoost的誤差函式Ein,我們可以將Ein函式在所在點的附近做泰勒展開,我們就可以發現在該點的附近可以被梯度所描述,我們希望求一個最好的方向(最大梯度相反的方向),然後在該方向上走一小步,這樣我們就可以做到比現在的函式效果好一點點,依次進行梯度下降,最終達到最小化誤差函式的效果。

現在我們把gt當做方向,希望去找到這個gt(這裡函式方向gt和上面介紹的最大梯度的方向向量沒有什麼差別,只是表示方式有所不同而已)。

我們解釋一下上面的公式:

  • 我們需要找到一個新的函式,這裡表示為h(xn)和步長η,將這個函式加入到表示式中去;
  • 我們將第一個公式中紫色的部分合起來,簡化表示為權重un(t);
  • exp(-y·η·h(xn))在原點處做泰勒展開,得到(1-yn·η·h(xn))
  • 然後拆成兩部分∑un(t)η·∑un(t)·yn·h(xn),第一部分是Ein,第二部分就是要最小化的目標。


我們對∑un(t)·yn·h(xn)整理一下,對於二元分類情形,我們把yn和h(xn)是否同號進行分別討論:

上面的公式中,我們特意將∑un(t)·yn·h(xn)拆成-∑un(t)Ein(h)的形式,這裡最小化Ein對應於AdaBoost中的A(弱學習演算法),好的弱學習演算法就是對應於梯度下降的函式方向。

2.4 最佳化步長η

我們要最小化Eada,需要找到好的函式方向gt,但是得打這個gt的代價有些大,梯度下降的過程中,每走一小步,就需要計算得到一個gt。如果轉換一下思路,我們現在已經確定了好的gt,我們希望快速找到梯度下降的最低點,那麼我們需要找到一個合適的最大步長η。

我們這裡使用貪心演算法來得到最大步長η,稱為steepest decent for optimization。

讓Eada對η求偏微分,得到最陡時候的ηt,我們發現這時ηt等於AdaBoost的αt。所以在AdaBoost中αt是在偷偷地做最佳化的工作。

2.5 小結

在第二小節中,我們從另外一個角度介紹了AdaBoost演算法,它其實是steepest gradient decent。

上面的式子很清楚了,我們將AdaBoost的誤差函式看做是指數誤差函式,AdaBoost就是在這個函式上一步一步做最佳化,每一步求得一個h,並將該h當做是gt,決定這個gt上面要走多長的距離ηt,最終得到這個gt的票數αt。

3. 梯度提升(Gradient Boosting)

梯度提升是對AdaBoost的延伸,它不再要求誤差函式是指數誤差函式,而可能是任意一種誤差函式(因為這裡是用梯度下降法來最佳化誤差函式,所以這裡要求誤差函式是平滑的)。

在這個架構下,我們就可以使用不同的假設和模型,來解決分類或者回歸的問題。

3.1 梯度提升應用於迴歸問題

梯度提升應用於迴歸問題時,誤差函式選中均方誤差函式。

緊接著,我們對這個誤差函式中變數s在sn處進行一階泰勒展開的近似,我們發現要最小化的實際是∑h(xn)·2(sn-yn),要讓該表示式最小,需要h(xn)(sn-yn)的方向相反:

要求解最佳化問題,需要h(xn)(sn-yn)的方向相反,而h(xn)的大小其實不是我們關係的問題,因為步長問題是由引數η決定的。
如果將h(xn)強制限制為1或者某個常數的話,那麼就得到了一個有條件的最佳化問題,增加了求解的難度。不如我們將懲罰項h(xn)的平方放進最佳化式子中(意思是,如果h(xn)越大,我們就越不希望如此)。
我們可以將平方式子變換一下,得到有關(h(xn)-(yn-sn))^2的式子,所以我們要求一個帶懲罰項的近似函式梯度的問題,就等效於求xn和餘數(residual)yn-sn的迴歸問題。


確定步長η

我們現在確定了gt,接著我們要確定步長η,這裡我們可以將誤差函式寫成餘數(yn-sn)的形式,這是一個單變數的線性迴歸問題,其中輸入是用gt轉換後的資料,輸出是餘數(residual)。

4. 梯度提升決策樹

綜合第三小節的步驟,我們就可以得到梯度提升決策樹的演算法流程:

  • 在每一次迭代過程,解決一個迴歸問題,這裡可以用CART演算法來解{xn, (yn-sn)}的迴歸問題;
  • 然後,用gt做轉換,做一個{gt(xn), yn-sn}的單變數線性迴歸問題;
  • 更新分數sn;
  • 經過T輪迭代,得到G(x)。
    這個GBDT演算法可以看做是AdaBoost-DTree的迴歸問題版本。

參考資料