【機器學習基礎】梯度提升決策樹
引言
上一節中介紹了《隨機森林演算法》,該演算法使用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的迴歸問題版本。