Boosting方法入門

首先什麼是boosting

boosting是一種將弱分類器組合成強分類器的過程

  • 構造一個強分類器很難
  • 構造弱分類器不難
  • 弱分類器的要求:強於隨機猜測 (很淺的CART樹即可)

用數學公式表示即:

f(x)=m=1MαmΦm(x)f(x)=\sum_{m=1}^{M} {α_m{Φ_m(x)}}

其中:Φm(x){Φ_m(x)}爲每個弱分類器 (不同boost方法在αmα_m選擇不一樣)

AdaBoost

一般用於二分類,改進後可用於多分類

每次往強分類器中塞一個弱分類器,並給它相應話語權αmα_m,再檢查是否達到收斂

算法過程:
  • 假設訓練集有NN個樣本:(x1,y1),(x2,y2),...,(xN,yN)(x_1,y_1),(x_2,y_2),...,(x_N,y_N)對應標籤爲yi(1,1)y_i∈(1,-1)
  • 初試給定每個樣本的權重爲 w1,i=1Nw_{1,i}=\frac{1}{N}
  • m=1:Mm=1:M
      - 對有權重wm,iw_{m,i}的數據得到一個最優的弱分類器Φm(x){Φ_m(x)} (這個最優可以是引入權重的loss 或者 使得誤差εmε_m最小)
      - 計算該弱分類器在wmw_{m}的誤差:εm=i=1Nwm,iI(Φm(x)!=yi)ε_m=\sum_{i=1}^{N} {w_{m,i}I({Φ_m(x)}}!=y_i)
      - 根據誤差計算當前弱分類器的權重:αm=12log1εmεmα_m=\frac{1}{2}log\frac{1-ε_m}{ε_m} (可以看出誤差越小,當前弱分類器組合的權重越大)
      - 更新訓練數據的權重分佈:wm+1,i=wm,iexp(αmyiΦm(xi))Zmw_{m+1,i}=\frac{w_{m,i}exp(-α_my_iΦ_m(x_i))}{Z_m} (其中ZmZ_m爲所有數據wm,iexp(αmyiΦm(xi))w_{m,i}exp(-α_my_iΦ_m(x_i))之和,可以看出當分類錯誤時,yiΦm(xi)-y_iΦ_m(x_i)爲正,分子會較大,即給了該分錯數據更大的權重)
      - 最後將第m步的弱分類器組合進強分類器:Φ(x)=m=1MαmΦm(x)Φ(x)=\sum_{m=1}^{M} {α_m{Φ_m(x)}}
  • 再取sign函數得強分類器:f(x)=sign(m=1MαmΦm(x))f(x)=sign(\sum_{m=1}^{M} {α_m{Φ_m(x)}})
    每次檢驗f(x)f(x)是否達到收斂條件,或者迭代次數是否達到上限。(取sign函數只在檢驗是否收斂時有用)
  • 滿足則停止算法

實例:https://blog.csdn.net/guyuealian/article/details/70995333
推導(建議熟悉):https://zhuanlan.zhihu.com/p/62037189 (給出了公式得來由&指數損失)
另外還有西瓜書可以看。

Gradient Boosting

一般用於迴歸任務,設定閾值後也可用於迴歸任務

根據梯度下降的啓發,把學習器器f(x)f(x)當作一個整體進行求導

思路:
  • 首先梯度下降爲:θ=θαL(θ)θθ=θ-α\frac{∂L(θ)}{∂θ}
  • 我們看boosting的學習器更新公式:fm(x)=fm1(x)+βmΦm(x)f_m(x)=f_{m-1}(x)+ {β_m{Φ_m(x)}}其中ΦmΦ_m爲當前弱學習器,可以看出兩者存在形式上的一致性。
  • 當把fm1(x)f_{m-1}(x)當作參數,由梯度下降得到
    fm(x)=fm1(x)βmL(y,fm1(x))fm1(x)f_m(x)=f_{m-1}(x)-β_m\frac{∂L(y,f_{m-1}(x))}{∂f_{m-1}(x)}
    對比學習器更新公式,我們可以讓Φm(x)Φ_m(x)儘量接近L(y,fm1(x))fm1(x)-\frac{∂L(y,f_{m-1}(x))}{∂f_{m-1}(x)},即直觀理解爲在函數空間的梯度下降方法。
算法過程
  • 假設訓練集有NN個樣本:(x1,y1),(x2,y2),...,(xN,yN)(x_1,y_1),(x_2,y_2),...,(x_N,y_N)對應爲迴歸任務
  • 初試化一個弱學習器(迴歸樹等)f0(x)=0f_0(x)=0其中ww爲對應弱學習器的參數。
  • m=1:Mm=1:M
      - 計算負梯度yi=L(yi,fm1(xi))fm1(xi),i=1,2,...,Ny_{i}^{'}=-\frac{∂L(y_i,f_{m-1}(x_i))}{∂f_{m-1}(x_i)}, i=1,2,...,N

    - 用Φm(x)Φ_m(x)來擬合(xi,yi)(x_i,y_{i}^{'})wm=arg minwi=1NL(yi,Φm(xi;w))w_m=arg\,\min_{w}\sum_{i=1}^{N}L_{弱學習器}(y_{i}^{'},Φ_m(x_i;w))    最小化弱學習器的LL,得到此輪的弱分類器Φm(x)Φ_m(x)

     - 確定ΦmΦ_m後,之後就要確定βmβ_m(求導令爲0或更高效的)βm=arg minβmi=1NL(yi,fm1(x)+βmΦm(xi;wm))β_m=arg\,\min_{β_m}\sum_{i=1}^{N}L(y_{i}^{'},f_{m-1}(x)+β_mΦ_m(x_i;w_m))
     - 最後將第m步的弱學習器組合進強學習器:fm(x)=fm1(x)+βmΦm(x)f_m(x)=f_{m-1}(x)+ {β_m{Φ_m(x)}}

  • 每次檢驗f(x)f(x)是否達到收斂條件,或者迭代次數是否達到上限。
  • 滿足則停止算法

我們其實能在很多時候,發現Φm(x)Φ_m(x)要擬合的是(xi,ym1,iΦm(xi;w))(x_i,y_{m-1,i}-Φ_m(x_i;w)),那是因爲當L(yi,Φm(xi;w)L(y_{i}^{'},Φ_m(x_i;w)中loss函數取MSEloss時,對其求導並加符號就是ym1,iΦm(xi;w)y_{m-1,i}-Φ_m(x_i;w)

自此GB的思想講完了,那GBDT是什麼呢?

GBDT

顧名思義GBDT = GB + DT,即將弱學習器固定爲決策樹(CART迴歸樹)的GB算法

算法過程
  • 假設訓練集有NN個樣本:(x1,y1),(x2,y2),...,(xN,yN)(x_1,y_1),(x_2,y_2),...,(x_N,y_N)對應爲迴歸任務
  • 初試化一個弱學習器(CART迴歸樹等)f0(x)=0f_0(x)=0其中ww爲對應弱學習器的參數。
  • m=1:Mm=1:M
      - 計算負梯度yi=L(yi,fm1(xi))fm1(xi),i=1,2,...,Ny_{i}^{'}=-\frac{∂L(y_i,f_{m-1}(x_i))}{∂f_{m-1}(x_i)}, i=1,2,...,N

    - 用Φm(x)Φ_m(x)來擬合(xi,yi)(x_i,y_{i}^{'})wm=arg minwi=1N(yiΦm(xi;w))2w_m=arg\,\min_{w}\sum_{i=1}^{N}(y_{i}^{'}-Φ_m(x_i;w))^{2}    最小化第m棵樹的MSELoss,得到此輪的弱分類器Φm(x)Φ_m(x)

     - 確定ΦmΦ_m後,通過一維線搜索確定βmβ_m βm=arg minβmi=1NL(yi,fm1(x)+βmΦm(xi;wm))β_m=arg\,\min_{β_m}\sum_{i=1}^{N}L(y_{i}^{'},f_{m-1}(x)+β_mΦ_m(x_i;w_m))
     - 最後將第m步的弱學習器組合進強學習器:fm(x)=fm1(x)+βmΦm(x)f_m(x)=f_{m-1}(x)+ {β_m{Φ_m(x)}}

  • 每次檢驗f(x)f(x)是否達到收斂條件,或者迭代次數是否達到上限。
  • 滿足則停止算法

XGBoost

XGBoost是一種比較特殊的GB方法,引入了二階導的信息,並加入了正則項的約束

理論推導網上大把,無非幾點:

  • 目標函數增加正則項Ω(ft)Ω(f_{t})
  • 將式子通過泰勒公式展開到二階導部分
  • 將對所有樣本的遍歷變成對所有葉子節點的遍歷,這樣可以將每個葉子的值/一階導/二階導都用一個很優美的式子結合。最終得到目標函數的形式
  • 最後葉子節點的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))Obj=\sum_{i=1}^{N}L(y_i,y_i^{pred})+\sum_{i=1}^{K}Ω(f(x))

  • 假設訓練集有NN個樣本:(x1,y1),(x2,y2),...,(xN,yN)(x_1,y_1),(x_2,y_2),...,(x_N,y_N)對應爲迴歸任務
  • 初試化一個弱學習器(迴歸樹等)f0(x)=0f_0(x)=0其中ww爲對應弱學習器的參數。
  • m=1:Mm=1:M
      - 計算目標函數種LL部分的一階導gi=L(yi,fm1(xi))fm1(xi)g_{i}^{}=-\frac{∂L(y_i,f_{m-1}(x_i))}{∂f_{m-1}(x_i)}和二階導hi=2L(yi,fm1(xi))fm1(xi)h_{i}^{}=-\frac{∂^{2}L(y_i,f_{m-1}(x_i))}{∂f_{m-1}(x_i)}, 其中i=1,2,...,Ni=1,2,...,N

    - 用Φm(x)Φ_m(x)來擬合(xi,yifm1(xi))(x_i,y_i-f_{m-1}(x_i)),擬合的過程其實就是XGBoost節點分裂的過程,使得目標函數最小。是否根據某屬性劃分的依據GainGain
Gain=12[GL2HL+λ+GR2HR+λ(GL+GR)2HR+HL+λ]γGain=\frac{1}{2}[\frac{G_L^2}{H_L+λ}+\frac{G_R^2}{H_R+λ}-\frac{(G_L+G_R)^2}{H_R+H_L+λ}]-γ    根據GainGain最大的屬性分裂,如都是小於0,則不分裂。其中GLG_LHLH_L分別是左邊節點所有例子的一階導之和 和 二階導之和。
     - 葉子節點的值w (對於該葉子的一階和二階導的和):
w=GH+λw=-\frac{\sum G}{\sum H+λ}
     - 最後將第m步的弱學習器組合進強學習器:fm(x)=fm1(x)+Φm(x)f_m(x)=f_{m-1}(x)+ {Φ_m(x)}

  • 每次檢驗f(x)f(x)是否達到收斂條件,或者迭代次數是否達到上限。
  • 滿足則停止算法
一些trick
  • Shrinkage
    其實就是在得到的ww上乘上一個係數,讓每一棵樹學的東西不要太多,給之後的樹學習空間;
    這個方法在GBDT中也有用到。可以對應於傳統機器學習中的學習率參數,xgb.train()函數中的eta參數
  • 行列採樣
    其實就是Random Forest的方法,兩個隨機性的體現。
    行採樣(樣本隨機性bootstrap)xgb.train()中的subsample參數;
    列採樣(隨機選擇屬性) xgb.train()中的colsample_bytree參數 防止過擬合

這是xgb.train()函數中最關鍵且不易理解的參數,更具體地可以看官方文檔,或XGBoost參數詳解

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