集成学习基本原理:Adaboost,Bagging和Stacking

集成学习的基本原理是,训练多个“个体学习器”或者叫基分类器,基学习器。然后用某种策略将它们结合起来,最后可以产生比单一学习器优越得多的性能。
集成学习的基本原理是什么呢?假设对于每个基分类器,错误率有:

P(hi(x)f(x))=ϵ

并且 假设分类器之间之互相独立的,那么最终的错误率为:
P(H(x)f(x))exp(12T(12ϵ)2)

可以看到当错误率 ϵ>0.5 随着个体分类器数目 T 的增大,最终的错误率会趋向于0。我们把分类正确率稍大于0.5,也就是比瞎猜好一点的分类器称为弱分类器。按照上面的分析,只要基分类器不比弱分类器差,最终我们的集成的结果都可以任意好!
但是上面有一个非常重要的假设条件,各个分类器之间需要相互独立,但是实际中基分类器都是由同一个数据集中训练出来的,不可能完全独立,所以如何从一个数据集中训练出来具有“多样性”的基学习器是非常重要的,但是其实多样性和准确性是相互矛盾的。
按照基学习器的生成方式,目前的集成学习的方法分成两大类。一种是学习器之间是串行生成的,学习器互相之间有很强的依赖性,代表算法是Boosting。另一种是并行生成的学习器,学习器之间相关关系不大,代表算法是Bagging 和Random Forest(随机森林)。

下面介绍这两类算法

Boosting

首先介绍两个概念
“强可学习”:一个类,如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个类是强可学习的。
“弱可学习”:一个类,如果存在一个多项式的学习算法能够学习它,但是正确率仅仅比随机猜测要好,那么就称这个类是弱可学习的。

那么问题来了,如果我们有了一个弱可学习的算法,如何把它提升成为一个强可学习的算法?这就是下面将要介绍的提升(boost)算法,代表算法是AdaBoost算法。

提升算法的基本原理是,开始的时候,我们给数据集所有数据以相同的权重。然后首先我们有一个弱分类器,分类之后,我们对分类错误的数据以更高的权重,这就产生了一个新的样本分布,在此基础上我们再生成一个基分类器,再重复以上步骤,直到分类器个数达到要求。之后把所有的分类器按照权重相加(这个权重在每一步单独计算),就得到最终的分类器。看不懂没关系,我理解的AdaBoost的基本原理就是,每训练一个基学习器都要对之前没有分类好的数据进行修正,最终达到我们的要求。
下面是AdaBoost的算法的描述

这里写图片描述

再仔细描述一下上面的步骤:
(1) 先初始化所有点的权值分布

D1=(w11,,w1i,,w1m),w1i=1m,i=1,2,,m

注意这里的花写的D代表的是数据点的权重分布,脚标1代表第一次初始化得来的分布,这一点不要忘记,否则后面的证明等很容易糊涂。
(2)进入循环,不断执行以下四步,对于第t次循环
(a)根据具有权重分布 Dt 的数据集 D ,训练得到一个基学习器ht
(b)计算分类器 ht 在训练数据集上的分类误差率
ϵt=P(ht(xi)yi)=i=1mwtiI(ht(xi)yi)

注意这里面的求和的式子里是加权的,这里也体现出了权重的作用,如果一个点的权重较大,那么他一旦分错,对总的误差率影响也较大。
(c)计算 ht(x) 的系数
αt=12ln1ϵtϵt

注意这里的系数是分类器的系数,最后按照系数将所有分类器相加的到最后的分类器
(d)更新数据集的权重分布
Dt+1=(wt+1,1,,wt+1,i,,wt+1,m)

wt+1,i=wtiZtexp(αtyiht(xi)),i=1,2,,m

Zt 是一个规范化因子,使得 Dt+1 成为一个概率分布。在上一步中预测错误的点 yiht(xi)=1 (因为是二分类,两个取值为1或者-1),这一次更新之后权重会增加。
(3)当循环结束后,我们把所有基分类器按照系数相加,得到
f(x)=t=1mαtht(x)

那么最终的分类器
H(x)=sign(f(x))=sign(t=1mαtht(x))

下面证明一下AdaBoost,主要是证明 αt D 的更新是怎么来的,不感兴趣的可以跳过

AdaBoost 证明

1.

当基分类器 ht(x) 基于权重分布 D 产生之后,我们要生成 ht 的权重 αt ,而 α 应该最小化 αtht 的指数损失函数(下面公式里面的 f(x) 代表的是数据集上的数据的类,这点要记住,不然容易糊涂

exp(αtht|Dt)=ExDt[ef(x)αtht(x)]

=eαtPxDt(f(x)=ht(x))+eαtPxDt(f(x)ht(x))

注意上面这一步是把输出和预测值相等和不相等两种情况拆开来写的。然后令 ϵt=PxDt(f(x)ht(x)) ,注意这里不是简单的错误率,注意脚标就知道,是将预测错误的数据点的权重相加。下面我们就可以得到上式等于:
=eαt(1ϵt)+eαtϵt

指数损失函数是在AdaBoost中默认使用的损失函数,具体因为什么,我也不知道了。
可以看到指数损失函数是单调递增的凸函数,求它的极值点就能够得到最值点。我们对指数损失函数求导,可以得到

exp(αtht|Dt)αt=eαt(1ϵt)+eαtϵt

再令上式为0,可以得到
αt=12ln(1ϵtϵt)

而这个正好就是上面的对 αt 的更新公式。

2.

下面介绍 Dt 是如何更新的,顺便介绍一下 ht 的一些性质。
当Adaboost获得 Ht1=α1h1(x)+α2h2(x)++αt1ht1(x) 之后,假设已经对样本进行了权重的更新,现在我们要如何训练出一个 ht 来纠正前面的学习器所犯的错误,假设新的学习器能够最小化指数损失函数即

exp(Ht1+ht|D)=ExD[ef(x)Ht1(x)+ht(x))]=ExD[ef(x)Ht1(x)ef(x)ht(x)]

利用 f2(x)=h2t(x)=1 ,再利用泰勒展开可得:
exp(Ht1+ht|D)ExD[ef(x)Ht1(x)(1f(x)ht(x)+f2(x)h2t(x)2)]

=ExD[ef(x)Ht1(x)(1f(x)ht(x)+12)]

上面这个式子有两点需要注意 1. 是相对于初始分布 D 求的均值 2. ht 前面是没有参数 α 的这也是我们的具体步骤,在每一步我们是直接先相对于上一步训练出来的分布求出一个学习器,再根据最小化指数损失函数的原则求出 αt
这时,理想的学习器为
ht(x)=argminhexp(Ht1+ht|D)

也就是能够使总的损失函数最小化的学习器。
那么联系上面的式子可得
ht(x)=argmaxhExD[ef(x)Ht1(x)(f(x)ht(x))]

之所以能够这么写,我的理解是因为这个时候 Ht1 是已知的,那么 ExD[ef(x)Ht1(x)] 是一个常数,同理我在式子右边除以这个常数的期望值对式子本身也是没有影响的,那么可得

ht(x)=argmaxhExD[ef(x)Ht1(x)ExD[ef(x)Ht1(x)]f(x)ht(x)]

Dt 表示一个分布

Dt(x)=D(x)ef(x)Ht1(x)ExD[ef(x)Ht1(x)]

这是第 t 个分布Dt(x)与初始分布 D(x) 之间的关系!!!!另外为什么 Dt 是一个分布,这里稍微解释下。其实何为分布,就是一组值和他们对应的概率。只不过有个要求,对于随机变量X,它的所有可能的取值对应的概率相加要为1,这是概率的性质要求的。在离散情况下就直接相加,连续情况下就求积分,那么在这里,因为 ExD[ef(x)Ht1(x)]=D(x)ef(x)Ht1(x) ,这是期望的基本定义。那么显然我们有
D(x)ef(x)Ht1(x)ExD[ef(x)Ht1(x)]=1
Dt(x) 的概率之和为1,符合分布的要求。
之后接着我们就有了
ht(x)=argmaxhExDt[f(x)h(x)]

注意变成了在 Dt 上的期望,这一步看不懂的话把期望公式展开就理解了。

再由于 f(x)h(x)=12I(f(x)h(x)) ,可得理想的学习器为

ht(x)=argminhExDt[I(f(x)h(x))]

也就是 ht(x) 在分布 Dt 下最小分类误差。这句话什么意思呢?记得我们最开始的 ht 的表达式么? ht(x)=argminhexp(Ht1+ht|D) 最小化的是在初始分布上总的学习器误差,但是最终我们得到了这个理想的学习器只需要在 Dt 上最小化分类误差就行!

然后由于已经有了 Dt D 之间的关系就很容易得到 Dt Dt+1 之间的关系

Dt+1=Dt(x)ef(x)αtht(x)ExD[ef(x)Ht1(x)]ExD[ef(x)Ht(x)]

上面就是算法中对权重进行更新的的式子,可以看到, 预测错误的点的权重会变大 eαt ,预测正确的点的权重会变成原来的 eαt

以上的证明完全来自周志华的《机器学习》,只是自己看的时候有点费劲,于是就想在看懂之后加上自己的想法记录下来,也就有了上面的记录,以供参考

Bagging和随机森林

前面说过串行产生基学习器的算法是AdaBoost ,并行产生学习器的是Bagging。Bagging和“袋子”没有关系,而是由Booststrap AGGregatING算法的缩写,其中boostrap是一种自主采样法(boostrap sampling)。主要步骤是,对于一个大小为m的样本集,我们从中取出一个样本,然后再放回去,之后再取,不断抽样直到总共得到m个样本。显然,这么抽样显然是有可能有样本被重复抽样,最后初始训练集中约有63.2%的样本会被选中到最终的采样集中。
我们按照这种采样方式得到 T 个含有m个样本的采样集,在这些采样集上分别训练出来T个基学习器 ht ,再将这些学习器进行结合,一般都是直接进行投票法,就得到了最终的学习器

H(x)=argmaxyYt=1TI(ht(x)=y)

这种简单的Bagging方法是通过在样本上产生多样性,从而给予学习器之间独立性。

第二种算法叫做随机森林(Random Forest, RF),RF是Bagging的一种变体,基学习器是决策树,只是同时引入了属性的随机选择的算法。首先每个作为基学习器的决策树都很短,目前看到的很多都是只用决策树桩(只进行一次划分)就行。然后每次进行属性选择的时候是首先选择一个所有属性集 的子集,然后从这个子集中选择出最优的属性。通过这种方式引入属性的随机性。
可以看出随机森林的原理很简单,容易实现,但是实际上它的性能很好,被誉为“代表集成学习技术技术水平的方法”。相比于Bagging 随机森林的方法一般初始误差比较大,但是随着基学习器数量的增加,最后随机森林的效果往往比Bagging要好。

Stacking

Stacking是一种集成学习算法,很多算法可以视作它的特例,它也是一种很重要的结合策略。主要的原理也很简单,我们根据训练集训练出 T <script id="MathJax-Element-247" type="math/tex">T</script>个初级学习器,这些初级学习器更多的时候是互不相同的,比如可能是决策树,神经网络等,当然也可能是相同的,比如都是决策树。然后我们还有一个次级学习器(也叫元学习器),我们拿所有的初级学习器的输出作为次级学习器的输入来训练次级学习器,最后得到一个总的学习器。
下图为流程的示意图
这里写图片描述

下面是算法的伪代码
这里写图片描述

算法本身不复杂,没有像AdaBoost那样的公式。就是在训练中,要注意为了防止过拟合,不能直接使用初级学习器的训练集产生次级学习器的训练集,而要使用交叉验证法,对初始的训练集进行划分,训练集用来训练初级学习器,验证集用来产生次级训练集。

Stacking是一种比较重要的思想,加入我们有一个学习器效果不是很好,我们想要提升它的效果,那我们可以用它和其他的学习器集成起来,从而达到减小误差提升效果的目的。

注:文中图片来自袁博老师《数据挖掘:理论与算法》ppt.

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: bagging:是一种集成学习方法,通过对训练数据进行有放回的随机抽样,生成多个子集,然后在每个子集上训练一个基学习器,最后将这些基学习器的预测结果进行平均或投票来得到最终的预测结果。 boosting:也是一种集成学习方法,但与bagging不同的是,它是通过对训练数据进行加权,使得基学习器更加关注那些难以分类的样本,从而提高整体的预测准确率。 stacking:是一种更加高级的集成学习方法,它不仅仅是将多个基学习器的预测结果进行简单的平均或投票,而是将这些预测结果作为新的特征,再训练一个元学习器来得到最终的预测结果。 ### 回答2: BaggingBoostingStacking都是集成学习(Ensemble Learning)中常用的方法。 Bagging(自举汇聚法)是一种并行集成方法,基于自助采样的思想,通过构建多个相互独立的分类器(如决策树),再进行投票或求平均等方式进行集成。每个子分类器都是在不同的训练数据集上训练得到的,可以减少模型的方差,提高模型的稳定性,有效降低过拟合风险。 Boosting(提升法)则是一种串行集成方法,通过迭代训练一系列弱分类器(如决策树),通过不断调整样本权重以使错误样本更加关注,然后再结合所有弱分类器形成一个强分类器。Boosting可以提高模型的准确性,特别适用于处理复杂的分类问题。 Stacking(堆叠泛化法)是一种更为复杂的集成方法,它结合了BaggingBoosting的优势。在Stacking中,首先构建多层的分类器(如基分类器、元分类器等),每层的输出作为下一层的输入。最后通过一个元分类器来整合各层的输出结果,以获得最终的预测结果。 总结起来,Bagging通过并行地构建多个相互独立的分类器进行集成Boosting通过迭代地训练一系列弱分类器形成一个强分类器,而Stacking通过构建多层的分类器以获得更强大的预测能力。这些集成方法在实际应用中,能够有效提高分类模型的准确性和稳定性,达到更好的预测效果。 ### 回答3: BaggingBoostingStacking都是常用于集成学习(ensemble learning)中的方法。 Bagging是基于自助采样(bootstrap sampling)的一种集成学习方法。在Bagging中,我们从原始数据集中使用有放回地进行采样得到多个不同的子样本集,并使用这些子样本集独立地训练多个基学习器。最后,通过对基学习器的预测结果进行投票或求平均来得到最终的集成模型。Bagging能够减少过拟合,提高模型的稳定性和泛化能力。 Boosting也是一种集成学习方法,与Bagging不同的是它是基于序列训练的。在Boosting中,基学习器是按顺序训练的,每个基学习器都会根据前一个学习器的预测结果对样本进行调整。Boosting的核心思想是通过迭代训练一系列弱学习器,使得它们能够逐步提升性能并最终形成一个强学习器。常用的Boosting算法有AdaBoost和Gradient BoostingStacking是一种更高级的集成学习方法,它将多个不同类型的基学习器集成在一起。在Stacking中,我们首先使用训练数据集对多个基学习器进行训练,然后使用这些基学习器对测试数据集进行预测。接着,我们将基学习器的预测结果作为输入,再训练一个元学习器来得到最终的集成模型Stacking通过将不同类型的基学习器进行组合,可以充分利用它们的优势,提高模型的性能和泛化能力。 综上所述,BaggingBoostingStacking都是集成学习中常用的方法,它们通过组合多个基学习器来提高模型的性能和泛化能力,从而在实际应用中取得更好的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值