集成学习


前言

集成模型是什么?简单来说,集成方法是将几种机器学习技术 (官方叫弱学习器) 组合成一个预测模型 (官方叫强学习器) 的元算法,以达到减小偏差(boosting),方差(bagging)、或改进预测(stacking) 的效果。

集成学习在各个规模的数据集上都有很好的策略。

(1) 数据集大:划分成多个小数据集,学习多个模型进行组合

(2) 数据集小:利用Bootstrap方法(有放回的抽样)进行抽样,得到多个数据集,分别训练多个模型再进行组合

根据个体学习器的生成方式不同,我们可以将集成算法分成两类:

1)个体学习器之间存在强依赖关系(基模型是弱模型——偏差高,方差小),必须串行化生成的序列化方法,这一类的代表是Boosting系列集成(常见的算法有Adaboost、GBDT);

注释:
基模型是弱模型的理解——因为是串行的,强调偏差高可以通过串行(权重分配)强化进而减少偏差,方差小直接避免了模型的过拟合。

2)个体学习器之间不存在强依赖关系(基模型是强模型——偏差低,方差大),可以并行化生成每个个体学习器,这一类的代表是Bagging系列集成(常见的算法有RandomForest)。

注释:
基模型是强模型的理解——因为是并行的,模型预测时常通过投票机制,所以强调基模型的偏差小(准确高),通过投票机制间接减少方差。

目前,有三种常见的集成学习框架:boosting,bagging和stacking。

1 集成算法—Boosting

1.1 Boosting的介绍

在前言时就已经说过——
集成学习实际上就是将这多个弱学习器提升成一个强学习器,达到任意小的错误率。

对于核心问题就是这个“提升的过程”
那么对于Boosting系类集成是怎么将多个弱学习器提升成一个强学习器的?

boosting:训练过程为阶梯状,基模型按次序/串行一一进行训练(实现上可以做到并行),基模型的训练集按照某种策略每次都进行一定的转化。对所有基模型预测的结果进行线性综合产生最终的预测结果:
在这里插入图片描述

总的来说Boosting提升通过改变训练数据的分布来训练不同的弱学习器,再将它们组合成强学习器。

注释:
我认为对于“训练数据的分布”可以分为两部分
一部分是训练数据集的分布(做错的样本受到更多的关注
另一部分是对弱学习器的分布(T个基学习器根据他们的预测表现来施加不同的权重

这样的话就出来Boosting关注的两个问题
(1) 如何该改变训练数据(样本)的分布(权重)?
(2) 如何改变弱学习器的分布(权重)进而预测数据?

对于问题1的解决:

(1) 先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的样本受到更多的关注(通过施加权重来控制)
(2) 然后基于调整后的样本集训练下一个基学习器,如此反复进行,直到学得的基学习器的个数达到设定的个数T(基学习器的个数是我们需要调试的超参,通过交叉验证来选择)

对于问题2的解决:

对这T个基学习器根据他们的预测表现来施加不同的权重并结合在一起构成我们的强学习器。

当解决这两个问题后,这两个问题也就形成了Boosting的基本步骤:

简单可以概括为:
(1) 先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的样本受到更多的关注(通过施加权重来控制)
(2) 然后基于调整后的样本集训练下一个基学习器,如此反复进行,直到学得的基学习器的个数达到设定的个数T(基学习器的个数是我们需要调试的超参,通过交叉验证来选择)
(3) 对这T个基学习器根据他们的预测表现来施加不同的权重并结合在一起构成我们的强学习器。

这里总结下Boosting:

1.2 Adaboost(Adaptive boosting)

AdaBoost是Boosting中最为典型的代表,集成问题不外乎是将多个弱学习器进行组合成强学习器。

在Bosting大概解决了弱学习器组合成强学习器中的训练数据权重问题(做错的样本受到更多的关注),弱学习器的权重分布问题(T个基学习器根据他们的预测表现来施加不同的权重)。

对于AdaBoosting的来讲,当我们理解了Boosting后,AdaBoosting也就明白了!


**但是在这里再深入下这两个问题**

假设弱分类器为 Gi​(x),它在强分类器中的权重 αi​,那么就可以得出强分类器 f(x):
在这里插入图片描述
有了这个公式,为了求解强分类器,你会关注两个问题:

如何得到弱分类器,也就是在每次迭代训练的过程中,如何得到最优弱分类器?
每个弱分类器在强分类器中的权重是如何计算的?

我们先来看下第二个问题。
实际上在一个由 K 个弱分类器中组成的强分类器中,如果弱分类器的分类效果好,那么权重应该比较大,如果弱分类器的分类效果一般,权重应该降低。所以我们需要基于这个弱分类器对样本的分类错误率来决定它的权重,用公式表示就是:
在这里插入图片描述
其中 e i e_i ei​ 代表第 i 个分类器的分类错误率。

然后我们再来看下第一个问题,如何在每次训练迭代的过程中选择最优的弱分类器?
实际上,AdaBoost 算法是通过改变样本的数据分布来实现的。AdaBoost 会判断每次训练的样本是否正确分类,对于正确分类的样本,降低它的权重,对于被错误分类的样本,增加它的权重。再基于上一次得到的分类准确率,来确定这次训练样本中每个样本的权重。然后将修改过权重的新数据集传递给下一层的分类器进行训练。这样做的好处就是,通过每一轮训练样本的动态权重,可以让训练的焦点集中到难分类的样本上,最终得到的弱分类器的组合更容易得到更高的分类准确率。我们可以用 D k + 1 D_k+_1 Dk+1​ 代表第 k+1 轮训练中,样本的权重集合,其中 W k + 1 , 1 W_k+_1,_1 Wk+1,1​ 代表第 k+1 轮中第一个样本的权重,以此类推 W k + 1 , N W_k+_1,_N Wk+1,N​代表第 k+1 轮中第 N 个样本的权重,因此用公式表示为:
在这里插入图片描述
第 k+1 轮中的样本权重,是根据该样本在第 k 轮的权重以及第 k 个分类器的准确率而定,具体的公式为:
在这里插入图片描述
AdaBoost 算法示例
了解 AdaBoost 的工作原理之后,我们看一个例子,假设我有 10 个训练样本,如下所示:
在这里插入图片描述

现在我希望通过 AdaBoost 构建一个强分类器。该怎么做呢?

按照上面的 AdaBoost 工作原理,我们来模拟一下。

首先在第一轮训练中,我们得到 10 个样本的权重为 1/10,即初始的 10 个样本权重一致,D1=(0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)。

假设我有 3 个基础分类器:

我们可以知道分类器 f1 的错误率为 0.3,也就是 x 取值 6、7、8 时分类错误;分类器 f2 的错误率为 0.4,即 x 取值 0、1、2、9 时分类错误;分类器 f3 的错误率为 0.3,即 x 取值为 3、4、5 时分类错误。

这 3 个分类器中,f1、f3 分类器的错误率最低,因此我们选择 f1 或 f3 作为最优分类器,假设我们选 f1 分类器作为最优分类器,即第一轮训练得到:
在这里插入图片描述

根据分类器权重公式得到:
在这里插入图片描述

然后我们对下一轮的样本更新求权重值,代入 Wk+1,i​ 和 Dk+1​ 的公式,可以得到新的权重矩阵:
D2=(0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)。

在第二轮训练中,我们继续统计三个分类器的准确率,可以得到分类器 f1 的错误率为 0.16663,也就是 x 取值为 6、7、8 时分类错误。分类器 f2 的错误率为 0.07154,即 x 取值为 0、1、2、9 时分类错误。分类器 f3 的错误率为 0.0715*3,即 x 取值 3、4、5 时分类错误。

在这 3 个分类器中,f3 分类器的错误率最低,因此我们选择 f3 作为第二轮训练的最优分类器,即:
在这里插入图片描述

根据分类器权重公式得到:
在这里插入图片描述

同样,我们对下一轮的样本更新求权重值,代入 Wk+1,i​ 和 Dk+1​ 的公式,可以得到 D3=(0.0455,0.0455,0.0455,0.1667, 0.1667,0.01667,0.1060, 0.1060, 0.1060, 0.0455)。

在第三轮训练中,我们继续统计三个分类器的准确率,可以得到分类器 f1 的错误率为 0.10603,也就是 x 取值 6、7、8 时分类错误。分类器 f2 的错误率为 0.04554,即 x 取值为 0、1、2、9 时分类错误。分类器 f3 的错误率为 0.1667*3,即 x 取值 3、4、5 时分类错误。

在这 3 个分类器中,f2 分类器的错误率最低,因此我们选择 f2 作为第三轮训练的最优分类器,即:
在这里插入图片描述
我们根据分类器权重公式得到:
在这里插入图片描述
假设我们只进行 3 轮的训练,选择 3 个弱分类器,组合成一个强分类器,那么最终的强分类器 G(x) = 0.4236G1(x) + 0.6496G2(x)+0.7514G3(x)。


1.3 GBDT(Gradient Boost Decision Tree)

GBDT与传统的Boosting(AdaBoost)有稍微一点的区别,区别主要集中在训练集样本的分布上,Boosting关注判断错误的样本;GBDT关注的是上一次的残差

GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差(负梯度),这个残差就是一个加预测值后能得真实值的累加量。

比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。Boosting的最大好处在于,每一步的残差计算其实变相地增大了分错instance的权重,而已经分对的instance则都趋向于0。这样后面的树就能越来越专注那些前面被分错的instance。

1.4 XGBoost

类似于GBDT,但将其目标函数展开到二次,并且直接加入正则化项!

除了算法上与传统的GBDT有一些不同外,XGBoost还在工程实现上做了大量的优化。总的来说,两者之间的区别和联系可以总结成以下几个方面。

GBDT是机器学习算法,XGBoost是该算法的工程实现。

  1. 在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模 型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
  2. GBDT在模型训练时只使用了代价函数的一阶导数信息,XGBoost对代 价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
  3. 传统的GBDT采用CART作为基分类器,XGBoost支持多种类型的基分类 器,比如线性分类器。
  4. 传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机 森林相似的策略,支持对数据进行采样。
  5. 传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺 失值的处理策略。

2 集成算法—Bagging

2.1 Bagging的介绍

Bagging即套袋法,先说一下bootstrap,bootstrap也称为自助法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:

A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

由此,总结一下bagging方法:
  ① Bagging通过降低基分类器的方差,改善了泛化误差
  ② 其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏倚引起
  ③ 由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例

2.2 随机森林(Random Forest)

在随机森林中,集成中的每棵树都是由从训练集中抽取的样本(即 bootstrap 样本)构建的。另外,与使用所有特征不同,这里随机选择特征子集从而进一步达到对树的随机化目的。

因此,随机森林产生的偏差略有增加,但是由于对相关性较小的树计算平均值,估计方差减小了,导致模型的整体效果更好。

RandomForest是Bagging的一种变体,在Bagging的基础上引进了属性干扰这一策略,主要是用来提高基学习器之间的多样性,具体规则:传统的决策树是在整个属性集上选择最优的属性来划分样本集合,而RandomForest先在属性集上随机选取k个属性组成一个子属性集,然后在这个子属性集上选择最优的属性来划分样本集合,这里的参数k控制了随机性的引入程度,一般情况下推荐k=log2d,d为属性集的大小。

3 集成算法—stacking

Stacking方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。

理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可。但在实际中,我们通常使用logistic回归作为组合策略。

如下图,先在整个训练数据集上通过bootstrap抽样得到各个训练集合,得到一系列分类模型,然后将输出用于训练第二层分类器。
stacking:将训练好的所有基模型对训练基进行预测,第j个基模型对第i个训练样本的预测值将作为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先经过所有基模型的预测形成新的测试集,最后再对测试集进行预测:
在这里插入图片描述

总结

1、Bagging和Boosting的区别:

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

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

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

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

5) 偏差和方差
Boosting重在减低偏差(串行的原因——增加精确率
Bagging重在降低方差(并行(重抽样)的原因——防止过拟合

2、AdaBoost与GBDT的区别:
Adaboost强调“错分的样本权重越来越大,使它们更被重视"

GBDT强调的是残差,模型建立时为了使得之前模型的残差往梯度方向减少——每次走一小步逐渐逼近结果的效果。

3、Adaboost和RandomForest对比
Adaboost只能做二分类问题,最终的输出是用sign函数决定的。当然对算法上做一些修改也是可以用于回归问题的,但是对于多分类问题就比较复杂。

Adaboost的主要优点:

1)Adaboost作为分类器时,分类精度很高

2)在Adaboost的框架下,可以使用各种分类回归模型来构建基学习器

3)作为简单的二分类问题,构建简单,结果可理解

4)不容易发生过拟合

Adaboost的主要缺点:

1)对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习其的预测准确性

2)Adaboost只能做二分类问题,要做多分类问需要做其他的变通
  
  RandomForest用CART分类回归树来处理分类回归问题,通常采用投票法和平均法来决定最后的输出,对于分类问题采用投票法也决定了随机森林能无修改的应用于多分类问题,随机森林中是采用随机选择子特征集的,子特征集的个数也会影响要模型的方差和偏差,一般认为子特征集越大,模型的偏差会越小

随机森林的主要优点:

1)训练可以高度并行化,因此算法的速度要选快于Adaboost。

2)由于随机子特征集,因此在高维特征下,算法仍具有较好的效率

3)由于随机采样,训练出的模型的方差小,泛化能力强

5)算法实现起来比Boosting更简单

6)对部分特征缺失不敏感

随机森林的主要缺点:

1)在某些噪声比较大的样本集上,RF模型容易陷入过拟合

2)取值比较多的特征容易影响随机森林的决策,影响模型的拟合效果
  
  在这里插入图片描述

参考:
【1】机器不学习:机器学习时代三大神器GBDT、XGBoost、LightGBM:http://www.360doc.com/content/18/0101/17/40769523_718161675.shtml
【2】使用sklearn进行集成学习——理论
https://www.cnblogs.com/jasonfreak/p/5657196.html
【3】数据分析45讲
https://time.geekbang.org/column/article/83915

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值