集成学习

Posted 1994tj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集成学习相关的知识,希望对你有一定的参考价值。

集成学习

集成学习通过构建并结合多个学习器来完成学习任务。

集成学习的思路是通过合并多个模型来提升机器学习性能,这种方法相较于当个单个模型通常能够获得更好的预测结果。这也是集成学习在众多高水平的比赛如奈飞比赛,KDD和Kaggle,被首先推荐使用的原因。

分类

用于减少方差的bagging

用于减少偏差的boosting

用于提升预测结果的stacking

集成学习方法也可以归为如下两大类:

1 串行集成方法,这种方法串行地生成基础模型(如AdaBoost)。串行集成的基本动机是利用基础模型之间的依赖。通过给错分样本一个较大的权重来提升性能。

2 并行集成方法,这种方法并行地生成基础模型(如Random Forest)。并行集成的基本动机是利用基础模型的独立性,因为通过平均能够较大地降低误差。

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

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

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

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

GBDT

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

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

GBDT如何做特征工程?
GBDT是一种非线性模型,其思想使其具有天然优势可以发现多种有区分性的特征以及特征组合,决策树的路径可以直接作为LR输入特征使用,省去了人工寻找特征、特征组合的步骤。
详细解读CTR预估中GBDT与LR融合方案。

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

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

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

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

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

GBDT如何去求梯度?
GBDT在进行梯度下降时是损失函数对目标函数的求导∂L∂f|f=fm−1∂L∂f|f=fm−1,而不是对特征值xx,所以无法直接通过上述公式求解(这里我的理解是,决策树中的目标函数没有办法用一个表达式表达,每个节点都是用一个值来分离样本,所以没有办法直接通过表达式来直接求解),我们把函数fm−1fm−1理解成在所有样本上的函数值,即负梯度为−∂L∂f(xi)|f=fm−1−∂L∂f(xi)|f=fm−1,对于每个样本从1到ii都有一个梯度值,则最终函数的梯度值是整合了所有样本上的梯度。参考: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结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

 

 

 

以上是关于集成学习的主要内容,如果未能解决你的问题,请参考以下文章

机器学习集成学习原理

深入浅出Ensemble Learning集成学习原理

深入浅出Ensemble Learning集成学习原理

集成学习的知识整理

7. 集成学习(Ensemble Learning)Stacking

模型集成(Ensemble)