1. 集成學習(Ensemble Learning)原理
2. 集成學習(Ensemble Learning)Bagging
3. 集成學習(Ensemble Learning)隨機森林(Random Forest)
4. 集成學習(Ensemble Learning)Adaboost
5. 集成學習(Ensemble Learning)GBDT
6. 集成學習(Ensemble Learning)算法比較
7. 集成學習(Ensemble Learning)Stacking
1. AdaBoost Vs GBDT
- 相同
- AdaBoost和GBDT都是重復選擇一個表現一般的模型並且每次基於先前模型的表現進行調整。
- 不同
- AdaBoost是通過提升錯分數據點的權重來定位模型的不足。
- BDT是通過擬合梯度的殘差來迭代的。
- GBDT是一個通用算法,可以使用更多種類的目標函數。
- Adaboost一般用於分類,GBDT一般用於回歸
2. GBDT Vs XGBOOST
- 基分類器的選擇:傳統GBDT以CART作為基分類器,XGBoost還支持線性分類器,這個時候XGBoost相當於帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。
- 二階泰勒展開:傳統GBDT在優化時只用到一階導數信息,XGBoost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,XGBoost工具支持自定義損失函數,只要函數可一階和二階求導。
- XGBoost在目標函數里加入了正則項,用於控制模型的復雜度。
- 列抽樣(column subsampling):XGBoost借鑒了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是XGBoost異於傳統GBDT的一個特性。
- 缺失值處理:XGBoost考慮了訓練數據為稀疏值的情況,可以為缺失值或者指定的值指定分支的默認方向,這能大大提升算法的效率,paper提到50倍。即對於特征的值有缺失的樣本,XGBoost可以自動學習出它的分裂方向。
- XGBoost工具支持並行:Boosting不是一種串行的結構嗎?怎么並行的?注意XGBoost的並行不是tree粒度的並行,XGBoost也是一次迭代完才能進行下一次迭代的(第次迭代的損失函數里包含了前面次迭代的預測值)。XGBoost的並行是在特征粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特征的值進行排序(因為要確定最佳分割點),XGBoost在訓練之前,預先對數據進行了排序,然后保存為block(塊)結構,后面的迭代中重復地使用這個結構,大大減小計算量。這個block結構也使得並行成為了可能,在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行。
3. GBDT和lightGBM
- xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,區別是xgboost對每一層所有節點做無差別分裂,可能有些節點的增益非常小,對結果影響不大,但是xgboost也進行了分裂,帶來了務必要的開銷。 leaf-wise的做法是在當前所有葉子節點中選擇分裂收益最大的節點進行分裂,如此遞歸進行,很明顯leaf-wise這種做法容易過擬合,因為容易陷入比較高的深度中,因此需要對最大深度做限制,從而避免過擬合。
- lightgbm使用了基於histogram的決策樹算法,這一點不同與xgboost中的 exact 算法,histogram算法在內存和計算代價上都有不小優勢。直方圖算法介紹https://blog.csdn.net/jasonwang_/article/details/80833001
- 直方圖做差加速:一個子節點的直方圖可以通過父節點的直方圖減去兄弟節點的直方圖得到,從而加速計算。