XGboost 面试常见、易忽略的问题

介绍下XGboost

  • 本质上是GDBT框架下的一类变体,基于boosting增强策略的加法模型,训练的时候采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残

  • GBDT进行了一系列优化,比如损失函数进行了二阶泰勒展开、目标函数加入正则项、支持并行和默认缺失值处理等,在可扩展性和训练速度上有了巨大的提升,但其核心思想没有大的变化。

XGboost的损失函数是怎么样的:

08d3175b65d919518136ede6c3a4a223.jpeg

经过泰勒二次展开后得到

c2f8c96994d71e533495ff4683d21301.jpeg
目标函数只依赖于每个数据点在误差函数上的一阶导数g,和二阶导数h

其中后面那项是(T表示的是叶子数量,树的复杂度):

296e25bfd711246cfb9bb09447854c1c.jpeg
T表示叶子节点的个数,w表示叶子节点的分数。直观上看,目标要求预测误差尽量小,且叶子节点T尽量少(γ控制叶子结点的个数),节点数值w尽量不极端(λ控制叶子节点的分数不会过大),防止过拟合。

说下XGboost是怎么分裂结点:

对上面目标函数通过损失函数的求导,使导数为0,取得目标函数极值点后求得的目标函数。可得到

c34f3e2b26c416a3dde164f7a27ffd59.jpeg 0fe2202d8e4d22f03356cec8706205e3.jpeg
I表示节点j下面的样本集合,g是一阶导数,h是二阶导数

Obj代表了当我们指定一个树的结构的时候,我们在目标上面最多减少多少。我们可以把它叫做结构分数(structure score),然后gain分数计算如下所示:

549730d34a05c33b06f8853af1df4377.jpeg

对于某个特征,先按照该特征里的值进行排序,然后再通过计算得到最大增益的特征和特征分裂点,然后进行一层一层分裂。

XGboost是怎么进行并行化计算的:

  • 决策树的学习最耗时的一个步骤就是对特征值进行排序,存储为Block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。在进行节点分裂时需要计算每个特征的增益,最终选增益大的特征做分裂,各个特征的增益计算就可开启多线程进行。

  • 在块里面保存排序后的特征值及对应样本的引用,以便于获取样本的一阶、二阶导数值,但意味着除了保存原始特征之外还要保存原始特征的排序结果,耗内存。

  • 在分裂节点的时候Level-wise生成树的时候,每层的各个节点分裂可以并行处理

  • 可以采用并行化的近似直方图算法进行节点分裂。

xgboost为什么用二阶导:

  • 使得目标函数可以做到形式上的统一,目标函数只依赖于每个数据点在误差函数上的一阶导数g,和二阶导数h,可以很方便地自定义损失函数,只要这个损失函数可以求一阶和二阶导。

  • 二阶信息能够让梯度收敛的更快,类似牛顿法比SGD收敛更快。一阶信息描述梯度变化方向,二阶信息可以描述梯度变化方向是如何变化的。

  • 让分类能力更强

说说XGboost与GBDT的区别:

  • 对于目标函数,xgboost利用泰勒展开近似的用到函数2阶导数和1阶导数,GBDT只用到1阶导数;另外,xgboost目标函数用到表示树复杂程度的正则化项,防止过拟合。

  • xgboost可以在特征粒度上并行,保存预排序后的特征,然后保存为block(块)结构,后面的迭代中重复地使用这个结构。并行计算每个特征的带来的gain收益。

  • 新的叶子节点输出的计算公式而不是原始gbdt那样的简单平均;简单来说就是利用当前叶子上所有样本的一阶梯度和二阶梯度计算当前叶子的权重(weight/score)。具体公式如下:

bb8d7d468b64469eb07a44e848dcac07.png
其中w j 是当前树第j个叶子节点,g i  是落在第j个叶子节点的第i个样本的一阶梯度,h i  是落在第j个叶子节点的第i个样本的二阶梯度, λ  是正则化系数。当前叶子节点的权重就是按照上述方式计算出来的
  • 加速的其他两个方法:Shrinkage(缩减,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合)也就是在每一步生成boosting树时添加一个删减参数:η ,通SGD中的学习率类似,这个参数可以减少单颗树的作用,列抽样 (column subsampling),这点和随机森林类似,也就是对特征进行随机采样后建立树。

  • XGBoost的基分类器不仅支持CART决策树,还支持线性分类器,此时XGBoost相当于带L1和L2正则化项的Logistic回归(分类问题)或者线性回归(回归问题)

  • 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。

利用xgboost是怎么处理缺失值的:

  • 会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。

  • 如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树

利用xgboost是怎么处理离散特征的:

  • 对于类别有序的类别型变量,比如 age 等,当成数值型变量处理可以的。

  • 推荐 one-hot。但是 one-hot 会增加内存开销以及训练时间开销

  • 利用神经网络,把类别特征转成one-hot coding扔到NN里训练个embedding

  • Label encoding是使用字典的方式,将每个类别标签与不断增加的整数相关联,即生成一个名为class_的实例数组的索引。count 编码,target encoding

    https://zhuanlan.zhihu.com/p/136174936

XGBoost的参数调优有哪些经验:

  • 选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。

  • 给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数

  • 正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。

  • gamma [default=0, alias: min_split_loss] 分裂节点时,损失函数减小值只有大于等于gamma节点才分裂,gamma值越大,算法越保守,越不容易过拟合,但性能就不一定能保证,需要平衡。

  • lambda [default=1, alias: reg_lambda] L2正则化,这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。alpha [default=0, alias: reg_alpha]** L1正则化,增加该值会让模型更加收敛

参考文章 https://www.cnblogs.com/mfryf/p/6293814.html

讲讲xgboost的特征重要性是怎么计算的:特征的重要性在xgboost主要由三部分组成。

  • 分裂频率:表示特定特征在模型树中发生的相对次数的百分比 ,在上面的例子中,如果feature1发生在2个分裂中,1个分裂和3个分裂在每个树1,树2和树3中;那么特征1的权重将是2 + 1 + 3 = 6。特征1的频率被计算为其在所有特征的权重上的百分比权重. gain增益是解释每个特征的相对重要性的最相关属性。在xgb实现中,一般就是以gain增量来作为重要性考虑。

    xgb和LGB中默认使用分裂频率,并给出分裂次数
  • gain增益:意味着相应的特征对通过对模型中的每个树采取每个特征的贡献而计算出的模型的相对贡献。与其他特征相比,此度量值的较高值意味着它对于生成预测更为重要。(基分类器的决策树中的特征是可以被重复使用的,当一个特征不断的被选作为分裂节点时,那么我认为该特征相比于其他特征是更加重要的)

  • 样本覆盖度量:指的是与此功能相关的观测的相对数量。例如,如果您有100个观察值,4个特征和3棵树,并且假设特征1分别用于决定树1,树2和树3中10个,5个和2个观察值;那么该度量将计算此功能的覆盖范围为10 + 5 + 2 = 17个观测值。也就是表示在所有树中,一个特征作为分裂节点存在时,覆盖的样本数量的平均值。注意lgb和xgb一样。不过lgb中没有cover这一评价方式。

更多请参考: https://blog.csdn.net/bitcarman lee/article/details/124083054

xgboost怎么防止过拟合:

  • 对树的深度,min_child_weight,gamma进行控制,越深越容易过拟合

  • 使用early stopping机制,也就是提前终止训练。

  • 对特征进行列采样,也是一种防止过拟合的做法

  • xgboost也用到表示树复杂程度的正则化项,防止过拟合。

  • add randomness来使得对训练对噪声鲁棒。包括subsample colsample_bytree,或者也可以减小步长 eta,但是需要增加num_round,来平衡步长因子的减小。

XGBoost做回归训练集的label均为正值,预测会出现负值吗?原因是什么:

  • 如果在loss函数中没有加对负数输出的惩罚项(regularization),就有可能得到负数输出。

  • 首先要看得到负数的的输入值是否在training data中出现过,如果没出现过,并且这种数据点很少,可以认为这些是outlier。也可以把负数变为0。

  • training data里很多输出接近于0,testing里出现一些接近于0的负数也很正常。

  • 样本较少,特征较少的情况可能会出现,因为GBDT是加法模型,然后下一轮都是上一轮预测值和实际值的残差作为label继续拟合,最后将结果相加,这样最后可能会出现负值。

XGBoost不适用于什么样情景的数据

对于呈偏态分布的数据,预排序以及寻找切分点不太友好,因为数据分布的非常不均匀。

-END-


👆长按识别,即可关注


欢迎分享到朋友圈!好文章,我 在看
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值