GBDT(Gradient Boosting Decision Tree)

GBDT+FFM(FM)+Online Learing(FTRL)是kaggle比賽的重點方法,而且暑期實習面試的時候也有很多面試官問了,還是很有必要學習下的. 我在網上找了下相關資料,感覺講的都不是很好(可能是我太菜了吧),所以自己想着寫一篇,要是哪裏錯了,歡迎指正


從Ensemble說起

Bagging,Boosting和Stacking是集成學習的三種主要的形式.

Bagging

Bagging=Bootstrap Aggregating,是model averaging的策略.
bootstrap是一種有放回的抽樣,那麼bagging就是使用bootstrap抽樣來進行模型平均(vote). 從訓練集從進行子抽樣組成每個基模型所需要的子訓練集,對所有基模型預測的結果進行綜合產生最終的預測結果.

比如: Random Forest就是使用bagging的思想
(1) bootstrap抽樣產生樣本集M
(2) 從原始的K個特徵中選擇k(logK)個隨機特徵作爲特徵集F
(3) 對樣本集M在特徵集F上建立決策樹(CART)
(4) 重複(1)-(3)產生多個決策樹
(5) 投票(average)

bagging

這裏借鑑別人的一張圖:
bagging

Stacking

是指訓練一個模型用於組合其他各個模型。即首先我們先訓練多個不同的模型,然後再以之前訓練的各個模型的輸出爲輸入來訓練一個模型,以得到一個最終的輸出.
將訓練好的所有基模型對訓練基進行預測,第j個基模型對第i個訓練樣本的預測值將作爲新的訓練集中第i個樣本的第j個特徵值,最後基於新的訓練集進行訓練。同理,預測的過程也要先經過所有基模型的預測形成新的測試集,最後再對測試集進行預測.

stacking

別人的一個圖畫的很好,這裏拿來:
stacking

Boosting

While boosting is not algorithmically constrained, most boosting algorithms consist of iteratively learning weak classifiers with respect to a distribution and adding them to a final strong classifier. When they are added, they are typically weighted in some way that is usually related to the weak learners’ accuracy. After a weak learner is added, the data are reweighted: examples that are misclassified gain weight and examples that are classified correctly lose weight (some boosting algorithms actually decrease the weight of repeatedly misclassified examples, e.g., boost by majority and BrownBoost). Thus, future weak learners focus more on the examples that previous weak learners misclassified.

總結起來就是:
(1) 分步去學習weak classifier,最終的strong claissifier是由分步產生的classifier’組合‘而成的
(2) 根據每步學習到的classifier去reweight樣本(分錯的樣本權重加大,反之減小)

流程圖如下:

boosting

對此有個示例:

prml p660

其中綠色的線表示目前取得的模型(模型是由前m次得到的模型合併得到的),虛線表示當前這次模型。每次分類的時候,會更關注分錯的數據,上圖中,紅色和藍色的點就是數據,點越大表示權重越高. 當m=150的時候,模型已經可以將數據正確的分來.

從上面我們可以看出Boosting和Bagging的區別,通過Gradient Boosting算法引入Bagging的思想,加上正則項,使得模型具有比一般Boosting算法(比如Adaboost)更強的robust,這也就是爲什麼GBDT能流行的原因

Boosting Tree

Boosting實際採用加法模型(classifier的線性組合)+前向分佈,如果每次在Boosting中的基函數(classifier)使用決策樹的算法就是Boosting Tree.
所以boosting tree模型就是決策樹的加法模型:

boosting tree

其中T表示決策樹.

對於迴歸問題的boosting tree的前向分步算法如下:

其中表示第m步之後的當前模型,此時需要求解:

對於迴歸問題可以使用平方誤差作爲損失函數L,即:

轉換下就是:

其中residual就是當前模型擬合產生的殘差(residual).

對於不是平方誤差的情況,可以採用泰勒展開來進行計算,具體的可以參考xgboost作者陳天奇的介紹.
boosted tree introduction
boosted tree introduction 中文版

這裏我直接摘抄下:

object function

Obj表示object function,跟我們上面說的不一樣的是,這裏加上了正則,不過不影響理解.
採用泰勒展開來近似:

Gradient Boosting

Boosting更像是一種思想, gradient boosting是一種boosting的方法. 它主要的思想是,每一次建立模型是在之前建立模型損失函數的梯度下降方向.

統計學習方法中是這麼說的:

假設分步模型下當前模型是f(x),利用損失函數L的負梯度在f(x)下的值作爲boosting tree算法中的殘差(residual)去擬合一個迴歸樹.

所以大概算法是這樣的:

2(a)表示計算損失函數的負梯度在當前模型的值,將其作爲殘差的估計值;
2(b)表示估計迴歸樹葉子節點的區域,以擬合殘差的近似值;
2(c)表示利用線性搜索估計葉子節點區域的值,使得損失函數最小化;
2(d)更新迴歸樹;

說的不好懂,沒關係,下面還有個更具體的解釋.

假設:

其中P表示參數,F(x;P)表示以P爲參數的x的函數,也就是預測函數,在分步模型中表示爲加法.


寫成梯度下降的方式就是下面的形式,也就是我們將要得到的模型fm(x)的參數{am,bm}能夠使得fm的方向是之前得到的模型Fm-1(x)的損失函數下降最快的方向:


Gradient Boosting是boosting思想下的一種優化的方法,首先將函數分解爲可加的形式(其實所有的函數都是可加的,只是是否好放在這個框架中,以及最終的效果如何),然後進行m次迭代,通過使得損失函數在梯度方向上減少,最終得到一個優秀的模型。每次模型在梯度方向上的減少的部分,可以認爲是一個“小”的或者“弱”的模型,最終我們會通過加權(也就是每次在梯度方向上下降的距離)的方式將這些“弱”的模型合併起來,形成一個更好的模型.

GBDT

一個樹的定義可以分成兩個部分: 結構部分和葉子權重部分.
假設q是結構映射函數把輸入映射到葉子的索引號上面去,w表示葉子節點的權重. 則樹可以表示爲:


定義樹的複雜度:包含兩個部分樹的葉子節點的個數T和葉子節點的權重的平方,即:

則此時的obj爲:

此時單棵決策樹的學習過程如下:

(1) 枚舉所有可能的樹結構q
(2) 計算對應的分數(損失值)obj,obj越小越好
(3) 找到最佳的樹結構,爲每個葉子節點計算權值w

然而,可能的樹結構數量是無窮的,所以實際上我們不可能枚舉所有可能的樹結構。通常情況下,我們採用貪心策略來生成決策樹的每個節點。

  1. 從深度爲0的樹開始,對每個葉節點枚舉所有的可用特徵
  2. 針對每個特徵,把屬於該節點的訓練樣本根據該特徵值升序排列,通過線性掃描的方式來決定該特徵的最佳分裂點,並記錄該特徵的最大收益(採用最佳分裂點時的收益)
  3. 選擇收益最大的特徵作爲分裂特徵,用該特徵的最佳分裂點作爲分裂位置,把該節點生長出左右兩個新的葉節點,併爲每個新節點關聯對應的樣本集
  4. 回到第1步,遞歸執行到滿足特定條件爲止

總結

GBDT的算法:

  1. 算法每次迭代生成一顆新的決策樹
  2. 計算損失函數對每個樣本的一階導gi和二階導hi
  3. 通過貪心策略生成新的決策樹,同時計算每個葉子節點的權重w
  4. 把新生成的決策樹f(x)添加到模型:

    爲了防止過擬合添加了學習率參數(shrinkage)

參考博客
1. 陳天奇的博客
2. GBDT算法原理解析
3. gradient boosting解析
4. 統計學習方法(李航)
5. ensemble learning原理[推薦]
6. ensemble learning實戰[推薦]
7. kaggle ensemble guide

發佈了105 篇原創文章 · 獲贊 123 · 訪問量 58萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章