機器學習算法中GBDT和XGBOOST的區別有哪些?

做者:wepon
連接:https://www.zhihu.com/question/41354392/answer/98658997
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

最近贊突然多了起來,我猜是校招季來了吧。但若是面試官問你這個問題,我建議不要按個人回答來,背答案不如本身理解透了,何況我這是十分得五分的答案。最初的GBDT發展到如今的XGBoost,改進是一點一滴來的,是一篇篇論文的積累,不少方法並不是XGBoost第一次提出,固然也不是說XGBoost沒改進,能夠說XGBoost把算法和系統實現都作得淋漓盡致。因此若是不是爲了速成,不是爲了校招,建議把經典的論文拿出來讀一讀,相信對算法的理解能更進一層。面試

最近實習恰好在組內分享了GBDT,因此有了這番感悟,看了更多資料,發現本身理解仍是有誤差,附上我作的ppt,若再有誤差,歡迎跟我郵件交流: http://wepon.me/files/gbdt.pdf算法

 

如下原答案:多線程

-----------------------------------分佈式

xgboost相比傳統gbdt有何不一樣?xgboost爲何快?xgboost如何支持並行? ide

 

看了陳天奇大神的文章和slides,略抒己見,沒有面面俱到,不恰當的地方歡迎討論:函數

  • 傳統GBDT以CART做爲基分類器,xgboost還支持線性分類器,這個時候xgboost至關於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題)。
  • 傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。
  • xgboost在代價函數里加入了正則項,用於控制模型的複雜度。正則項裏包含了樹的葉子節點個數、每一個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來說,正則項下降了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
  • Shrinkage(縮減),至關於學習速率(xgboost中的eta)。xgboost在進行完一次迭代後,會將葉子節點的權重乘上該係數,主要是爲了削弱每棵樹的影響,讓後面有更大的學習空間。實際應用中,通常把eta設置得小一點,而後迭代次數設置得大一點。(補充:傳統GBDT的實現也有學習速率)
  • 列抽樣(column subsampling)。xgboost借鑑了隨機森林的作法,支持列抽樣,不只能下降過擬合,還能減小計算,這也是xgboost異於傳統gbdt的一個特性。

 

  • 對缺失值的處理。對於特徵的值有缺失的樣本,xgboost能夠自動學習出它的分裂方向。
  • xgboost工具支持並行。boosting不是一種串行的結構嗎?怎麼並行的?注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數裏包含了前面t-1次迭代的預測值)。xgboost的並行是在特徵粒度上的。咱們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(由於要肯定最佳分割點),xgboost在訓練以前,預先對數據進行了排序,而後保存爲block結構,後面的迭代中重複地使用這個結構,大大減少計算量。這個block結構也使得並行成爲了可能,在進行節點的分裂時,須要計算每一個特徵的增益,最終選增益最大的那個特徵去作分裂,那麼各個特徵的增益計算就能夠開多線程進行。

 

  • 可並行的近似直方圖算法。樹節點在進行分裂時,咱們須要計算每一個特徵的每一個分割點對應的增益,即用貪心法枚舉全部可能的分割點。當數據沒法一次載入內存或者在分佈式狀況下,貪心算法效率就會變得很低,因此xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點。

 

=============工具

回覆 學習

在評論裏的問題,由於有些公式放正文比較好。評論裏討論的問題的大意是 「xgboost代價函數里加入正則項,是否優於cart的剪枝」。其實陳天奇大神的slides裏面也是有提到的,我當一下搬運工。

 

決策樹的學習過程就是爲了找出最優的決策樹,然而從函數空間裏全部的決策樹中找出最優的決策樹是NP-C問題,因此常採用啓發式(Heuristic)的方法,如CART裏面的優化GINI指數、剪枝、控制樹的深度。這些啓發式方法的背後每每隱含了一個目標函數,這也是大部分人常常忽視掉的。xgboost的目標函數以下:優化

<img src="https://pic4.zhimg.com/50/75894665f9fc8cf514a4e95184138ff6_hd.jpg" data-rawwidth="551" data-rawheight="119" class="origin_image zh-lightbox-thumb" width="551" data-original="https://pic4.zhimg.com/75894665f9fc8cf514a4e95184138ff6_r.jpg">

 

其中正則項控制着模型的複雜度,包括了葉子節點數目T和leaf score的L2模的平方:spa

<img src="https://pic3.zhimg.com/50/d0fd8e207ab19a2c6af7a20d23ac7ac4_hd.jpg" data-rawwidth="417" data-rawheight="84" class="content_image" width="417">

 

那這個跟剪枝有什麼關係呢??? 跳過一系列推導,咱們直接來看xgboost中樹節點分裂時所採用的公式:

<img src="https://pic1.zhimg.com/50/7f872e5a5e01f3c50fb0230254b44ff6_hd.jpg" data-rawwidth="769" data-rawheight="219" class="origin_image zh-lightbox-thumb" width="769" data-original="https://pic1.zhimg.com/7f872e5a5e01f3c50fb0230254b44ff6_r.jpg">

 

這個公式形式上跟ID3算法(採用entropy計算增益) 、CART算法(採用gini指數計算增益) 是一致的,都是用分裂後的某種值 減去 分裂前的某種值,從而獲得增益。爲了限制樹的生長,咱們能夠加入閾值,當增益大於閾值時才讓節點分裂,上式中的gamma即閾值,它是正則項裏葉子節點數T的係數,因此xgboost在優化目標函數的同時至關於作了預剪枝。另外,上式中還有一個係數lambda,是正則項裏leaf score的L2模平方的係數,對leaf score作了平滑,也起到了防止過擬合的做用,這個是傳統GBDT裏不具有的特性。

相關文章
相關標籤/搜索