GBT、GBDT、GBRT與Xgboost
我們首先介紹下提升樹,再依此介紹梯度提升樹、GBDT、GBRT,最后介紹Xgboost.
- 提升樹(boosting tree)
提升樹(boosting tree)是以決策樹為基本學習器的提升方法,它被認為是統計學習中性能最好的方法之一。對於分類問題,提升樹的決策樹是二叉決策樹,對於回歸問題,提升樹中的決策是二叉回歸樹。
提升樹模型可以表示為決策樹為基學習器的加法模型:
其中, 表示第
個決策樹,
為第
個決策樹的參數,
為決策樹的數量。
提升樹采用前向分步算法,
不同問題的提升樹學習算法主要區別在於使用的損失函數不同(設預測值為 ,真實值為
):
提升樹的學習思想有點類似一打高爾夫球,先粗略的打一桿,然后在之前的基礎上逐步靠近球洞,也就是說每一棵樹學習的是之前所有樹結論和的殘差,這個殘差就是一個加預測值后能得真實值的累加量。
例如在回歸問題中,提升樹采用平方誤差損失函數,此時:
其中 為當前模型擬合數據的殘差。所以對回歸問題的提升樹算法,第
個決策樹
只需要簡單擬合當前模型的殘差。
詳細的回歸提升樹算法如下:
2. 梯度提升樹(GBT)
Freidman
提出了梯度提升樹算法(GBT)。
梯度提升樹(GBT)的一個核心思想是利用損失函數的負梯度在當前模型的值作為殘差的近似值,本質上是對損失函數進行一階泰勒展開,從而擬合一個回歸樹。至於為什么用損失函數的負梯度替代殘差,看這里:https://www.cnblogs.com/jiading/articles/12899791.html
看了之前的不少回答感覺都沒答到點子上,題主問的是為什么前向分步時不直接擬合殘差?
簡單來講就一句話,為了可以擴展到更復雜的損失函數中。
這時候你可能就有疑問了,難道不是所有的損失函數都在
時最小嗎?
那可能你忘了正則項這一回事,如果只是經驗風險最小化的話非常容易過擬合,所以一個合理的辦法就是在每個基模型中加入正則項,所以在有正則項的情況下就不再是
時損失函數最小了,所以我們需要計算損失函數的梯度,而不能直接使用分模型來擬合殘差。
回憶泰勒展開公式:
將損失函數使用一階泰勒展開公式( 相當於這里的
):
則有:
要使得損失函數降低,則根據梯度下降的思想讓損失函數對 進行求導,按照負梯度更新改值,則損失函數是下降的,即:
這里我們相當於獲得了樣本的標簽,接下來就是用這個標簽來訓練決策樹。
另外,梯度提升樹用於分類模型時,是梯度提升決策樹GBDT
;用於回歸模型時,是梯度提升回歸樹GBRT
,二者的區別主要是損失函數不同。
例如GBRT算法的偽代碼如下:
另外,Freidman從bagging策略受到啟發,采用隨機梯度提升來修改了原始的梯度提升算法,即每一輪迭代中,新的決策樹擬合的是原始訓練集的一個子集(而並不是原始訓練集)的殘差,這個子集是通過對原始訓練集的無放回隨機采樣而來,類似於自助采樣法。
這種方法引入了隨機性,有助於改善過擬合,另一個好處是未被采樣的另一部分字集可以用來計算包外估計誤差。
GBT和隨機森林(RF)的比較:
(1)從模型框架的角度看:
(2)從偏差分解的角度來看:
(3)如果在梯度提升樹和隨機森林之間二選一,幾乎總是建議選擇梯度提升樹。
3. Xgboost
Xgboost也使用與提升樹相同的前向分步算法,其區別在於:Xgboost通過結構風險最小化來確定下一個決策樹的參數 :
其中:
與提升樹不同的是,Xgboost還使用了二階泰勒展開。
定義:
其中 分別為損失函數
對
的一階導數和二階導數。
回憶到泰勒展開式是:
因此我們對損失函數二階泰勒展開有( 相當於這里的
):
可以看到提升樹(GBT)只使用了一階泰勒展開.
另外正則化項由兩部分構成:
該部分表示決策樹的復雜度,其中 為葉節點的個數,
為每個葉節點的輸出值,
為系數,控制這兩個部分的比重。
該復雜度是一個經驗公式。事實上還有很多其他的定義復雜度的方式,只是這個公式效果還不錯。
然后用類似牛頓法的方式進行迭代。在訓練決策樹時,還采用了類似於隨機森林的策略,對特征向量的分量進行抽樣。
Xgboost相比與GBDT:
(1) 傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。例如,xgboost支持線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)
(2) xgboost在代價函數里加入了正則項,用於控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
(3)列抽樣(column subsampling)。xgboost借鑒了隨機森林的做法,支持列抽樣(即每次的輸入特征不是全部特征),不僅能降低過擬合,還能減少計算,這也是xgboost異於傳統gbdt的一個特性。
(4)並行化處理:在訓練之前,預先對每個特征內部進行了排序找出候選切割點,然后保存為block結構,后面的迭代中重復地使用這個結構,大大減小計算量。在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行,即在不同的特征屬性上采用多線程並行方式尋找最佳分割點。
(個人認為后面兩個,更改的GBDT也可以做到,相比於GBDT,Xgboost最重要的優點還是用到了二階泰勒展開信息和加入正則項)
參考資源:
【1】
【2】
集成學習綜述-從決策樹到XGBoostmp.weixin.qq.com
【3】
yuyuqi:ID3、C4.5、CART、隨機森林、bagging、boosting、Adaboost、GBDT、xgboost算法總結zhuanlan.zhihu.com