机器学习面试——集成学习篇

这里是LeeTioN的博客

一、集成学习概论

什么是集成学习?

集成学习(Ensemble Learning)通过构建并结合多个基学习器来完成学习任务,比如分类问题下,集成学习通过一定的方式组合若干个基分类器的预测结果来对问题进行更精准的预测,具有更高的鲁棒性和泛化能力。

集成学习一般有哪几类?

Bagging:全称Bootstrap Aggregation。Bagging方法中每一个基学习器的数据来源,都是将整体样本和所有特征进行一种有放回的抽取。每个基学习器在“不同”的数据集中学习出一个模型,最后的预测结果通过所有基学习器共同决定。分类问题采用投票的方式,回归问题采用平均值的方式。

Boosting:用所有的数据去训练基学习器,每一个基学习器相互依赖,基于前面所有的学习器的结果,学习他们与真实值之间的残差,集中关注预测出错的地方,来形成一个新的学习器。是一种串行的学习方式。

Bagging和Boosting的区别?

样本选择:

Bagging: 训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

样例权重:

Bagging: 使用均匀取样,每个样例的权重相等。
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

预测函数:

Bagging: 所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

并行计算:

Bagging: 各个预测函数可以并行生成。
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

二、GBDT

一位大佬总结得很好 机器学习算法GBDT的面试要点总结-上篇,我按照他的思路框架来写一下。

什么是GBDT?

GBDT(Gradient Boosting Decision Tree)全称梯度下降树,是Boosting家族的一种,采用加法模型,通过不断减少训练过程中产生的残差来将分类或回归问题不断优化。

GBDT如何选择特征?

GBDT的弱分类器默认选择的是CART,所以GBDT的特征选择遵循CART的特征选择方法。其实也可以选择其他弱分类器的,选择的前提是低方差和高偏差。框架服从Boosting 框架即可。

GBDT如何做特征工程?

2014年Facebook发表了一篇关于CTR预估的论文,提到了将GBDT和LR模型融合做分类的方法。原文下载
GBDT是一种非线性模型,其思想使其具有天然优势可以发现多种有区分性的特征以及特征组合,决策树的路径可以直接作为LR输入特征使用,省去了人工寻找特征、特征组合的步骤。
详细解读CTR预估中GBDT与LR融合方案。

GBDT由CART 回归树组成,那么如何运用到分类问题?

GBDT可以用来分类,但不代表GBDT使用的是分类树。GBDT的核心是每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的,而残差相减是有意义的,但是类别相减是没有意义的。还有一点需要注意,在GBDT运用分类的问题时,CART选取特征已经不是用Gini指数来挑选了

对于二分类问题,在GBDT中的每一个叶子节点的估计值即是一个概率值,我们则可以通过概率值来预测样本的类别。

这篇文章中详细地讲述了GBDT用于分类问题的方法梯度提升树(GBDT)原理小结,强烈推荐。

GBDT的优缺点?

优点

可以灵活处理各种类型的数据,包括连续值和离散值。
相对于SVM来说,在相对少的调参时间情况下,预测的准备率也可以比较高。
使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

缺点

由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。

GBDT的梯度提升体现在什么方面?

GBDT的损失函数对于目标函数 f(x) f ( x ) 求导,每一轮的迭代都会用线性相加的方式更新目标函数 fm(x)=fm1(x)+γ f m ( x ) = f m − 1 ( x ) + γ (即学习上一轮留下的残差, γ γ 为学习到的残差,即负梯度方向),GBDT是利用了损失函数的负梯度在当前模型的值作为残差的近似值。

GBDT如何去求梯度?

GBDT在进行梯度下降时是损失函数对目标函数的求导 Lf|f=fm1 ∂ L ∂ f | f = f m − 1 ,而不是对特征值 x x ,所以无法直接通过上述公式求解(这里我的理解是,决策树中的目标函数没有办法用一个表达式表达,每个节点都是用一个值来分离样本,所以没有办法直接通过表达式来直接求解),我们把函数 fm1 f m − 1 理解成在所有样本上的函数值,即负梯度为 Lf(xi)|f=fm1 − ∂ L ∂ f ( x i ) | f = f m − 1 ,对于每个样本从1到 i i 都有一个梯度值,则最终函数的梯度值是整合了所有样本上的梯度。参考:GBDT理论知识总结

GBDT哪些操作可以并行?

1.计算每个样本的负梯度

2.分裂挑选最佳特征及其分割点时,对特征计算相应的误差及均值时

3.更新每个样本的负梯度时

4.最后预测过程中,每个样本将之前的所有树的结果累加的时候

GBDT的实现?

关于GBDT的实现可以看一位大佬的GitHub,里面有个notebook对公式的讲解也非常详细!

三、XGBoost

什么是XGBoost?

XGBoost是大规模并行Boosted Tree的工具,由陈天奇大牛新开发的Boosting库。它是一个大规模、分布式的通用Gradient Boosting(GBDT)库,它在Gradient Boosting框架下实现了GBDT和一些广义的线性机器学习算法。

XGBoost与GBDT的区别?

支持线性分类器

传统GBDT以CART作为基分类器,XGBoost还支持线性分类器,这个时候XGBoost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)

损失函数的二阶泰勒展开

传统GBDT在优化时只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,XGBoost工具支持自定义代价函数,只要函数可一阶和二阶求导。

正则项

XGBoost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是XGBoost优于传统GBDT的一个特性。

权重缩减

XGBoost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。

列抽样

XGBoost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是XGBoost异于传统GBDT的一个特性。

并行

XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

作者:wepon
链接:https://www.zhihu.com/question/41354392/answer/98658997
来源:知乎

待更新(最后于2018/4/3更新)……

参考资料:

(有些链接上文中已经部分给出)
https://www.cnblogs.com/dudumiaomiao/p/6361777.html
https://www.cnblogs.com/ModifyRong/p/7744987.html
https://blog.csdn.net/lilyth_lilyth/article/details/48032119
https://www.cnblogs.com/pinard/p/6140514.html
http://nbviewer.jupyter.org/github/liudragonfly/GBDT/blob/master/GBDT.ipynb
https://www.zhihu.com/question/41354392/answer/98658997

你可能感兴趣的:(机器学习,集成学习,Xgboost,GBDT)