adaboost和GBDT的区别以及xgboost和GBDT的区别
adaboost和GBDT的區別以及xgboost和GBDT的區別
AdaBoost:提高那些被前一輪弱分類器錯誤分類樣本的權值,而降低那些被正確分類樣本的權值。這樣一來,那些沒有得到正確分類的數據,由于其權值的加大而受到后一輪的弱分類器的更大關注,于是,分類問題就被一系列的弱分類器“分而治之”。至于第二個問題,即弱分類器的組合,AdaBoost采取加權多數表決的方法。具體地,加大分類誤差率小的弱分類器的權值,使其在表決中起較大的作用,減小分類誤差率較大的弱分類器的權值,使其在表決中起較小的作用。
GBDT和其它Boosting算法一樣,通過將表現一般的數個模型(通常是深度固定的決策樹)組合在一起來集成一個表現較好的模型。抽象地說,模型的訓練過程是對一任意可導目標函數的優化過程。通過反復地選擇一個指向負梯度方向的函數,該算法可被看做在函數空間里對目標函數進行優化。因此可以說Gradient Boosting = Gradient Descent + Boosting。
AdaBoost V.S. GBDT
和AdaBoost一樣,Gradient Boosting也是重復選擇一個表現一般的模型并且每次基于先前模型的表現進行調整。不同的是,AdaBoost是通過提升錯分數據點的權重來定位模型的不足而Gradient Boosting是通過算梯度(gradient)來定位模型的不足。因此相比AdaBoost, Gradient Boosting可以使用更多種類的目標函數,而當目標函數是均方誤差時,計算損失函數的負梯度值在當前模型的值即為殘差。
從決策邊界來說,線性回歸的決策邊界是一條直線,邏輯回歸的決策邊界是一條曲線,而GBDT的決策邊界可能是很多條線。
GBDT并不一定總是好于線性回歸或邏輯回歸。根據沒有免費的午餐原則,沒有一個算法是在所有問題上都能好于另一個算法的。根據奧卡姆剃刀原則,如果GBDT和線性回歸或邏輯回歸在某個問題上表現接近,那么我們應該選擇相對比較簡單的線性回歸或邏輯回歸。具體選擇哪一個算法還是要根據實際問題來決定。
以上部分轉載自https://www.zhihu.com/question/54626685?from=profile_question_card
adaboost一般用于分類,gbt一般用于回歸
機器學習算法中GBDT和XGBOOST的區別有哪些?
-
基分類器的選擇:傳統GBDT以CART作為基分類器,XGBoost還支持線性分類器,這個時候XGBoost相當于帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。
-
二階泰勒展開:傳統GBDT在優化時只用到一階導數信息,XGBoost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,XGBoost工具支持自定義損失函數,只要函數可一階和二階求導。
-
方差-方差權衡:XGBoost在目標函數里加入了正則項,用于控制模型的復雜度。正則項里包含了樹的葉子節點個數TT、每個葉子節點上輸出分數的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是XGBoost優于傳統GBDT的一個特性。
-
Shrinkage(縮減):相當于學習速率(xgboost中的??)。XGBoost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數設置得大一點。(補充:傳統GBDT的實現也有學習速率)
- 列抽樣(column subsampling):XGBoost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是XGBoost異于傳統GBDT的一個特性。
- 缺失值處理:XGBoost考慮了訓練數據為稀疏值的情況,可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,paper提到50倍。即對于特征的值有缺失的樣本,XGBoost可以自動學習出它的分裂方向。
- XGBoost工具支持并行:Boosting不是一種串行的結構嗎?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能進行下一次迭代的(第tt次迭代的損失函數里包含了前面t?1t?1次迭代的預測值)。XGBoost的并行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),XGBoost在訓練之前,預先對數據進行了排序,然后保存為block(塊)結構,后面的迭代中重復地使用這個結構,大大減小計算量。這個block結構也使得并行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。
- 線程緩沖區存儲:按照特征列方式存儲能優化尋找最佳的分割點,但是當以行計算梯度數據時會導致內存的不連續訪問,嚴重時會導致cache miss,降低算法效率。paper中提到,可先將數據收集到線程內部的buffer(緩沖區),主要是結合多線程、數據壓縮、分片的方法,然后再計算,提高算法的效率。
- 可并行的近似直方圖算法:樹節點在進行分裂時,我們需要計算每個特征的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可并行的近似直方圖算法,用于高效地生成候選的分割點。大致的思想是根據百分位法列舉幾個可能成為分割點的候選者,然后從候選者中根據上面求分割點的公式計算找出最佳的分割點。
總結
以上是生活随笔為你收集整理的adaboost和GBDT的区别以及xgboost和GBDT的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于TextRank的关键词提取算法
- 下一篇: 语义分析的一些方法(上篇)