【机器学习】:Xgboost和GBDT的不同与比较

【与传统GBDT相比,XGBoost有何不同】

基函数不同。GBDT只用CART树,XGBoost除了CART,也支持线性函数。

目标不同。具体体现在结点分裂策略与正则化。GBDT和XGBoost都是根据目标增益分裂结点,GBDT根据均方误差(回归)或基尼指数(分类),XGBoost则进一步引入正则项。

正则化不同。XGBoost定义正则化,包含了对叶子结点数的约束,以及叶子输出权值的L2范数,有利于防止过拟合。

利用导数阶数不同。GBDT只利用一阶导数,XGBoost利用一阶和二阶导数。这要求loss函数二阶可导,同时XGBoost支持自定义loss。用二阶导数的原因是可以加快收敛。

最佳特征选取策略不同。GBDT遍历所有特征,XGBoost引入类似于RandomForest的列(特征)子采样,有利于防止过拟合与加速运算。

候选分裂点选取策略不同。GBDT遍历特征的所有取值,XGBoost有两种做法,其一是遍历,其二是根据二阶导数选择样本分位点作为候补,类似于直方图算法。

Boosted模型构成不同。GBDT与XGBoost都是多棵回归树的加法模型,但XGBoost为每棵树设定了系数,表示不完全信任,有利于防止过拟合。

XGBoost引入了列采样,传统GBDT没有。

【XGBoost为什么那么快?】

预排序实现特征粒度的并行。

近似法避免遍历所有分裂点,只尝试分位点。

后来实现了类似于LightGBM的直方图算法,进一步加速。

【 XGBoost是怎么防止过拟合的?】

控制模型复杂度:正则化(L1和L2正则化),max_depth限制树的深度、min_child_weight和gamma参数限制进一步分裂。

给模型增加随机性:行列采样、学习率shrinkage。

【XGBoost怎么处理类别不均?】

若只关注预测的排序表现,可以用AUC作metric,然后用scale_pos_weight调整正负样本权重(负样本/正样本)

若关注预测概率的准确性,最好改变权重,可以改变max_delta_step(调成正数)来加速收敛。

【XGBoost如何进行切分点选择?】
贪心算法,具体地分为精确法和近似法,前者遍历特征的每一个取值,后者只按照二阶导数选取分位点进行切分。XGBoost后来也有直方图算法,应该比近似法要快一点。

【XGBoost构建树的时候是level-wise还是leaf-wise?】
贪心算法默认是level-wise,逐层分裂。若选用直方图算法,可以通过grow_policy选择depthwise或lossguide,前者优先分裂距离根最近叶子,实际上近似于level-wise,后者优先分裂loss减少量最多的结点,有点深度优先的味道,和lightgbm比较相似。

【 XGBoost有没有直方图算法?】
有,它的直方图算法也是将连续特征离散化。

【XGBoost怎么实现多分类?】
对于K分类,每一轮迭代训练K棵树,用softmax代入各树的输出以表示样本属于各类的概率。

【XGBoost怎么处理ID类特征?】
XGBoost并不直接支持ID类,如果输入ID类是数值型,会直接被当成具有大小关系的数值特征处理。

posted @ 2021-12-07 18:02  Geeksongs  阅读(130)  评论(0编辑  收藏  举报

Coded by Geeksongs on Linux

All rights reserved, no one is allowed to pirate or use the document for other purposes.