梯度提升決策樹(GBDT)算法簡介

梯度提升決策樹(GBDT:GradientBoostingDecisionTree)算法是集成學習中boosting的一種。總體思路是利用每個弱學習器計算當前輸出與真實值的殘差,然後講每個學習器輸出的殘差進行累加,以求接近真實值。訓練過程可以用下面的公式來表示:
fm(x)=fm1(x)+Tm(x,Δm) {f\mathop{ {} } \nolimits_{ {m} } { \left( {x} \right) } =f\mathop{ {} } \nolimits_{ {m-1} } { \left( {x} \right) } +T\mathop{ {} } \nolimits_{ {m} } { \left( {x, \Delta \mathop{ {} } \nolimits_{ {m} } } \right) } }
其中,fm爲前m個學習器的輸出結果,Tm爲當前m輪訓練的學習器(這裏的學習器爲決策樹)。△爲當前的殘差。

當迭代到一定程度,就可以訓練出完整的模型了,模型可表示爲:
F(x)=m=1MTm(x) {F{ \left( {x} \right) } ={\mathop{ \sum } \limits_{ {m=1} } ^{ {M} } {T\mathop{ {} } \nolimits_{ {m} } { \left( {x} \right) } } } }
那麼,如何訓練迭代到第m輪的學習器Tm呢?

首先,定義損失函數爲L。舉個最簡單的例子,如果用均方誤差(MSE)作爲損失函數,那麼對於每個樣本xi,損失Li爲:
L(xi)=(yifm1(xi)Tm(xi))2 {L{ \left( {x\mathop{ {} } \nolimits_{ {i} } } \right) } ={ \left( {y\mathop{ {} } \nolimits_{ {i} } -f\mathop{ {} } \nolimits_{ {m-1} } { \left( {x\mathop{ {} } \nolimits_{ {i} } } \right) } -T\mathop{ {} } \nolimits_{ {m} } { \left( {x\mathop{ {} } \nolimits_{ {i} } } \right) } } \right) } \mathop{ {} } \nolimits^{ {2} } }
yi是訓練集的真實值,fm-1我們已經在之前的訓練中得到。所以我們可以計算當前的殘差:
Δmi=yi=fm1(xi) { \Delta \mathop{ {} } \nolimits_{ {mi} } =y\mathop{ {} } \nolimits_{ {i} } =f\mathop{ {} } \nolimits_{ {m-1} } { \left( {x\mathop{ {} } \nolimits_{ {i} } } \right) } }
所以現在損失函數可以寫成:
L(xi)=(ΔmiTm(xi))2 {L{ \left( {x\mathop{ {} } \nolimits_{ {i} } } \right) } ={ \left( { \Delta \mathop{ {} } \nolimits_{ {mi} } -T\mathop{ {} } \nolimits_{ {m} } { \left( {x\mathop{ {} } \nolimits_{ {i} } } \right) } } \right) } \mathop{ {} } \nolimits^{ {2} } }
我們的目標當然是最小化損失函數,很顯然,△等於T(x)時損失函數取得最小值0。所以我們訓練當前學習器Tm的期望輸出就可以是△。所以接下來用決策樹的訓練方法訓練輸入爲x,輸出爲△的數據集即可。

當然,大多數損失函數不會具有均方誤差(MSE)這個特性,殘差△也不是很簡單的能求解出的,如果再加入正則項那就更爲複雜。所以需要用到一些近似處理。

(此處省略大量公式推導的介紹,有興趣可以看論文:Greedy function approximation: a gradient boosting machine)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章