前向分佈算法、Adaboost算法、提升樹算法、梯度提升算法、GBDT(梯度提升決策樹)和XGBoost(極限梯度提升)

目標:好好捋一捋跟提升有關的算法,總結實屬不易,望點贊或關注,謝謝。

一、前向分佈算法

首先必須瞭解前向分佈算法,因爲這個算法將提升思想變得更容易實現,它只需求出每一次迭代時的最優弱模型的參數和係數即可,不用一次性求出所有的弱模型。
下面是我的另一篇博客,裏面講解了前向分佈算法的思想和實現。
https://blog.csdn.net/watermelon12138/article/details/90370257

二、Adaboost算法

前向分佈算法中並沒有要求損失函數必須取哪一種(平方損失、指數損失等等),也沒有要求基函數(就是弱模型)應該取哪一種(線性迴歸、svm、決策樹等等),所以說前向分佈算法更像是一個框架,需要你自己添加血和肉。Adaboost算法就是這樣來的,如果將前向分佈算法中的損失函數取 指數損失函數,那麼前向分佈算法就等價於Adaboost算法。
具體的分析和講解,請看我的另一篇博客:
https://blog.csdn.net/watermelon12138/article/details/90370257

三、提升樹算法

如果前向分佈算法中的基函數取決策樹(一般默認使用CART樹,因爲它即可做迴歸也可以做分類),那麼該前向分佈算法就可以稱爲提升樹算法。針對不同的損失函數和樹的類型,提升樹有不同的用途,對於前向分佈算法來說,當損失函數取指數損失,基函數取二叉分類樹,前向分佈算法就變成了用於分類的提升樹算法; 當損失函數取平方損失,基函數取二叉迴歸樹,前向分佈算法就變成了用於迴歸的提升樹算法;

3.1用於分類的提升樹算法
這裏我就不再囉嗦了,就是將Adaboost算法中的基函數取二叉分類樹,算法具體流程和Adaboost一樣。

3.2用於迴歸的提升樹算法
前向分步算法中的基函數採用二叉迴歸樹,損失函數採用平方損失,就得到了解決迴歸問題的提升樹。

分析:
假設現在是前向分佈算法的第 m 次 迭代,當前模型爲 fm-1(x),此時的弱模型未知,我們記爲T(x;θ),第m次迭代的目標是找到使得損失函數 L(yi, fm-1(xi) + T(xi;θ))取最小值的 T*(x;θ),然後更新當前模型 fm(x) = fm-1(x) + T*(x;θ)。
因爲損失函數採用的是平方損失,所以有:
L(yi, fm-1(xi) + T(xi;θ)) = (yi - fm-1(xi) -T(xi;θ))2 = ( r - T(xi;θ))2
其中 r = yi - fm-1(xi) ,這是當前模型擬合數據的殘差。從上面的表達式可以看出弱模型T(xi;θ)的預測值越是接近 r ,損失L的值就越小,所以說每一次迭代過程的弱模型 T(xi;θ) 只需擬合當前模型的殘差就可以了,但這隻限於損失函數取平方損失的時候。

算法:
在這裏插入圖片描述
在這裏插入圖片描述
3.3關於擬合殘差,舉個簡單的栗子

舉個栗子:
A、B、C、D四個人的真實年齡分別爲14、16、24、26,現在利用提升算法對這四個人的年齡做預測。

第一輪:
初始模型F0(x)取值爲常數,這個常數爲樣本的均值時目標函數能取最小值。
所以F0(x) = 20,即A、B、C、D的預測年齡爲20、20、20 、20。
所以得到每個人的年齡預測殘差爲 -6、-4、4、6,然後用殘差數據去擬合一個基函數f1(x),我們就可以得到一個新的模型F1(x) = F0(x) + f1(x),其中這個基函數 f1(x) 對於殘差數據的預測值爲 -5、-4、3、6。

第二輪:
模型 F1(x) 的預測值爲15(20-5)、16(20-4)、23(20+3)、26(20+6),
所以得到每個人的年齡預測殘差爲 -1、0、 1 、0,然後用殘差數據去擬合一個基函數f2(x),我們就可以得到一個新的模型F2(x) = F0(x) + f1(x) + f2(x) ,其中這個基函數 f2(x) 對於殘差數據的預測值爲 -1、0、1、0。
此時,F2(x)已經可以完全預測準確了,它的預測結果是 14(20-5-1)、16(20-4-0)、24(20+3+1)、26(20+6+0)。

四、梯度提升算法

4.1梯度提升的思想
當前向分佈算法中的損失函數取平方損失或者指數損失,我們都有比好的優化方法,其中指數損失我們可以採用Adaboost算法,平方損失我們採用擬合當前模型殘差的方法,那如果損失函數是其它類型的函數呢?針對這個問題,freidman提出了梯度提升,其關鍵是用損失函數L( yi, fm-1(xi)) 對 當前模型 fm-1(xi) 的 負梯度值作爲殘差的近似值,所以可以將該負梯度值稱爲僞殘差
可以這樣來想,假設目前損失函數取平方損失函數,即
在這裏插入圖片描述
該平方損失函數L( yi, fm-1(xi)) 對 當前模型 fm-1(xi) 的 負梯度值爲(少個負號哈,不要在意):
在這裏插入圖片描述
也就是說,損失函數取平方損失的時候,負梯度值就是當前模型的殘差,所以當損失函數取其它函數的時候,我可以用負梯度值作爲當前模型殘差的近似值。

4.2梯度提升的算法
在這裏插入圖片描述

五、GBDT(梯度提升決策樹)

GBDT既可以用來處理迴歸問題,也可以用來處理分類問題,當梯度提升算法的基函數取二叉迴歸樹,該梯度提升算法就可以稱之爲GBDT,注意不管GBDT是做迴歸還是做分類,它的基函數一直都是二叉迴歸樹(默認採用CART迴歸樹)。

CART迴歸樹的形式如下:
在這裏插入圖片描述
CART的生成過程我就不講了,自行百度。

GBDT算法如下:
在這裏插入圖片描述
如上所述,GBDT之所以分類和迴歸都取二叉迴歸樹,大概是因爲二叉迴歸樹葉子結點的權值比較好求出來吧(上述算法流程的倒數第二步),只要葉子節點的權值求出來,該二叉迴歸樹(誤差率最小)就算是求出來了。
GBDT做分類:
這個不是本博文的重點,有興趣的同學請看下面這個博客。
https://www.cnblogs.com/ModifyRong/p/7744987.html

六、XGBoost(極限提升)

下面這個博客對於xgboost有更爲通俗的解釋:
https://blog.csdn.net/github_38414650/article/details/76061893
https://baijiahao.baidu.com/s?id=1620689507114988717&wfr=spider&for=pc

XGBoost簡介:
在這裏插入圖片描述
XGBoost的目標函數推導:

1、如果XGBoost模型總共學習了K棵樹,那目標函數可以如下表示:

在這裏插入圖片描述
其中L(yi, yi^)表示最終模型的預測誤差,fk表示第 k 棵樹,Ω(fk)表示第 k 棵樹的複雜度,所以Ω函數就是目標表達式的正則項。我們要求出使得目標函數 J 取最小值的XGBoost模型,因爲它是最優的。
困難:有點像提升算法遇到的難題,我們如何直接求出 K 棵樹呢?這基本上是不可能的,這時就可以採用前向分佈算法中的思想,我們不直接求出 K 棵樹,我們讓它迭代,每次迭代只求出一棵樹,然後把它們相加起來,就是貪心算法啦。

2、fk(xi)的解釋
我們知道 fk 表示第 k 棵樹,那 fk(xi) 就是第 k 棵樹對 xi 的預測值,迴歸樹的預測值最終等於某個葉子節點上的權值,所以 fk(x) 就等於 x 所在葉子節點的權值,即 fk(x) = wq(x),如果 fk 有 T 個葉子節點,那 q(x)的取值範圍就是1, 2 , … , T,它表示 x 位於哪個葉子節點上。
舉個栗子:
在這裏插入圖片描述
3、樹的複雜度 Ω 怎麼衡量
在這裏插入圖片描述
其中 T 爲該樹的葉子節點個數,wj爲每個葉子節點的權值,可見 XGBoost 要求生成的迴歸樹葉子節點不能過多,而且葉子節點權值不能過大,這樣XGBoost 的泛化能力就更強,防止過擬合。關於葉子節點權值不瞭解的可以去看看回歸樹,因爲迴歸樹的每個葉子都會被貼上一個標籤,這個標籤是一個數值(一般來講就是該葉子的均值),把這個標籤稱爲權值。

4、XGBoost模型在第 t 次迭代時的目標函數
由1式中的公式直接推出:
在這裏插入圖片描述
因爲前 t-1 棵樹是已知的,所以它的複雜度之和也是已知的,所以我們把它看做常數C放到式子最後,得:
在這裏插入圖片描述
XGBoost和GBDT一樣,它考慮的不是損失函數僅僅取平方損失之類的,它考慮的是普遍情況,就是你選擇任意的損失函數XGBoos都可以優化,它做了一個非常巧妙的變化,就是泰勒展開:
在這裏插入圖片描述
因爲yi是已知的,所以下面的式子成立:
在這裏插入圖片描述
然後上式就可以看作是L(x+△x),其中 x 是yi^(t-1),△x是ft(xi),根據泰勒公式求出一階導和二階導如下:
在這裏插入圖片描述
所以得到泰勒展開式爲:
在這裏插入圖片描述
所以目標函數的近似值爲:
在這裏插入圖片描述
繼續化簡上式吧:
在這裏插入圖片描述
第二步解釋:因爲L(yi,yi^(t-1))是常數,那就把它和常數C歸併到一起,然後忽略掉。
第四步解釋:因爲第三步是對每個xi(1=< i <=n)來計算,遍歷所有的樣本。因爲每個 xi 最終都會落入到一個葉子節點中,所以可以先對每個葉子節點(1=< j <= T)來計算,再對每個葉子節點中的xi (j中的xi) 來計算,這也可以遍歷完所有的樣本,所以第三步和第四步是等價的。

繼續化簡得:
在這裏插入圖片描述
J( ft )對 wj 求導並令導數等於零:
在這裏插入圖片描述
在這裏插入圖片描述
上式稱爲打分函數(scoring function),它是衡量樹結構好壞的標準,值越小,代表這樣的結構越好 。目前我們只得到了打分函數,它可以衡量樹結構的好與壞,但是這棵樹應該怎麼來構建呢?請看下一小節。

XGBoost 如何構建第 t 棵迴歸樹

首先將所有的訓練樣本放到一個葉子節點中,計算J1(ft),此時T=1:
在這裏插入圖片描述
然後遍歷所有特徵,遍歷每個特徵所有可行的分割點,將該葉子節點劃分成 兩個葉子節點,計算 J2(ft),此時T=2:
在這裏插入圖片描述
如果 J1(ft) - J2(ft) 大於零,我們就說該劃分是可行的,因爲它使目標函數變小了呀,我們把 J1(ft) - J2(ft) 叫做 增益 用 Gain 表示如下:
在這裏插入圖片描述
所以最佳的劃分點就是就是使得 Gain 最大的劃分點,枚舉所有的特徵及其劃分點,找到它就完事了。
對於劃分後的 左子節點 和 右子節點 ,重複上述步驟。

總結:

  • XGBoost即可以做分類,也可以做迴歸

  • XGBoost的每一次迭代時的建樹過程

    XGBoost將所有樣本數據當做第一個葉子結點,計算這個葉子節點的權值(可以求均 值),然後通過上面的過程選擇最佳分割特徵將這個葉子結點劃分。對於劃分得到的2個葉子節點,分別計算其權值(用wj的公式),然後通過同樣的方式選擇劃分特徵,達到約束條件就停止劃分(比如給定樹的最大深度),於是就得到了一棵迴歸樹。

  • XGBoost和GBDT的區別

    • XGBoost目標函數添加了懲罰項,防止過擬合。
    • XGBoost用到了誤差函數L的二階導。
    • XGBoost建樹過程中同層的葉子結點在計算G和H時可以並行計算。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章