網站首頁 編程語言 正文
XGBoost的優(yōu)缺點: 與GBDT相比: 1)GBDT以傳統(tǒng)CART作為基分類器,而XGBoost支持線性分類器,相當于引入L1和L2正則化項的邏輯回歸(分類問題)和線性回歸(回歸問題);
2)GBDT在優(yōu)化時只用到一階導數,XGBoost對代價函數做了二階泰勒展開,引入了一階導數和二階導數,一方面增加了精度,另一方面支持自定義的損失函數,只要是能滿足二階連續(xù)可導的函數均可以作為損失函數;
3)XGBoost在損失函數中引入正則化項,用于控制模型的復雜度。正則化項包含全部葉子節(jié)點的個數gammaT,以及每個葉子節(jié)點輸出的結果score(wj)的L2模的平方和1/2lambda||w||^2。從Bias-variance tradeoff角度考慮,正則項降低了模型的方差,防止模型過擬合,這也是xgboost優(yōu)于傳統(tǒng)GBDT的一個特性。其中gamma與lambda需要進行調參。
4)當樣本存在缺失值時,xgBoosting能自動學習分裂方向,即XGBoost對樣本缺失值不敏感,該處理源于稀疏感知算法,在初次計算Gain時剔除缺失值,然后將缺失值先后加入不同方向節(jié)點,最終取Gain值最優(yōu)的結果。
5)XGBoost借鑒RF的做法,支持列抽樣,這樣不僅能防止過擬合,還能降低計算,這也是xgboost異于傳統(tǒng)gbdt的一個特性。
6)XGBoost在每次迭代之后,會將葉子節(jié)點的權重乘上一個學習率(相當于XGBoost中的eta,論文中的Shrinkage),主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數設置得大一點;
7)XGBoost工具支持并行,但并行不是tree粒度的并行,XGBoost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數里包含了前面t-1次迭代的預測值),XGBoost的并行是在特征粒度上的。XGBoost在訓練之前,預先對數據進行了排序,然后保存為(block)結構,后面的迭代中重復地使用這個結構,大大減小計算量。這個塊結構也使得并行成為了可能,在進行節(jié)點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行;
8)可并行的近似直方圖算法,樹結點在進行分裂時,需要計算每個節(jié)點的增益,若數據量較大,對所有節(jié)點的特征進行排序,遍歷的得到最優(yōu)分割點,這種貪心法異常耗時,這時引進近似直方圖算法,用于生成高效的分割點,首先根據特征分布的百分位數提出候選分割點,基于候選分割點,將連續(xù)特征映射到各個桶里,最后根據聚合后的分割點效果找出最優(yōu)的分割點,為了限制樹的增長,引入閾值,當增益大于閾值時,進行分裂;
9)XGBoost的原生語言為C/C++,這是也是它訓練速度快的一個原因。
與LightGBM相比: 1)XGBoost采用預排序,在迭代之前,對結點的特征做預排序(其中預排續(xù)的結果會存儲到內存中,保存排序的數據及其對應的節(jié)點,因此當數據量增大時,其內存占用量大),遍歷選擇最優(yōu)分割點,數據量大時,貪心法耗時;LightGBM方法采用histogram算法,占用的內存低,數據分割的復雜度更低,但是不能找到最精確的數據分割點;
2)XGBoost采用level-wise生成決策樹策略,同時分裂同一層的葉子,從而進行多線程優(yōu)化,不容易過擬合,但很多葉子節(jié)點的分裂增益較低,沒必要進行更進一步的分裂,這就帶來了不必要的開銷;LightGBM采用leaf-wise生長策略,每次從當前葉子中選擇增益最大的葉子進行分裂,如此循環(huán),但會生長出更深的決策樹,產生過擬合,因此 LightGBM 在leaf-wise之上增加了一個最大深度的限制,在保證高效率的同時防止過擬合)。另一個比較巧妙的優(yōu)化是 histogram 做差加速。一個容易觀察到的現象:一個葉子的直方圖可以由它的父親節(jié)點的直方圖與它兄弟的直方圖做差得到。
參考文獻:
(88條消息) XGBoost的基本原理_Y學習使我快樂V的博客-CSDN博客_xgboost的原理
(88條消息) 集成學習之Xgboost_Aliert的博客-CSDN博客
(88條消息) GBDT算法的升級--XGBoost與LightGBM算法_CquptDJ的博客-CSDN博客_efb算法
原文鏈接:https://blog.csdn.net/Kd_Mpl/article/details/127249495
相關推薦
- 2022-10-08 C語言深入分析浮點型數據存儲_C 語言
- 2022-10-31 Android開發(fā)Compose框架使用開篇_Android
- 2022-01-17 報錯:是否需要更改目標庫?請嘗試將lib編譯器選項更改為es2015或更高版本
- 2022-06-02 Kubernetes關鍵組件與結構組成介紹_云和虛擬化
- 2022-11-12 CSS單標簽實現復雜的棋盤布局_經驗交流
- 2022-04-03 對已有的docker容器增加新的端口映射問題(兩種方式)_docker
- 2022-07-28 Python自動化實戰(zhàn)之接口請求的實現_python
- 2023-02-09 Python如何提取html中文本到txt_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支