1. 程式人生 > >GBDT梯度提升樹演算法原理小結(三)

GBDT梯度提升樹演算法原理小結(三)

首先我們回顧一下Gradient Boosting 的本質,就是訓練出F^*,使損失函式\psi(y,F(x))最小,即

F^*=\underset{F(x)}{\arg\min}E_{y,x}\psi(y,F(x))

其求解步驟如下:

所以,我們首先得定義出損失函式\psi(y,F(x)),才能談求解的事情。接下來我們針對不同場景,介紹相應的損失函式。

迴歸

對於迴歸問題,定義好損失函式\psi(y,F(x))後,Gradient Boosting 不需要作出什麼修改,計算出來的結果就是預測值。

平方損失

在實際迴歸中,最常用的\psi(y,F(x))之一,就是平方損失,即

將它畫出來,形狀大致如下

能看出來,它含義就是對較大的偏差有著很強的懲罰,並相對忽略較小的偏差。容易得到,\psi(y,F(x))的梯度為

因此代入Algorithm 1,就有了將平方損失應用於Gradient Boosting 的 LS_Boost 方法,步驟如下

絕對值損失

絕對值損失的定義,以及其梯度如下:

絕對值損失函式畫出來圖,形狀如下

有了以上兩項(損失函式與梯度),本質上就能夠解Algorithm 1了。同時,如果將弱學習演算法設為決策樹,還能進一步推匯出形式更簡潔的演算法形式。這部分公式推導,此處不再贅述,有興趣的同學可以參看原文。絕對值損失的 GBDT 演算法流程如下

需要了解的是,使用絕對值損失,一般比平方損失更加穩健。

Huber 損失

還有一種叫Huber 損失,其定義為

分段函式看起來不直觀,它的圖畫出來大致是

從圖和公式可以看出,它融合了平方損失和絕對值損失。當偏差較小時,採用平方差損失;當偏差較大時,採用絕對值損失;而引數\delta

就是用於控制偏差的臨界值的。

按照作者的說法,對於正態分佈的資料,Huber 損失的效果近似於平方差損失;而對於長尾資料,Huber 損失的效果近似於絕對值損失;而對於中等程度拖尾的資料,Huber 損失的效果要優於以上兩者。

與平方差損失一樣,如果將弱學習演算法設為決策樹,還能進一步推匯出更具體的演算法形式,即,Huber 損失的 GBDT 演算法流程如下


三種損失函式與對應的梯度表

分類

在說明分類之前,我們先介紹一種損失函式。與常見的直接求預測與真實值的偏差不同,這種損失函式的目的是最大化預測值為真實值的概率。這種損失函式叫做對數損失函式(Log-Likehood Loss),定義如下

L(Y, P(Y|X))=-logP(Y|X)

對於二項分佈,y^*\in\{0,1\},我們定義預測概率為p(x)=P(y^*=1),即二項分佈的概率,可得

L(y^*, p(x))=\begin{cases}-log(p(x)),& \text{if $y^*$=1}\\-log(1-p(x)),& \text{if $y^*$=0}\end{cases}

即,可以合併寫成

L(y^*, p(x))=-ylog(p(x))-(1-y)log(1-p(x))

對於p(x)F(x)的關係,我們定義為

p(x)=\frac{e^{F(x)}}{e^{F(x)}+e^{-F(x)}}

即,F(x)=\frac{1}{2}log(\frac{p(x)}{1-p(x)})。當p(x)=1F(x)\to\infty;當p(x)=0F(x)\to-\infty

兩類分類

對於兩類分類,y\in\{-1,1\},我們先將它轉成二項分佈y^*\in\{0,1\},即令y^*=(y+1)/2

於是根據上面得到的,損失函式期望為

\[\begin{aligned}\psi(y,F(x))&= EL(y^*, p(x))\\&= E[-ylog(p(x))-(1-y)log(1-p(x))\\&= Elog(1+e^{-2yF(x)})\end{aligned}\]

其中,F(x)定義為

接下來求出梯度

這樣,Gradient Boosting 需要的條件就準備齊了。

但是,如果我們將弱演算法設定為決策樹,並在求解步長的時候利用牛頓法,原演算法能夠得到如下更簡潔的形式,即兩類分類的 GBDT 演算法流程如下

最後依據計算出來的F_m(x)分類即可。即,通過F_m(x)估算預測的概率

然後根據以下準則預測標籤,其中c(\hat y,y)是代價函式,表示當真實類別為y,預測類別為\hat y時的代價

多類分類

模仿上面兩類分類的損失函式,我們能夠將K類分類的損失函式定義為

其中,p_k(x)=P(y_k=1|x_k),且將p_k(x)F_k(x)關係定義為

或者,換一種表達方式

接下來求出梯度

於是可以看出,這裡在每一次迭代,都要求K個引數,和對應的F_k(x)。而求出的F_k(x)則可以理解為x屬於第k類而不是其他類的概率。本質上就是OneVsRest的思想。

同上,如果我們對弱演算法選擇決策樹,則有K類分類的 GBDT 演算法流程為

然後,根據上面的公式,將最終得到的\{F_{kM}(x)\}_1^K轉換為對應的類別概率\{p_{kM}(x)\}_1^K,並用於分類即可。分類準則如下

其中,c(k,k^\prime)是代價函式,表示當真實類別為k^\prime,預測類別為k時的代價

正則化

採取以上演算法去訓練測試樣本集,能很好地擬合測試資料,相對不可避免地會產生過擬合。為了減少過擬合,可以從兩個方面入手,即弱演算法的個數M,以及收縮率v

弱演算法的個數

在推導 AdaBoost 的時候,我們就介紹過,我們希望訓練出的F(x)是若干個弱演算法的線性組合,即

因此,這個M的大小就影響著演算法的複雜度。

一般來說,在訓練階段,我們通過交叉驗證的方式,選擇使損失最小的M,並用於測試。

收縮率

前面介紹過,在第m次迭代時,我們用如下公式更新F_m(x)

而增加收縮率v後,則更新公式變為

即越往後訓練出的弱演算法,其在總演算法中佔得權重相對越低,於是真正有效的弱演算法也就前面有限個,因而影響了演算法的複雜度。

同樣,在訓練階段,我們通過交叉驗證的方式,選擇使損失最小的v,並用於測試。

不過,Mv是會相互影響的,一般減小v,則對應的最優的M會增加。因此,在選擇引數時,應該綜合考慮這兩個引數的效果。

尾巴

在這一部分,我們看到不論在分類還是迴歸的Gradient Boosting,如果弱演算法選擇決策樹,都能夠一定程度簡化求解思路;同時,決策樹是個簡單容易實現的弱演算法,在實際中 GBDT 的表現也很好,相反太強太穩定的演算法反而容易過擬合。希望這兩篇文章不僅能幫助大家瞭解 GBDT 這類演算法,更多的是能瞭解它整個演化的過程,對它有個更深的理解。