GBDT+XGBoost知识补充及梳理
1 前言
一方面简历中写到了GBDT和XGBoost,另一方面也确实是面试机器学习高频考点,但每次都会被问到一些新问题,然后就会发现一些知识漏洞,下面小编将结合面试遇到的具体问题来梳理一下相关高频问题~
2 涉及GBDT和XGBoost的面试题
首先贴出两篇讲的特别特别好的文章:
- 了解xgboost么,请详细说说它的原理 这是七月在线创始人写的 通俗易懂 真的好
- XGBoost算法原理小结 刘建平老师的博客园写的机器学习也是相当不错的,墙裂推荐~
2.1 选一个你最擅长的机器学习算法说一说?
您好,我说一下XGBoost吧。
1、思想上
XGBoost属于ensemble方法中的boosting算法,其余典型的例子还有Adaboost,GBDT,LightGBM等等,而boosting算法的思想就是一个加法模型,不同的基模型之间存在强关联性,串行生成。
2、理论推导
3、XGBoost的优势
- 算法本身的优化。
- 基学习器的选择。XGBoost可以支持除了决策树之外的其余分类器,而GBDT等只能决策树
- 导数信息。对损失函数进行了二阶导的展开,相对GBDT的一阶导展开更加的精确!
- 算法运行效率的优化。
- 预排序并行计算找到合适的子树分裂特征和特征值。对每个弱学习器,比如决策树建立的过程做并行选择,找到合适的子树分裂特征和特征值。在并行选择之前,先对所有的特征的值进行排序分组,方便前面说的并行选择。对分组的特征,选择合适的分组大小,使用CPU缓存进行读取加速。将各个分组保存到多个硬盘以提高IO速度。
- 算法健壮性的优化。
- 正则化。目标函数中显示的正则化项,防止过拟合效果比较好。
- 缺失值的处理。对于缺失值的特征,通过枚举所有缺失值在当前节点是进入左子树还是右子树来决定缺失值的处理方式。
2.2 GBDT为什么用负梯度来代替误差?
自己面试被问到的问题。后来在网上一搜 还有专门的知乎网友提出了这个问题,详情见:
大概总结一下:
- 首先有一个逻辑就是我们都是优化损失函数的负梯度的!只不过恰好平方损失的时候为残差,所以看到了很多的说法是GBDT是每次都是拟合它的残差!
- 其次 我们的目的就是优化损失函数,即让损失函数越来越小即可!而梯度在接近为0的时候也就是损失函数达到最小的时候,所以我们不断的拟合损失函数的负梯度!让其越来越小即可!
- 就是这么理解就ok!
2.3 GBDT如何做分类?
首先这个问题的起源来源于面试官说:“你介绍下GBDT的原理吧!”
然后我就balabala:“如果一个人年龄是20岁,首先我们预测他的年龄为15岁,那么就有5岁的差值,于是再去拟合这个5岁,预测结果为4岁,于是再去拟合1岁,逐渐逼近为0,也就是说GBDT做回归就是在不断的拟合我们的残差,也是boosting的思想!”
嘿,正内心觉得答得不错的时候,面试官来句:“这是GBDT做回归的思路,那么做分类呢?”
嗨呀,顿时石化,脑子一懵,嗯?做分类?对啊,直觉上想,这咋处理啊!
其实还是得抓住问题的本质!这和上面的问题2联系的非常紧密,GBDT做回归的时候本质上是在拟合每一步的损失函数的负梯度,只不过回归的时候刚好是残差,而GBDT做分类对应的损失函数见下图,那么这样问题就解决了!
以下引自博客:机器学习 | 集成学习
GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
解决方式:
- 一个是用指数损失函数,此时GBDT退化为Adaboost算法。
- 用类似于逻辑回归的对数似然损失函数的方法(分为二元和多元分类)。
2.4 GBDT XGBoost做回归训练集的label均为正值,预测会出现负值吗?原因是什么?
这个问题也是面试被问到,当时确实没有想出来,面试官说是一道很有意思的问题,于是自己再总结一波:
首先答案是肯定的,即会出现训练集的label都是正值的情况下预测出现了负值!
那究竟是为什么呢?主要参考了下面的文章:
在这个答案里面,有小伙伴提到的原因是:
- 如果在loss函数中没有加对负数输出的惩罚项(regularization),就有可能得到负数输出。
- 首先要看得到负数的的输入值是否在training data中出现过,如果没出现过,并且这种数据点很少,可以认为这些是outlier。也可以把负数变为0。
- training data里很多输出接近于0,testing里出现一些接近于0的负数也很正常。
- 样本较少,特征较少的情况可能会出现,因为GBDT是加法模型,然后下一轮都是上一轮预测值和实际值的残差作为label继续拟合,最后将结果相加,这样最后可能会出现负值。
另外在这个答案中还贴出了一个github链接,里面有小伙伴还举了2个实际的例子来说明确实可能出现这种情况:
实例1:从图形上直观的理解,完全可能会出现预测值小于0的情况!
实例2:给出了具体的实例
ok!
2.5 GBDT+LR的实现及原理有了解吗?介绍下?
这个篇幅较长,需要单独开一篇博客,参考链接:
2.6 XGBoost不适用于什么样情景的数据?
这是室友面试遇到的一个问题,最后面试官给出的答案是:对于呈偏态分布的数据,预排序以及寻找切分点不太友好,因为数据分布的非常不均匀。
2.7 XGBoost GBDT Adaboost RF的基模型分别是什么?
- XGBoost:可以是决策树,也可以是其余的分类器,比如神经网络?
- GBDT:决策树,基本就是CART树!
- Adaboost:理论上任何学习器都可以用于Adaboost;但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。
- RF:决策树,用的最多的是CART树!
参考
- 具体在上面的文章中均列出,故不再一一列举!