XGBoost面试题集合

原文链接
珍藏版 | 20道XGBoost面试题,你会几个?(上篇)

珍藏版 | 20道XGBoost面试题,你会几个?(下篇)

1. 简单介绍一下Xgboost

XGBoost是对GBDT的一种改进,他们都是集成学习中的bagging算法,GBDT在训练时,采用前向分布算法进行贪婪学习,每次迭代都学习一棵CART回归树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差

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

2. XGBoost与GBDT不同之处
不同之处GBDTXGBoost
基 分 类 器 \color{#0000FF}{基分类器} CART回归树CART分类/决策树,带正则项的线性/Logistic回归
导 数 信 息 \color{#0000FF}{导数信息} 一阶导数一阶、二阶导数
正 则 项 \color{#0000FF}{正则项} 有(预剪枝、防止过拟合)
列 采 样 \color{#0000FF}{ 列采样} 不支持支持
缺 失 值 处 理 \color{#0000FF}{缺失值处理} 手动自动
并 行 化 ( 特 征 维 度 ) \color{#0000FF}{并行化(特征维度)} 不能

注:

  1. XGBoost先将每个特征按特征值排好序,存储为块结构,分裂结点时可以采用多线程并行查找每个特征的最佳分割点,极大提升训练速度。

  2. XGBoost支持列采样,与随机森林类似,用于防止过拟合。

3. XGBoost为什么使用泰勒二阶展开
  1. 精准性:采用二阶泰勒展开,可以更为精准的逼近真实的损失函数

  2. 可扩展性:损失函数支持自定义,只需要新的损失函数二阶可导。

4. XGBoost为什么可以并行训练

并行是指特征维度,即在训练之前,每个特征按特征值对样本进行预排序,并存储为Block结构,在后面查找特征分割点时可以重复使用,而且特征已经被存储为一个个block结构,那么在寻找每个特征的最佳分割点时,可以利用多线程对每个block并行计算。

5. XGBoost为什么快
  1. 分块并行:训练前每个特征按特征值进行排序并存储为Block结构,后面查找特征分割点时重复使用,并且支持并行查找每个特征的分割点

  2. 候选分位点:每个特征采用常数个分位点作为候选分割点

  3. CPU cache 命中优化: 使用缓存预取的方法,对每个线程分配一个连续的buffer,读取每个block中样本的梯度信息并存入连续的Buffer中。

  4. Block 处理优化:Block预先放入内存;Block按列进行解压缩;将Block划分到不同硬盘来提高吞吐

6. XGBoost防止过拟合的方法
  1. 目标函数加正则项

O b j = ∑ i = 1 n l ( y i , y i ^ ) + ∑ i = 1 n Ω ( f i ) Obj=\sum_{i=1}^n l(y_i,\hat{y_i})+\sum_{i=1}^n \Omega(f_i) Obj=i=1nl(yi,yi^)+i=1nΩ(fi)

  1. 列抽样:训练的时候只用一部分特征(不考虑剩余的block块即可)

  2. 子采样:每轮计算可以不使用全部样本,使算法更加保守

  3. shrinkage(学习率或步长):为了给后面的训练留出更多的学习空间

7. XGBoost如何处理缺失值
  • 在特征k上寻找最佳 split point 时,不会对该列特征 missing 的样本进行遍历,而只对该列特征值为 non-missing 的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找 split point 的时间开销。
  • 在逻辑实现上,为了保证完备性,会将该特征值missing的样本分别分配到左叶子结点和右叶子结点,两种情形都计算一遍后,选择分裂后增益最大的那个方向(左分支或是右分支),作为预测时特征值缺失样本的默认分支方向。
  • 如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子结点
8. XGBoost中叶子结点的权重如何计算出来

XGBoost最终的目标函数为
O b j ( t ) = ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T Obj^{(t)}=\sum_{j=1}^T[G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2]+\gamma T Obj(t)=j=1T[Gjwj+21(Hj+λ)wj2]+γT
利用一元二次函数求最值的知识,当目标函数达到最小值 O b j ∗ Obj^* Obj时,每个叶子结点的权重为 w j ∗ w_j^* wj
具体公式如下:在这里插入图片描述

9. XGBoost中的一棵树的停止生长条件
  • 当新引入的一次分裂所带来的增益Gain<0时,放弃当前的分裂。

  • 当树达到最大深度时,停止建树(max_depth)

  • 当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值,也会放弃此次分裂。(超参数:最小样本权重和)

10. RF和GBDT的区别

相同点

  • 都是由多棵树组成,都是由多棵树共同决定最终的结果

不同点

不同之处RFGBDT
集 成 学 习 \color{#0000FF}{集成学习} bagging思想boosting思想
偏 差 − 方 差 权 衡 \color{#0000FF}{偏差-方差权衡} 不断的降低模型的方差不断的降低模型的偏差
并 行 性 \color{#0000FF}{并行性} RF的可以并列生成只能顺序生成(需要等上一棵树完全生成)
训 练 样 本 \color{#0000FF}{ 训练样本} 每次迭代的样本是从全部训练集中有放回抽样形成的每次使用全部样本
最 终 结 果 \color{#0000FF}{ 最终结果} 多棵树进行多数表决(回归问题是取平均)加权融合
数 据 敏 感 性 \color{#0000FF}{ 数据敏感性} 对异常值不敏感对异常值敏感
泛 化 能 力 \color{#0000FF}{泛化能力} 不易过拟合易过拟合
11. XGBoost如何处理不平衡数据
  1. 如果你在意AUC,采用AUC来评估模型的性能,通过设置 s c a l e _ p o s _ w e i g h t \color{#259b24}{scale\_pos\_weight} scale_pos_weight平衡正样本和负样本的权重

    例如,当正负样本比例为1:10时,scale_pos_weight可以取10;

  2. 如果你在意概率(预测得分的合理性),你不能重新平衡数据集(会破坏数据的真实分布),应该设置 m a x _ d e l t a _ s t e p \color{#259b24}{max\_ delta \_step} max_delta_step为一个有限数字来帮助收敛(基模型为LR时有效)。

不 平 衡 数 据 的 处 理 ? \color{#e84140}{不平衡数据的处理?}

12. 比较LR和GBDT,说说什么情景下GBDT不如LR
比较LRGBDT
模 型 类 别 \color{#0000FF}{模型类别} 线性模型非线性模型
优 点 \color{#0000FF}{优点} 可解释性强,很容易并行化具有天然的特征组合优势,特征表达能力强
缺 点 \color{#0000FF}{缺点} 学习能力有限,需要大量的人工特征工程树与树之间无法并行训练,容易过拟合

当 在 高 维 稀 疏 特 征 的 场 景 下 , L R 的 效 果 一 般 会 比 G B D T 好 ? \color{#e84140}{当在高维稀疏特征的场景下,LR的效果一般会比GBDT好?} LRGBDT?

理 由 : 理由: 带 正 则 化 的 线 性 模 型 比 较 不 容 易 对 稀 疏 特 征 过 拟 合 \color{#e84140}{带正则化的线性模型比较不容易对稀疏特征过拟合} 线
例子

假设一个二分类问题,label为0和1,特征有100维,如果有1w个样本,但其中只要10个正样本1,而这些样本的特征 f 1 f_1 f1的值为全为1,而其余9990条样本的f1特征都为0(在高维稀疏的情况下这种情况很常见)。

我们都知道在这种情况下,树模型很容易优化出一个使用 f 1 f_1 f1特征作为重要分裂节点的树,因为这个结点直接能够将训练数据划分的很好,但是当测试的时候,却会发现效果很差,因为这个特征 f 1 f_1 f1只是刚好偶然间跟 y y y拟合到了这个规律,这也是我们常说的过拟合。

那么这种情况下,如果采用LR的话,应该也会出现类似过拟合的情况呀: y = w 1 ∗ f 1 + W i ∗ f i + … . y = w_1*f_1 + W_i*f_i+…. y=w1f1+Wifi+.,其中 w 1 w_1 w1特别大以拟合这10个样本。为什么此时树模型就过拟合的更严重呢?

仔细想想发现,因为现在的模型普遍都会带着正则项,而 LR 等线性模型的正则项是对权重的惩罚,也就是 w 1 w_1 w1一旦过大,惩罚就会很大,进一步压缩 w 1 w_1 w1的值,使他不至于过大。但是,树模型则不一样,树模型的惩罚项通常为叶子节点数和深度等,而我们都知道,对于上面这种 case,树只需要一个节点就可以完美分割9990和10个样本,一个结点,最终产生的惩罚项极其之小。

13. XGBoost中如何对树进行剪枝
  • 目标函数中增加了正则项:使用叶子结点的数目和叶子结点权重的L2模的平方,控制树的复杂度。

  • 结点分裂时,定义了一个阈值,如果分裂后目标函数的增益小于该阈值,则不分裂。

  • 当引入一次分裂后,重新计算新生成的左、右两个叶子结点的样本权重和。如果任一个叶子结点的样本权重低于某一个阈值(最小样本权重和),也会放弃此次分裂。

  • XGBoost 先从顶到底建立树直到最大深度再从底到顶反向检查是否有不满足分裂条件的结点,进行剪枝。

14. XGBoost如何选择最佳分裂点?

XGBoost在训练前预先将特征按照特征值进行了排序,并存储为block结构,以后在结点分裂时可以重复使用该结构。

因此,可以采用特征并行的方法利用多个线程分别计算每个特征的最佳分割点,根据每次分裂后产生的增益,最终选择增益最大的那个特征的特征值作为最佳分裂点。

如果在计算每个特征的最佳分割点时,对每个样本都进行遍历,计算复杂度会很大,这种全局扫描的方法并不适用大数据的场景。XGBoost还提供了一种直方图近似算法,对特征排序后仅选择常数个候选分裂位置作为候选分裂点,极大提升了结点分裂时的计算效率。

15. XGBoost的Scalable性如何体现?
  • 基分类器的scalability:弱分类器可以支持CART决策树,也可以支持LR和Linear。
  • 目标函数的scalability:支持自定义loss function,只需要其一阶、二阶可导。有这个特性是因为泰勒二阶展开,得到通用的目标函数形式。
  • 学习方法的scalability:Block结构支持并行化,支持 Out-of-core计算。
16. XGBoost如何评价特征的重要性
  • w e i g h t \color{#259b24}{weight} weight :该特征在所有树中被用作分割样本的特征的总次数。

  • g a i n \color{#259b24}{gain} gain :该特征在其出现过的所有树中产生的平均增益。

  • c o v e r \color{#259b24}{cover} cover :该特征在其出现过的所有树中的平均覆盖范围。

注意:覆盖范围这里指的是一个特征用作分割点后,其影响的样本数量,即有多少样本经过该特征分割到两个子节点。

17. XGBooost参数调优的一般步骤

首先需要初始化一些基本变量,例如:

  • max_depth = 5
  • min_child_weight = 1
  • gamma = 0
  • subsample, colsample_bytree = 0.8
  • scale_pos_weight = 1

( 1 ) 确 定 l e a r n i n g   r a t e 和 e s t i m a t o r 的 数 量 \color{#e65100}{(1) 确定learning\ rate和estimator的数量} (1)learning rateestimator

learning rate可以先用0.1,用cv来寻找最优的estimators

( 2 ) m a x _ d e p t h 和 m i n _ c h i l d _ w e i g h t \color{#e65100}{(2) max\_depth和 min\_child\_weight} (2)max_depthmin_child_weight

我们调整这两个参数是因为,这两个参数对输出结果的影响很大。我们首先将这两个参数设置为较大的数,然后通过迭代的方式不断修正,缩小范围。

m a x _ d e p t h \color{#259b24}{max\_depth} max_depth,每棵子树的最大深度,check from range(3,10,2)。

m i n _ c h i l d _ w e i g h t \color{#259b24}{min\_child\_weight} min_child_weight,子节点的权重阈值,check from range(1,6,2)。

如果一个结点分裂后,它的所有子节点的权重之和都大于该阈值,该叶子节点才可以划分。

( 3 ) g a m m a \color{#e65100}{(3) gamma} (3)gamma

也称作最小划分损失 m i n _ s p l i t _ l o s s \color{#259b24}{min\_split\_loss} min_split_loss,check from 0.1 to 0.5,指的是,对于一个叶子节点,当对它采取划分之后,损失函数的降低值的阈值。

  • 如果大于该阈值,则该叶子节点值得继续划分

  • 如果小于该阈值,则该叶子节点不值得继续划分

( 4 ) s u b s a m p l e , c o l s a m p l e _ b y t r e e \color{#e65100}{(4) subsample, colsample\_bytree} (4)subsample,colsample_bytree

  • subsample是对训练的采样比例

  • colsample_bytree是对特征的采样比例

    both check from 0.6 to 0.9

( 5 ) 正 则 化 参 数 \color{#e65100}{(5) 正则化参数} (5)

  • alpha 是L1正则化系数,try 1e-5, 1e-2, 0.1, 1, 100

  • lambda 是L2正则化系数

( 6 ) 降 低 学 习 率 \color{#e65100}{(6) 降低学习率} (6)
降低学习率的同时增加树的数量,通常最后设置学习率为0.01~0.1

18. XGBoost模型如果过拟合了怎么解决

当出现过拟合时,有两类参数可以缓解:

  • 第一类参数:用于直接控制模型的复杂度。包括 m a x _ d e p t h , m i n _ c h i l d _ w e i g h t , g a m m a \color{#259b24}{max\_depth,min\_child\_weight,gamma } max_depth,min_child_weight,gamma等参数
  • 第二类参数:用于增加随机性,从而使得模型在训练时对于噪音不敏感。包括 s u b s a m p l e , c o l s a m p l e _ b y t r e e \color{#259b24}{subsample,colsample\_bytree} subsample,colsample_bytree

还有就是直接减小learning rate,但需要同时增加estimator 参数

19.为什么XGBoost相比某些模型对缺失值不敏感

对存在缺失值的特征,一般的解决方法是:

  • 离散型变量:用出现次数最多的特征值填充;
  • 连续型变量:用中位数或均值填充;

一些模型如SVM和KNN,其模型原理中涉及到了对样本距离的度量,如果缺失值处理不当,最终会导致模型预测效果很差。

而树模型对缺失值的敏感度低,大部分时候可以在数据缺失时时使用。原因就是,一棵树中每个结点在分裂时,寻找的是某个特征的最佳分裂点(特征值),完全可以不考虑存在特征值缺失的样本,也就是说,如果某些样本缺失的特征值缺失,对寻找最佳分割点的影响不是很大。

XGBoost对缺失数据有特定的处理方法,详情第7题。
因此,对于有缺失值的数据在经过缺失处理后:

  • 当数据量很小时,优先用朴素贝叶斯
  • 数据量适中或者较大,用树模型,优先XGBoost
  • 数据量较大,也可以用神经网络
  • 避免使用距离度量相关的模型,如KNN和SVM
20. XGBoost和LightGBM的区别
区别之处XGBoostLightGBM
树 生 长 策 略 \color{#0000FF}{树生长策略} level-wise 的分裂策略leaf-wise的分裂策略
分 割 点 查 找 算 法 \color{#0000FF}{分割点查找算法} 特征预排序算法基于直方图的切分点算法
支 持 离 散 变 量 \color{#0000FF}{支持离散变量} 事先对类别型变量进行编码(如独热编码)事先对类别型变量进行编码
缓 存 命 中 率 \color{#0000FF}{缓存命中率} 取梯度的时候,是通过索引来获取的,而这些梯度的获取顺序是按照特征的大小顺序的,这将导致非连续的内存访问,可能使得CPU cache缓存命中率低基于直方图分裂特征的,梯度信息都存储在一个个bin中,所以访问梯度是连续的,缓存命中率高

注意:

2.分割点查找算法:XGB使用特征预排序算法,LGB使用基于直方图的切分点算法,其优势如下:

  • 减少内存占用,比如离散为256个bin时,只需要用8位整形就可以保存一个样本被映射为哪个bin(这个bin可以说就是转换后的特征),对比预排序的exact greedy算法来说(用int_32来存储索引+ 用float_32保存特征值),可以节省7/8的空间。
  • 计算效率提高,预排序的Exact greedy对每个特征都需要遍历一遍数据,并计算增益,复杂度为𝑂(#𝑓𝑒𝑎𝑡𝑢𝑟𝑒×#𝑑𝑎𝑡𝑎)。而直方图算法在建立完直方图后,只需要对每个特征遍历直方图即可,复杂度为𝑂(#𝑓𝑒𝑎𝑡𝑢𝑟𝑒×#𝑏𝑖𝑛𝑠)。
  • LGB还可以使用直方图做差加速,一个节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算

5.LightGBM 与 XGboost 的并行策略不同:

  • 特征并行 :LGB特征并行的前提是每个worker留有一份完整的数据集,但是每个worker仅在特征子集上进行最佳切分点的寻找;worker之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可。XGB的特征并行与LGB的最大不同在于XGB每个worker节点中仅有部分的列数据,也就是垂直切分,每个worker寻找局部最佳切分点,worker之间相互通信,然后在具有最佳切分点的worker上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他worker才能开始分裂。二者的区别就导致了LGB中worker间通信成本明显降低,只需通信一个特征分裂点即可,而XGB中要广播样本索引。

  • 数据并行 :当数据量很大,特征相对较少时,可采用数据并行策略。LGB中先对数据水平切分,每个worker上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个直方图算法使得worker间的通信成本降低一倍,因为只用通信以此样本量少的节点。XGB中的数据并行也是水平切分,然后单个worker建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个worker上的节点分裂时会单独计算子节点的样本索引,因此效率贼慢,每个worker间的通信量也就变得很大。

  • 投票并行(LGB):当数据量和维度都很大时,选用投票并行,该方法是数据并行的一个改进。数据并行中的合并直方图的代价相对较大,尤其是当特征维度很大时。大致思想是:每个worker首先会找到本地的一些优秀的特征,然后进行全局投票,根据投票结果,选择top的特征进行直方图的合并,再寻求全局的最优分割点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值