這篇文章打算介紹一下boosting 和xgboost,這兩天也看了好多文章,也感受了解的不深,算是作個記錄。c++
先簡單提一下Bagging, 原理是從現有數據中有放回的抽取若干個樣本構建分類器,重複若干次創建若干個分類器進行投票。 而Boost(提高)是指每一步都產生一個弱預測模型,而後加權累加到總模型中。每一步弱預測模型生成的依據都是損失函數的負梯度方向,若干步之後就能夠達到逼近損失函數局部的最小值。算法
首先Boost是一個加法模型,有若干個基函數及其權重乘積之和的累加。
函數
要使損失函數最小,那麼新加的這一項恰好等於損失函數的負梯度。這樣一步一步就使得損失函數降低最快。 優化
這裏的lambda能夠和beta合併表示步長。對於這個基函數而言,其實就是關於x和這個函數梯度的一個擬合,而後步長的選擇能夠根據線性搜索,即尋找在這個梯度上降低最小值的那個步長,儘快逼近損失函數的最小值。 梯度提高完cdn
首先既然是樹,上一篇介紹過,基函數是決策樹,而損失函數則是根據具體問題具體分析,不過整體方法都是同樣,梯度降低。 好比到第m步, 計算殘差。 blog
有了殘差,再用(xi, rim)去擬合第m個基函數。假設這顆樹把輸入空間劃分紅j個空間R1m, R2m, ...., Rjm。假設在每一個空間的輸出爲bjm。這樣,第m棵樹能夠表示以下:下一步,對樹的每一個區域分別用線性搜索的方法尋找最佳步長,而後與上面的區域預測值合併,最後能夠獲得第m步的目標函數。 get
對於GBDT容易出現過擬合,因此有必要增長一點正則項,好比葉子節點數目或葉子節點預測值的平方和,限制模型複雜度的過分提高。it
以前用的梯度降低只考慮了一階信息,根據泰勒展開,把二階信息用上: io
其中fm爲參數的函數是正則項。能夠表示以下: class
對於決策樹而言,最重要的一共有多少個節點以及節點的權值。因此決策樹能夠表示爲:
各類公式,最後獲得
能夠獲得的結果是:把新一步函數的損失函數變成了只與上一步相關的一個新的損失函數。這樣能夠遍歷數據中全部的分割點,尋找新的損失函數降低最多的分割點,重複上述操做。
相比於梯度降低提高,XGBoost在劃分新的樹的時候還用到了二階信息,所以可以更快的收斂;因爲用c/c++寫的,速度也快。在尋找最加分割點的時候,還能夠引入並行計算,所以速度進一步提升。
參考文章:
XGBoost 與 Boosted Tree:多看幾遍