GBDT梯度提升樹演算法原理小結(三)
首先我們回顧一下Gradient Boosting 的本質,就是訓練出
,使損失函式 最小,即其求解步驟如下:
迴歸
對於迴歸問題,定義好損失函式
後,Gradient Boosting 不需要作出什麼修改,計算出來的結果就是預測值。平方損失
在實際迴歸中,最常用的
之一,就是平方損失,即將它畫出來,形狀大致如下
絕對值損失
絕對值損失的定義,以及其梯度如下:
絕對值損失函式畫出來圖,形狀如下
有了以上兩項(損失函式與梯度),本質上就能夠解Algorithm 1了。同時,如果將弱學習演算法設為決策樹,還能進一步推匯出形式更簡潔的演算法形式。這部分公式推導,此處不再贅述,有興趣的同學可以參看原文。絕對值損失的 GBDT 演算法流程如下
需要了解的是,使用絕對值損失,一般比平方損失更加穩健。
Huber 損失
還有一種叫Huber 損失,其定義為
分段函式看起來不直觀,它的圖畫出來大致是
從圖和公式可以看出,它融合了平方損失和絕對值損失。當偏差較小時,採用平方差損失;當偏差較大時,採用絕對值損失;而引數
按照作者的說法,對於正態分佈的資料,Huber 損失的效果近似於平方差損失;而對於長尾資料,Huber 損失的效果近似於絕對值損失;而對於中等程度拖尾的資料,Huber 損失的效果要優於以上兩者。
與平方差損失一樣,如果將弱學習演算法設為決策樹,還能進一步推匯出更具體的演算法形式,即,Huber 損失的 GBDT 演算法流程如下
三種損失函式與對應的梯度表
分類
在說明分類之前,我們先介紹一種損失函式。與常見的直接求預測與真實值的偏差不同,這種損失函式的目的是最大化預測值為真實值的概率。這種損失函式叫做對數損失函式(Log-Likehood Loss),定義如下
對於二項分佈,
,我們定義預測概率為 ,即二項分佈的概率,可得即,可以合併寫成
對於
與 的關係,我們定義為即,
。當 , ;當 ,
兩類分類
對於兩類分類,
,我們先將它轉成二項分佈 ,即令 。於是根據上面得到的,損失函式期望為
其中,
定義為接下來求出梯度
這樣,Gradient Boosting 需要的條件就準備齊了。
但是,如果我們將弱演算法設定為決策樹,並在求解步長的時候利用牛頓法,原演算法能夠得到如下更簡潔的形式,即兩類分類的 GBDT 演算法流程如下
最後依據計算出來的
分類即可。即,通過 估算預測的概率然後根據以下準則預測標籤,其中
是代價函式,表示當真實類別為 ,預測類別為 時的代價多類分類
模仿上面兩類分類的損失函式,我們能夠將
類分類的損失函式定義為其中,
,且將 與 關係定義為或者,換一種表達方式
於是可以看出,這裡在每一次迭代,都要求
個引數,和對應的 。而求出的 則可以理解為 屬於第 類而不是其他類的概率。本質上就是OneVsRest的思想。同上,如果我們對弱演算法選擇決策樹,則有 類分類的 GBDT 演算法流程為
然後,根據上面的公式,將最終得到的
轉換為對應的類別概率 ,並用於分類即可。分類準則如下其中,
是代價函式,表示當真實類別為 ,預測類別為 時的代價正則化
採取以上演算法去訓練測試樣本集,能很好地擬合測試資料,相對不可避免地會產生過擬合。為了減少過擬合,可以從兩個方面入手,即弱演算法的個數
,以及收縮率 。弱演算法的個數
在推導 AdaBoost 的時候,我們就介紹過,我們希望訓練出的
是若干個弱演算法的線性組合,即因此,這個
的大小就影響著演算法的複雜度。一般來說,在訓練階段,我們通過交叉驗證的方式,選擇使損失最小的
,並用於測試。
收縮率
前面介紹過,在第
次迭代時,我們用如下公式更新而增加收縮率
後,則更新公式變為即越往後訓練出的弱演算法,其在總演算法中佔得權重相對越低,於是真正有效的弱演算法也就前面有限個,因而影響了演算法的複雜度。
同樣,在訓練階段,我們通過交叉驗證的方式,選擇使損失最小的
,並用於測試。不過,
和 是會相互影響的,一般減小 ,則對應的最優的 會增加。因此,在選擇引數時,應該綜合考慮這兩個引數的效果。尾巴
在這一部分,我們看到不論在分類還是迴歸的Gradient Boosting,如果弱演算法選擇決策樹,都能夠一定程度簡化求解思路;同時,決策樹是個簡單容易實現的弱演算法,在實際中 GBDT 的表現也很好,相反太強太穩定的演算法反而容易過擬合。希望這兩篇文章不僅能幫助大家瞭解 GBDT 這類演算法,更多的是能瞭解它整個演化的過程,對它有個更深的理解。