首先什麼是boosting?
boosting是一種將弱分類器組合成強分類器的過程
- 構造一個強分類器很難
- 構造弱分類器不難
- 弱分類器的要求:強於隨機猜測 (很淺的CART樹即可)
用數學公式表示即:
f(x)=∑m=1MαmΦm(x)
其中:Φm(x)爲每個弱分類器 (不同boost方法在αm選擇不一樣)
AdaBoost
一般用於二分類,改進後可用於多分類
每次往強分類器中塞一個弱分類器,並給它相應話語權αm,再檢查是否達到收斂
算法過程:
- 假設訓練集有N個樣本:(x1,y1),(x2,y2),...,(xN,yN)對應標籤爲yi∈(1,−1),
- 初試給定每個樣本的權重爲 w1,i=N1
- 對m=1:M
- 對有權重wm,i的數據得到一個最優的弱分類器Φm(x) (這個最優可以是引入權重的loss 或者 使得誤差εm最小)
- 計算該弱分類器在wm的誤差:εm=∑i=1Nwm,iI(Φm(x)!=yi)
- 根據誤差計算當前弱分類器的權重:αm=21logεm1−εm (可以看出誤差越小,當前弱分類器組合的權重越大)
- 更新訓練數據的權重分佈:wm+1,i=Zmwm,iexp(−αmyiΦm(xi)) (其中Zm爲所有數據wm,iexp(−αmyiΦm(xi))之和,可以看出當分類錯誤時,−yiΦm(xi)爲正,分子會較大,即給了該分錯數據更大的權重)
- 最後將第m步的弱分類器組合進強分類器:Φ(x)=∑m=1MαmΦm(x)
- 再取sign函數得強分類器:f(x)=sign(∑m=1MαmΦm(x))
每次檢驗f(x)是否達到收斂條件,或者迭代次數是否達到上限。(取sign函數只在檢驗是否收斂時有用)
實例:https://blog.csdn.net/guyuealian/article/details/70995333
推導(建議熟悉):https://zhuanlan.zhihu.com/p/62037189 (給出了公式得來由&指數損失)
另外還有西瓜書可以看。
Gradient Boosting
一般用於迴歸任務,設定閾值後也可用於迴歸任務
根據梯度下降的啓發,把學習器器f(x)當作一個整體進行求導
思路:
- 首先梯度下降爲:θ=θ−α∂θ∂L(θ)
- 我們看boosting的學習器更新公式:fm(x)=fm−1(x)+βmΦm(x)其中Φm爲當前弱學習器,可以看出兩者存在形式上的一致性。
- 當把fm−1(x)當作參數,由梯度下降得到
fm(x)=fm−1(x)−βm∂fm−1(x)∂L(y,fm−1(x))
對比學習器更新公式,我們可以讓Φm(x)儘量接近−∂fm−1(x)∂L(y,fm−1(x)),即直觀理解爲在函數空間的梯度下降方法。
算法過程
- 假設訓練集有N個樣本:(x1,y1),(x2,y2),...,(xN,yN)對應爲迴歸任務
- 初試化一個弱學習器(迴歸樹等)f0(x)=0其中w爲對應弱學習器的參數。
- 對m=1:M
- 計算負梯度yi′=−∂fm−1(xi)∂L(yi,fm−1(xi)),i=1,2,...,N
- 用Φm(x)來擬合(xi,yi′),wm=argwmini=1∑NL弱學習器(yi′,Φm(xi;w)) 最小化弱學習器的L,得到此輪的弱分類器Φm(x)
- 確定Φm後,之後就要確定βm(求導令爲0或更高效的)βm=argβmmini=1∑NL(yi′,fm−1(x)+βmΦm(xi;wm))
- 最後將第m步的弱學習器組合進強學習器:fm(x)=fm−1(x)+βmΦm(x)
- 每次檢驗f(x)是否達到收斂條件,或者迭代次數是否達到上限。
- 滿足則停止算法
我們其實能在很多時候,發現Φm(x)要擬合的是(xi,ym−1,i−Φm(xi;w)),那是因爲當L(yi′,Φm(xi;w)中loss函數取MSEloss時,對其求導並加符號就是ym−1,i−Φm(xi;w)
自此GB的思想講完了,那GBDT是什麼呢?
GBDT
顧名思義GBDT = GB + DT,即將弱學習器固定爲決策樹(CART迴歸樹)的GB算法
算法過程
- 假設訓練集有N個樣本:(x1,y1),(x2,y2),...,(xN,yN)對應爲迴歸任務
- 初試化一個弱學習器(CART迴歸樹等)f0(x)=0其中w爲對應弱學習器的參數。
- 對m=1:M
- 計算負梯度yi′=−∂fm−1(xi)∂L(yi,fm−1(xi)),i=1,2,...,N
- 用Φm(x)來擬合(xi,yi′),wm=argwmini=1∑N(yi′−Φm(xi;w))2 最小化第m棵樹的MSELoss,得到此輪的弱分類器Φm(x)
- 確定Φm後,通過一維線搜索確定βm βm=argβmmini=1∑NL(yi′,fm−1(x)+βmΦm(xi;wm))
- 最後將第m步的弱學習器組合進強學習器:fm(x)=fm−1(x)+βmΦm(x)
- 每次檢驗f(x)是否達到收斂條件,或者迭代次數是否達到上限。
- 滿足則停止算法
XGBoost
XGBoost是一種比較特殊的GB方法,引入了二階導的信息,並加入了正則項的約束
理論推導網上大把,無非幾點:
- 目標函數增加正則項Ω(ft)
- 將式子通過泰勒公式展開到二階導部分
- 將對所有樣本的遍歷變成對所有葉子節點的遍歷,這樣可以將每個葉子的值/一階導/二階導都用一個很優美的式子結合。最終得到目標函數的形式
- 最後葉子節點的w值爲目標函數對w求導,令其爲0的w值,使目標函數最小
與GBDT比較
- XGBoost引入了二階導信息,並且不需要進行線搜,僅僅靠葉節點分裂得到樹(複雜的推導保證了分裂的同時是沿着二階+一階導方向使loss降低);GBDT只使用了一階導,並且需要進行線搜。
- XGBoost對目標函數做了正則化;GBDT沒有
算法實現
https://blog.csdn.net/qq_22238533/article/details/79477547
目標函數爲Obj=∑i=1NL(yi,yipred)+∑i=1KΩ(f(x))
- 假設訓練集有N個樣本:(x1,y1),(x2,y2),...,(xN,yN)對應爲迴歸任務
- 初試化一個弱學習器(迴歸樹等)f0(x)=0其中w爲對應弱學習器的參數。
- 對m=1:M
- 計算目標函數種L部分的一階導gi=−∂fm−1(xi)∂L(yi,fm−1(xi))和二階導hi=−∂fm−1(xi)∂2L(yi,fm−1(xi)), 其中i=1,2,...,N
- 用Φm(x)來擬合(xi,yi−fm−1(xi)),擬合的過程其實就是XGBoost節點分裂的過程,使得目標函數最小。是否根據某屬性劃分的依據Gain:
Gain=21[HL+λGL2+HR+λGR2−HR+HL+λ(GL+GR)2]−γ 根據Gain最大的屬性分裂,如都是小於0,則不分裂。其中GL和HL分別是左邊節點所有例子的一階導之和 和 二階導之和。
- 葉子節點的值w (對於該葉子的一階和二階導的和):
w=−∑H+λ∑G
- 最後將第m步的弱學習器組合進強學習器:fm(x)=fm−1(x)+Φm(x)
- 每次檢驗f(x)是否達到收斂條件,或者迭代次數是否達到上限。
- 滿足則停止算法
一些trick
- Shrinkage
其實就是在得到的w上乘上一個係數,讓每一棵樹學的東西不要太多,給之後的樹學習空間;
這個方法在GBDT中也有用到。可以對應於傳統機器學習中的學習率參數,xgb.train()
函數中的eta
參數
- 行列採樣
其實就是Random Forest的方法,兩個隨機性的體現。
行採樣(樣本隨機性bootstrap)xgb.train()
中的subsample
參數;
列採樣(隨機選擇屬性) xgb.train()
中的colsample_bytree
參數 防止過擬合
這是xgb.train()
函數中最關鍵且不易理解的參數,更具體地可以看官方文檔,或XGBoost參數詳解