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