boosting 3大算法總結
以前的兩篇文章 adaboost 原理 和 boosting原理 寫完後,感受仍是沒有特別弄明白boost,全部就有了本文。算法
集成學習
首先咱們須要知道什麼是集成學習? 集成學習是經過訓練弱幹個弱學習器,並經過必定的結合策略,從而造成一個強學習器。dom
整個過程有兩個難點:機器學習
先來看第一個問題如何獲取個體學習器,在選擇上有兩個:函數
- 同質學習器,例如隨機森林都使用cart樹
- 異質學習器,例如使用不一樣的分類器,最終採起投票的方式
其中用的比較多的是同質學習器。同質學習器按照個體學習器之間是否存在依賴關係能夠分爲兩類:學習
- 第一個是個體學習器之間存在強依賴關係,一系列個體學習器基本都須要串行生成,表明算法是boosting系列算法;
- 第二個是個體學習器之間不存在強依賴關係,一系列個體學習器能夠並行生成,表明算法是bagging和隨機森林(Random Forest)系列算法。
本文重點講boosting算法。3d
boosting基本原理
關於boosting算法,咱們須要知道其中最有名的3個算法:rest
- Adaboost(Adaptive Boosting)
- GBM(Gradient Boosting Machine)
- XGBoost
GBM
咱們先來看 GBM ,其思路是逐步提高,怎麼理解呢?cdn
咱們先看來梯度提高算法:首先給定一個損失函數 L(y,F(x)),其輸入是訓練對:(x1,y1),(x2,y2),...,(xn,yn),目標是找到最優的F(x),使得損失函數L最小,按照傳統梯度降低的方法,咱們會將訓練數據(xi,yi)帶入,而後求L對參數的偏導,再用負梯度進行參數更新: blog
這麼作的一個前提是咱們須要保證損失函數Loss對F可微,F對參數
![\theta](http://static.javashuo.com/static/loading.gif)
可微,第二個可微能夠說比較困難,因而咱們直接在函數空間F中對F進行求解,咱們假設f是一系列數值疊加而來:
其中每一個
![\theta](http://static.javashuo.com/static/loading.gif)
和
![\phi](http://static.javashuo.com/static/loading.gif)
經過下面求極小值獲取:
針對上面
和
的求取上,有兩種成熟的方法:ci
- Gradient Descent
- Newton’s Method
也就分別對應了 GBM 和 XGBoost,先來說 GBM。
咱們對
和
極小值的求取上,在 fm上採起一階泰勒展開,此時求倒數獲得:
那根據一階泰勒,此時求loss的極小值,至關讓f沿着負梯度的方向走,則必然隨着f的迭代,loss是減少的,如今咱們來總結下問題:
咱們將已知輸入數據從 (xi,yi) 轉變到了 (xi,-gm(xi)),咱們如今要用函數
去擬合 (xi,-gm(xi)),而且評判標準以下:
當咱們學習到了
,咱們再去看最佳步長應該是多少:
總結下整個過程:
有了上面這個過程後,咱們還有一步須要確認的是怎麼求最優的
,如今咱們假設
是樹模型,此時咱們須要學習 樹的結構以及每一個葉子節點的權重。
先來學習樹結構.
咱們假設樹能夠分爲T個節點,而且每一個節點權重爲wj,則:
其中 n_jm 是在第j個葉子數據點的個數,針對上面的式子,咱們定義 G_jm 爲第j個葉子節點中全部數據的梯度和,而且將常數項gm去除,咱們獲得:
所以若是樹的結構固定,咱們能夠獲得全部的葉子權重爲:
咱們將其帶回入loss函數,能夠獲得:
下面咱們來決定一個葉子節點是否應該繼續分裂,咱們能夠計算分裂後的loss變化:
若是gain>0則分裂,不然則爲葉子節點。
如今當咱們學習到真正的樹結構後,咱們再去從新學習最優的樹權重:
wjm是第j個葉子節點的權重,如今整個算法的流程以下:
Adaboost
咱們在Adaboost原理一文中給出了算法流程:
咱們能夠從下面4個問題來理解Adaboost算法:
- 1)如何計算學習偏差率e?
- 2 ) 如何獲得弱學習器權重係數α?
- 3)如何更新樣本權重D?
- 4 ) 使用何種結合策略?
第一個問題:學習偏差率e的計算,第m個弱分類器的偏差率爲訓練集上的加權錯誤率:
此處分母其實爲1,能夠省略。 第二個問題:弱分類器權重。
爲何這樣計算弱學習器權重係數?從上式能夠看出,若是分類偏差率ek越大,則對應的弱分類器權重係數αm越小。也就是說,偏差率小的弱分類器權重係數越大。 第三個問題:如何進行權重更新
對於分類正確的,權重下降,對於分類錯誤的,權重增長 第四個問題:集合策略。Adaboost分類採用的是加權平均法,最終的強分類器爲
提高方法
以上內容是咱們在文章 Adaboost 原理中講的,咱們本文來看看其實怎麼符合上文GBM原理的.GBM的算法原理以下:
Adaboost中loss爲指數損失:
此時第m輪迭代,咱們要求:
接下去是重點了,咱們此處如何求最佳的
![\alpha_m , G_m](http://static.javashuo.com/static/loading.gif)
,由於loss函數是指數損失,我麼很容易的經過化解、求導直接獲得最佳的
![\alpha_m , G_m](http://static.javashuo.com/static/loading.gif)
,下面是具體的推導:
因而咱們求最佳的G_m即爲:
接着咱們對
![\alpha_m](http://static.javashuo.com/static/loading.gif)
進行求導,獲得:
XGBOOST
XGBOOST但願直接求解下面的式子從而獲得最優的fm
咱們能夠在fm-1處進行二階泰勒展開,獲得:
進一步化解獲得:
咱們讓G_jm和H_jm分別表示在Region j中的和,因而有:
此時咱們對wjm求導,就能獲得最佳的wjm:
代回loss中:
此時根據loss,我麼就能夠學習到樹的結構:
整個算法描述以下:
在xgboost中,還加入了正則項來防止過擬合:
其中γ是對葉節點的懲罰,α 和 λ 分別是L1和L2正則,此時最優的wjm爲:
此時計算增益公式爲:
總結
本文介紹了boosting算法中最著名的3個算法
- Adaboost(Adaptive Boosting)
- GBM(Gradient Boosting Machine)
- XGBoost
而且介紹了Adaboost是GMB中損失函數爲指數損失的特例,後續還會有兩篇文章,一篇介紹adaboost 算法的變種,另外一篇結合代碼來介紹3個算法。
你的鼓勵是我繼續寫下去的動力,期待咱們共同進步。
參考
Tree Boosting With XGBoost: Why Does XGBoost Win 「Every」 Machine Learning Competition?
Gradient Boosting from scratch
Boosting algorithm: XGBoost
機器學習(23)之GBDT詳解
Gradient Boosting from scratch