Adaboost、GBDT、XGBoost的對比理解

本篇文章重點不在於對三者的解析,主要是作者的一些理解,希望其中的某一點能幫助你更好的理解算法。

1.Adaboost 模型

    首先是Adaboost,它的基本思想是提高前一輪弱分類錯誤分類樣本的權重,降低正確分類樣本的權重,因此,在後面的訓練中,接下來的分類器就更加“關注”那些分錯的樣本點,這樣,多個弱分類器組合起來就是Adaboost,這是簡單的Adaboost的理解,當然也可以從一個我們更加熟悉的角度去理解,那就是前向分步算法,所謂的前向分佈算法可以理解爲後來的弱分類器在不斷的學習上一個分類器的輸出的結果和真實label之間的殘差。在二分類學習中,我們可以認爲Adaboost模型就是加法模型、損失函數爲指數函數(損失函數爲指數函數這一定理是由推導而來的,而不是定義,後面在GBDT還會涉及到,此外注意這裏我說的是二分類問題)、學習算法爲前向分佈算法;在迴歸學習中,Adaboost模型就是加法模型、損失函數爲平方損失函數、學習算法爲前向分佈算法。

2.GBDT 模型

    GBDT(gradient boosting desicion tree)是由boosting tree 演變過來的,而boosting tree可以認爲是Adaboost的一般方法,也就是說二分類問題的Adaboost模型是損失函數爲指數損失函數的boosting tree模型,迴歸問題的Adaboost模型是損失函數爲平方損失函數的boosting tree模型。

    GBDT的關鍵點就是利用損失函數的負梯度去模擬(代替)殘差,這樣對於一般的損失函數,只要其一階可導就行。這裏用到了損失函數的一階導數來得到殘差也就是接下來的tree要去擬合的值(記住這裏是一階導數)。

3.XGBoost 模型

    XGBoost是華盛頓大學陳天奇博士提出來的一個算法,最初在kaggle數據比賽上大放異彩,後來因爲其實在是太便捷好用了,所以你懂的,都在用。下面就介紹下其中難以理解的部分。

    (1)、首先是XGBoost損失函數的定義

         主要分爲兩部分,第一部分類似GBDT 的損失函數,第二部分爲樹的參數,用來衡量樹的複雜度,可以分爲 T爲樹的節點的個數、W爲葉子節點的值,因此可以看作加入了正則化項,減少了過擬合。

(2)、XGBoost 的加法模型表達

    其中的加法模型主要體現在損失函數中,和GBDT中的一樣。

(3)、XGBoost 的二階導數問題

       先看下XGBoost 損失函數的二階導數展開(XGBoost可以自定義損失函數,只要二階可導便可)

 其中g爲一階導數,h爲二階導數

想過沒有,爲什麼GBDT中用的一階導數,而XGBoost就要用二階導數,接下來我們就用對比的方法來理解這兩種方式的不同。首先是GBDT的一階導數主要用來計算殘差,然後通過接下來的模型對殘差進行學習。XGBoost的二階導數可以從這裏來看:

其中當我們需要擬合當前樹(或其他基學習器)的時候,上式中的第一項就是一個常值constant,因此我們的損失函數可以寫成:

展開可以得到:

其中當前模型f t(x)就是當前葉節點w的值,所以替代可以寫成w, 很明顯是一個二次函數的優化問題,相當於求ax^{2}+bx的極值,就是當x=\frac{-b}{2a}時,對應上式的二次結構,我們可以得到w的最優值(創新點,不同於GBDT的求法):(當前節點的值)

那麼在GBDT中當前節點的值是怎麼求的呢?直接求平均值。具體的可以查閱參考文獻2中的例子,或者小藍書中的實例。

3、節點的分割

    你以爲求的二階導數到此就沒用了麼?錯了,還有節點的分割也用到了,還看公式:

   爲什麼分割函數是這樣的,而不是GBDT中的平方誤差最小的點爲分割點,我們看上式中的每一項的格式是不是看起來都很熟悉啊,是的,都和最優w的格式是一樣的,因此上述可以表述爲:分割後左子樹的增益加上右子樹的增益再減去分割前樹的增益,最終選擇增益最大(記住是最大,因爲沒有負號)的切分點爲最優切分點,上式還可以認爲加入了剪枝操作。

 

    未完,持續更新。。。。。

 

 

 

 

參考文獻:

1、https://arxiv.org/pdf/1603.02754v1.pdf -論文pdf

2、https://www.cnblogs.com/ModifyRong/p/7744987.html  

 

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