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