GBDT,Adaboosting概念區分 GBDT與xgboost區別


http://blog.csdn.net/w28971023/article/details/8240756

 

 

 ================================================================

GBDT與xgboost區別

GBDT XGBOOST的區別與聯系

Xgboost是GB算法的高效實現,xgboost中的基學習器除了可以是CART(gbtree)也可以是線性分類器(gblinear)。 

傳統GBDT以CART作為基分類器,xgboost還支持線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。

傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。

xgboost在代價函數里加入了正則項,用於控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和

列抽樣(column subsampling)。xgboost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是xgboost異於傳統gbdt的一個特性。

xgboost工具支持並行。

Shrinkage(縮減),相當於學習速率(xgboost中的eta)。xgboost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。

 ================================================================

 

首先 xgboost是Gradient Boosting的一種高效系統實現,並不是一種單一算法。
  xgboost里面的基學習器除了用tree(gbtree),也可用線性分類器(gblinear)。而GBDT則特指梯度提升決策樹算法。
  xgboost相對於普通gbm的實現,可能具有以下的一些優勢:
  1. 顯式地將樹模型的復雜度作為正則項加在優化目標
  2. 公式推導里用到了二階導數信息,而普通的GBDT只用到一階
  3. 允許使用column(feature) sampling來防止過擬合,借鑒了Random Forest的思想,sklearn里的gbm好像也有類似實現。

  4.實現了一種分裂節點尋找的近似算法,用於加速和減小內存消耗。
  5.節點分裂算法能自動利用特征的稀疏性。
  6.data事先排好序並以block的形式存儲,利於並行計算
  7.cache-aware, out-of-core computation,這個我不太懂。。
  8.支持分布式計算可以運行在MPI,YARN上,得益於底層支持容錯的分布式通信框架rabit。

 

工作中用得比較多,區別在於:
1. 在Loss function中做approximate,把泰勒展開限制為1階和2階偏導,gbdt是1階;
2. penalty function Omega主要是對樹的葉子數和葉子分數做懲罰,這點確保了樹的簡單性;
3. 快,非常快,最新版本支持spark,4000多萬樣本,70個dimension,200棵樹的訓練也就1小時不到;

================================================================

Boosting,迭代,即通過迭代多棵樹來共同決策。

 GBDT工作過程實例:學習的是殘差。

GBDT的核心就在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測值后能得真實值的累加量。比如A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差為6歲。那么在第二棵樹里我們把A的年齡設為6歲去學習,如果第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;如果第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹里A的年齡就變成1歲,繼續學。這就是Gradient Boosting在GBDT中的意義,

GBDT可以用更少的feature,且避免過擬合。Boosting的最大好處在於,每一步的殘差計算其實變相地增大了分錯instance的權重,而已經分對的instance則都趨向於0。這樣后面的樹就能越來越專注那些前面被分錯的instance。就像我們做互聯網,總是先解決60%用戶的需求湊合着,再解決35%用戶的需求,最后才關注那5%人的需求,這樣就能逐漸把產品做好,

 

 隨機森林:特征是隨機選的。所以同一個樣本可以訓練出多個結果。

比如A這個人,第一棵樹認為是10歲,第二棵樹認為是0歲,第三棵樹認為是20歲,我們就取平均值10歲。

 

Adaboost:分類錯誤的樣本給更高的權重

提到boost多數人也會想到Adaboost。Adaboost是另一種boost方法,它按分類對錯,分配不同的weight,計算cost function時使用這些weight,從而讓“錯分的樣本權重越來越大,使它們更被重視”。Bootstrap也有類似思想,它在每一步迭代時不改變模型本身,也不計算殘差,而是從N個instance訓練集中按一定概率重新抽取N個instance出來(單個instance可以被重復sample),對着這N個新的instance再訓練一輪。由於數據集變了迭代模型訓練結果也不一樣,而一個instance被前面分錯的越厲害,它的概率就被設的越高,這樣就能同樣達到逐步關注被分錯的instance,逐步完善的效果。Adaboost的方法被實踐證明是一種很好的防止過擬合的方法,但至於為什么則至今沒從理論上被證明。

 

GBDT也可以在使用殘差的同時引入Bootstrap re-sampling,GBDT多數實現版本中也增加的這個選項,但是否一定使用則有不同看法。re-sampling一個缺點是它的隨機性,即同樣的數據集合訓練兩遍結果是不一樣的,也就是模型不可穩定復現,這對評估是很大挑戰,比如很難說一個模型變好是因為你選用了更好的feature,還是由於這次sample的隨機因素。

 

 GBDT的適用范圍

該版本GBDT幾乎可用於所有回歸問題(線性/非線性),相對logistic regression僅能用於線性回歸,GBDT的適用面非常廣。亦可用於二分類問題(設定閾值,大於閾值為正例,反之為負例)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM