GBDT和XGBoost面试总结

xgboost和随机森林的区别:

XGB和随机森林

1)随机森林采用的bagging思想,而xgboost采用的boosting思想。Bagging的训练集的选择是随机的,各训练集之间相互独立,弱分类器可并行,而Boosting的训练集的选择与前一轮的学习结果有关,是串行的。
2)组成随机森林的树可以并行生成;而xgboost只能是串行生成树。
3)对于最终的输出结果而言,随机森林采用多数投票等;而xgboost则是将所有结果累加起来,或者加权累加起来。
4)随机森林是通过减少模型方差提高性能;xgboost是通过减少模型偏差提高性能。

GBDT

1、GBDT训练过程如何选择特征?

  • GBDT使用基学习器是CART树,CART树是二叉树,每次使用yes or no进行特征选择,数值连续特征使用的最小均方误差,离散值使用的gini指数(找gini指数少的特征以及特征值进行分裂)在每次划分特征的时候会遍历所有可能的划分点找到最佳的特征分裂点,这是用为什么gbdt会比rf慢的主要原因之一。

2、GBDT如何防止过拟合?由于gbdt是前向加法模型,前面的树往往起到决定性的作用,如何改进这个问题?

  • 一般使用缩减因子对每棵树进行降权,可以使用带有dropout的GBDT算法,dart树,随机丢弃生成的决策树,然后再从剩下的决策树集中迭代优化提升树。
  • GBDT与Boosting区别较大,它的每一次计算都是为了减少上一次的残差,而为了消除残差,可以在残差减小的梯度方向上建立模型;
  • 在GradientBoost中,每个新的模型的建立在残损函数的负梯度(也就是残差)上。

3、GBDT对标量特征要不要one-hot编码?

从效果的角度来讲,使用category特征和one-hot是等价的,所不同的是category特征的feature空间更小。微软在lightGBM的文档里也说了,category特征可以直接输入,不需要one-hot编码,准确度差不多,速度快8倍。而sklearn的tree方法在接口上不支持category输入,所以只能用one-hot编码。

4、为什么GBDT用负梯度当做残差?(如果下一颗树拟合的是残差,那么损失函数一般要均方损失)

  • (1)负梯度方向可证,往这个方向优化模型一定会收敛。在这里插入图片描述在这里插入图片描述

  • (2)如果想用残差为负梯度,这里损失函数一般要用均方损失,但是并不是所有的问题都可以用均方损失,如分类问题就不可以。

XGBoost

1、xgboost核心思想

  • XGBoost 是集成学习的一种算法,在大多数的回归和分类问题上表现出色,它串行生成一系列回归树,每颗回归树都是拟合上一棵树与目标值的残差,这样重复进行, 直到达到事先设定树的个数或者收敛。

2、每颗树都是拟合上一次的残差,这个残差是什么?怎么算的?

  • 我们可以这么理解,对于GBDT来说,损失函数一般是均方损失,这个残差其实是模型优化的方向也就是负梯度。这也就是残差和模型的目标函数之间的关系,往这个方向优化模型一定会收敛。可以理解为GBDT在函数空间中利用梯度下降法进行优化。

  • 但是对于XGB来说,相对于GBDT的一阶泰勒展开,XGBoost采用二阶泰勒展开,可以更为精准的逼近真实的损失函数,可以理解为XGBoost在函数空间中用牛顿法进行优化。最终的目标函数只依赖于每个数据点在误差函数上的一阶导数和二阶导数。

2.1 xgboost的目标函数和残差之间的关系是什么

  • 简单来说,目标函数中的损失函数的一阶倒数为残差。
  • xgboost的目标是为了让 前面拟合的模型+下一颗树之后的预测值—>真实值。因此目标函数即为损失函数(降低偏差)+正则项(降低方差,避免过拟合),并且希望值最小。我们所要求的其实就是每一步损失函数的一阶导和二阶导的值,就可以然后最优化目标函数,从而最后根据加法模型得到一个整体模型。

3、每个树的叶子节点的权重是怎么得到的?

  • 叶子节点的权重为目标函数最小的时候,对应的权重值。
  • xgboost的目标函数比较好理解的是下图:
    在这里插入图片描述
    其中:
    在这里插入图片描述
  • XGBoost目标函数最终推导形式如下:
    在这里插入图片描述
  • 利用一元二次函数求最值的知识,当目标函数达到最小值Obj时,每个叶子结点的权重为wj。
    具体公式如下:
    在这里插入图片描述
    xgboost是根据一阶导数gi 和二阶导数 hi

4、xgboost是如何分裂的?如何选择最佳分裂点?(选择哪个进行特征的分裂?以及选取好的特征如果划分左子树右子树?)

  • XGBoost分裂原则是有一套自己的增益gain的。(见上述图的最后一行)
    Gj :叶子结点 j 所包含样本的一阶偏导数累加之和,是一个常量;
    Hj :叶子结点 j 所包含样本的二阶偏导数累加之和,是一个常量;在这里插入图片描述

  • 流程总结如下:
    (1)预先将特征按照特征值进行排序;
    (2)采用特征并行的方法分别计算每个特征的最佳分割点;
    (3)在所有特征中找到最好的分裂点(根据每次分裂后产生的增益,最终选择增益最大的那个特征以及特征值作为最佳分裂点)

  • 如果在计算每个特征的最佳分割点时,对每个样本都进行遍历,计算复杂度会很大,这种全局扫描的方法并不适用大数据的场景。xgboost还有一些数据预排序特征重要性排序近似排序等方式提高训练速度。

5、如何停止树的循环生成

  • 简言之,设置树的最大深度、当样本权重和小于设定阈值时停止生长以防止过拟合。

6、GBDT和XGB的区别总结

  • (1)基分类器的选择: 传统GBDT以CART作为基分类器,XGBoost还支持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的逻辑回归(分类问题)或者线性回归(回归问题)。
    (2)梯度信息: 传统GBDT只引入了一阶导数信息,Xgboost引入了一阶导数和二阶导数信息,其对目标函数引入了二阶近似,求得解析解, 用解析解作为Gain来建立决策树, 使得目标函数最优(Gain求到的是解析解)。另外,XGBoost工具支持自定义损失函数,只要函数可一阶和二阶求导
    (3)正则项: Xgboost引入了正则项部分,这是传统GBDT中没有的。加入正则项可以控制模型的复杂度,防止过拟合。
    (4)特征采样: Xgboost引入了特征子采样,既可以降低过拟合,也可以减少计算。(按照我的理解,Xgboost和GBDT一样采样是是不放回的,而随机森林的采样是有放回的采样。)
    (5)节点分裂方式:GBDT是用的基尼系数,XGBoost是经过优化推导后它自己一种计算增益的方式(网易问过)。xgboost分裂:假设某点要分裂,如何进行分裂?首先对n个特征f1…fn做排序,取所有特征中选取该特征达到最大增益的特征,用整个特征来分裂。假设整个特征为f1,则选取这个特征f1,将所有数据按照f1排序,然后取一个阈值,阈值左边为分裂的左子树,阈值右边为分裂的右子树,使得整个分类的增益最大。
    (6)并行化(如何进行分裂): 这里指的是xgboost在特征维度上的并行。传统GBDT由于树之间的强依赖关系是无法实现并行处理的,但是Xgboost支持并行处理,XGBoost的并行不是在模型上的并行,而是在特征上的并行,将特征列排序后以block的形式存储在内存中,在后面的迭代中重复使用这个结构。这个block也使得并行化成为了可能,其次在进行节点分裂时,计算每个特征的增益,最终选择增益最大的那个特征去做分割,那么各个特征的增益计算就可以开多线程进行。
    (7)除此之外,Xgboost实现了分裂点寻找近似算法、缺失值处理、列抽样(降低过拟合,还能减少计算)等包括一些工程上的优化,LightGBM是Xgboost的更高效实现。

7、xgboost 如何评价特征重要性

  • 我们采用三种方法来评判XGBoost模型中特征的重要程度:
  • weight :特征选择次数
  • gain :该特征在其出现过的所有树中产生的平均增益。
  • cover :该特征覆盖数据量

8、xgboost参数调优过程/训练过程:

  • 实验过程调参过程
  • Step 1: 选择一组初始参数
  • Step 2: 改变 max_depthmin_child_weight. 改变树模型的复杂程度,分别为树的深度和节点权重和
  • Step 3: 调节 gamma 降低模型过拟合风险. gamma值相当于如果叶子节点进行一次分裂,至少达到什么标准,才能去分裂
  • Step 4: 调节 subsamplecolsample_bytree 改变数据采样策略.
  • Step 5: 调节学习率 eta.相当于把新的树的百分之多少加到前面树模型中

9、你是手动调参? 自动调参用过没有?

  • 网格搜索属于暴力搜索。不是贪心算法。

10、xgb如何处理缺失值的?

  • 在逻辑实现上,为了保证完备性,会将该特征值缺失的样本分别分配到左叶子结点和右叶子结点,两种情形都计算一遍后,选择分裂后增益最大的那个方向(左分支或是右分支),作为预测时特征值缺失样本的默认分支方向。
  • 如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子结点。

11、xgboost防止过拟合的方法

  • 目标函数加入正则项,叶子结点个数+叶子结点权值的l2正则化
  • 列抽样,训练时只用一部分特征,(不考虑剩余的block块即可)
  • 子采样,下采样 每轮计算可以不采用所有的样本,使得算法更保守
  • shrinkage ,可以叫做学习率或者步长,加入shrinkage的目的主要是为了避免过拟合xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。为了给后面的训练留出更多的学习空间。shrinkage设置小一点也就很好理解了。设置小一点,也就是当前树的叶节点权重变小,削弱该颗数对最终模型的影响,然后通过多次迭代,多建树来得到最终的模型。设置过大会导致过拟合。过拟合表示模型变得复杂了。实际应用中,一般把学习率设置得小一点,然后迭代次数设置得大一点。

补充:业务题:one-hot编码的话,用什么二分类模型比较合适?你知道在什么情况下应该使用Onehot呢?”

“对于无序特征来说需要做onehot,实践中发现在线性模型中将连续值特征离散化成0/1型特征效果会更好(线性模型拟合连续特征能力弱,需要将连续特征离散化 成one hot形式提升模型的拟合能力)。所以对于稠密的类别型特征,可以对离散特征做一个OneHot变化,对于稀疏的离散特征采用onehot会导致维度爆炸以及变换后更加稀疏的特征,最好还是采用bin count或者embedding的方法去处理”

one-hot用在GBDT、XGBoost这些模型里面都挺好的,但是用在逻辑回归里不行。
因为逻辑回归要求变量间相互独立,如果你只有一个属性需要做one-hot编码还好,如果你有多个属性需要做one-ont编码,那么当某个样本的多个one-hot属性同时为1时,这两个属性就完全相关了。

在这里插入图片描述

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值