【机器学习】集成学习(Boosting)——AdaBoost提升算法(理论+图解+公式推导)

简介: 【机器学习】集成学习(Boosting)——AdaBoost提升算法(理论+图解+公式推导)

2021人工智能领域新星创作者,带你从入门到精通,该博客每天更新,逐渐完善机器学习各个知识体系的文章,帮助大家更高效学习。


一、集成学习

我们平常使用的大多数模型都为单模型方式,有时单模型方式可能会造成误判或者过拟合的现象,所以我们就像能不能有一种方式可以融合多个模型,这就产生了集成学习的概念。

集成学习通过构建多个分类器来完成学习任务,有时被称为多分类器系统,它是基于多个分类器共同完成模型的生成,集成学习一般情况为模型内部集成了多个小的模型,有时也叫做个体学习器,举个例子,我们的决策树是一个过拟合非常严重的模型,所以只使用一棵树进行拟合数据不太靠谱,所以我们考虑使用多颗树进行建模,模型的最终结果参考多颗树模型的结果。

集成学习有种3个臭皮匠顶个诸葛亮的感觉,比如对于一个复杂的事情,如果我们只听取一个人的意见往往可能做出错误的判断,所以我们需要参考多个人的意见。

一般情况下集成学习内部的学习器都为弱学习器,所谓的弱学习器就是单独进行建模的准确率不是特别高,但是要高于盲猜,强学习器就是一般不适用集成学习,就自己建模也会产生很好的拟合效果,但是大多数情况下,我们集成学习内部使用的是弱学习器,而不是强学习器,这是因为强学习器往往会产生过拟合的现象,如果又是集成学习,多个强学习器共同作用,那么过拟合则为更加严重,所以我们使用弱学习器作为基分类器,我们希望的是每个基分类器能够学习到数据的不同特征,术业有专攻。

比如我们组建一支队伍时,我们希望每个队员都可以有自己较为厉害的能力,而不是每个人都掌握相同的能力,我们的集成学习算法也是如此,我们希望每个基分类器能够学习数据不同特征,然后进行组合这些分类器,然后就可以产生一个强分类器来拟合整个数据集。

如果集成模型要获得好的性能,需要我们每个个体学习器应该有各自的特点,即多样性。

现在目前的集成学习方法大概分为两类:

  • Boosting:个体学习器之间存在强依赖关系、必须串行生成的序列化方法,典型算法:AdaBoost、GBDT
  • Bagging:个体学习器不存在强依赖关系、可同时生成的并行化方法,典型算法:随机森林

本篇着重讲解采用Boosting提升方法的AdaBoost。

二、AdaBoost算法

1.Boosting提升方法

对于分类问题而言,我们的集成学习方式采用了多个基学习器,我们会使用这些基学习器先去拟合数据,然后组合这些弱分类器,构成一个强分类器,然而在学习基学习器的过程中,我们希望每个基学习器尽可能不同,如果每个基学习器学习的模型相似,那么我们的集成学习就没什么意义了,所以我们要让每个基学习器尽可能学习到不同的数据。

那么对于Boosting提升算法就会衍生两个问题:

一是如何训练不同的分类器,二是如何组合这些弱分类器组成强分类器。

对于第一个问题,提升算法采用的是更改数据权值(概率分布),你比如说我们使用第一个基学习器学习样本时,肯定会有分错的样本数据,所以我们会加大分错样本的权重,降低分类正确的样本权重,然后让下个分类器学习时更加注重上次分类错误的数据,我们的提升方法就是妙在这里,能够不断修正分类错误样本的权值,使我们的模型能够根据分类重点重视分类错误的数据,其实适当增大样本的概率和增多该样本的数量效果一样,错误样本概率越大,我们后面的模型就会越重视它,而如果错误样本越多,那么我们学习器学习更多的数据都是上次分错的样本,其实本质是一样的。

对于第二个问题,如何组合这些弱分类器进而组成一个强分类器,Boosting一般采用加权多数表决的方式,它会线性组合按照一定的权重组合多个弱分类器,误差率小的弱分类器的权重会很大,使其在总的表决中起较大的作用。

2.AdaBoost算法思想

假设我们数据为二分类,类别为+1,-1,AdaBoost的设计思想就是从每轮的训练数据中学习一个基学习器,最终将这些弱分类器组合为一个强分类器。

算法流程:

1.初始化每个样本的权重,第一次训练时每个样本的权重相同都为 1 N \frac{1}{N}N1

D 1 = ( w 11 , w 12 , . . . , w 1 N ) w 1 i = 1 N D_1=(w_{11},w_{12},...,w_{1N}) \quad w_{1i}=\frac{1}{N}D1=(w11,w12,...,w1N)w1i=N1

2.对m=1,2,3,…,m ,m对应弱分类器个数

(a)使用带有权重的训练集去训练弱分类器 G m ( x ) G_m(x)Gm(x)

(b)计算 G m ( x ) G_m(x)Gm(x) 弱分类器在训练集上的误差率

e m = ∑ i = 1 N P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m i I ( G m ( x i ) ≠ y i ) = ∑ G m ( x i ) ≠ y i w m i e_m=\sum_{i=1}^NP(G_m(x_i)\not=y_i)=\sum_{i=1}^Nw_{mi}I(G_m(x_i)\not=y_i)=\sum_{G_m(x_i)\not=y_i}w_{mi}em=i=1NP(Gm(xi)=yi)=i=1NwmiI(Gm(xi)=yi)=Gm(xi)=yiwmi

(c)计算 G m ( x ) G_m(x)Gm(x) 弱分类器的权重

a m = 1 2 l o g   1 − e m e m a_m=\frac{1}{2}log\ \frac{1-e_m}{e_m}am=21logem1em

(d)根据分类正确和分类错误样本更新样本权重

D m + 1 = ( w m + 1 , 1 , w m + 1 , 2 , . . . , w m + 1 , N ) D_{m+1}=(w_{m+1,1},w_{m+1,2},...,w_{m+1,N})Dm+1=(wm+1,1,wm+1,2,...,wm+1,N)

w m + 1 , i = w m i Z m e x p ( − a m y i G m ( x i ) ) w_{m+1,i}=\frac{w_{mi}}{Z_m}exp(-a_my_iG_m(x_i))wm+1,i=Zmwmiexp(amyiGm(xi))

Z m = ∑ i = 1 N w m i e x p ( − a m y i G m ( x i ) ) Z_m=\sum_{i=1}^Nw_{mi}exp(-a_my_iG_m(x_i))Zm=i=1Nwmiexp(amyiGm(xi))

3.由弱分类器线性组合为一个强分类器

f ( x ) = ∑ i = 1 m a m G m ( x ) f(x)=\sum_{i=1}^ma_mG_m(x)f(x)=i=1mamGm(x)

G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ i = 1 m a m G m ( x ) ) G(x)=sign(f(x))=sign(\sum_{i=1}^ma_mG_m(x))G(x)=sign(f(x))=sign(i=1mamGm(x))

3.AdaBoost原理解释

上面我们大体概括了AdaBoost整个算法流程,接下来我们具体讲解每部为什么这么做。

首先针对于第一步我们初始化了整个样本权重,由于这是第一个学习器需要学的,所以我们不需要修正权重,只需要让每个样本权重相等即可,即使用 1 N \frac{1}{N}N1 作为每个样本的权重。

第二步是要训练m个基学习器,训练每个基学习器的大概流程为:

1.训练基学习器

2.计算该学习器在训练数据上的误差,用于确定模型线性组合的权重

3.根据误差率计算模型线性组合的权重

4.更新新的学习器需要训练的样本权重,增大上一个学习器分错的样本权重

首先训练基学习器就不用多说了,使用不同的基学习器学习方式不同,和个体学习一样。

我们可以看到计算误差的式子为:

e m = ∑ i = 1 N P ( G m ( x i ) ≠ y i ) = ∑ i = 1 N w m i I ( G m ( x i ) ≠ y i ) = ∑ G m ( x i ) ≠ y i w m i e_m=\sum_{i=1}^NP(G_m(x_i)\not=y_i)=\sum_{i=1}^Nw_{mi}I(G_m(x_i)\not=y_i)=\sum_{G_m(x_i)\not=y_i}w_{mi}em=i=1NP(Gm(xi)=yi)=i=1NwmiI(Gm(xi)=yi)=Gm(xi)=yiwmi

我们就是计算分类错误样本的概率,也就是分类错误样本所对应的权重,我们知道一个模型的误差率越小,该模型的可信程度越大,他们两个成负相关的关系,所以我们定义该分类器的权重为:

a m = 1 2 l o g   1 − e m e m a_m=\frac{1}{2}log\ \frac{1-e_m}{e_m}am=21logem1em

由该式我们可以看到,模型的误差率越大,模型的权重 a m a_mam 越小,反之越大,所以使用该式可以很好的描述误差率和权重之间的关系,注意这里的权重为模型的权重而不是样本的权重。

对于上面我们训练好了第一个基学习器,而对于该学习器来说,我们肯定会有分类错误的样本的,所以我们希望更新样本的权重,用于下一个学习器进行训练,我们要使第一个分类器分类错误的样本数据的权重增大,分类正确的适当减小。

w m + 1 , i = w m i Z m e x p ( − a m y i G m ( x i ) ) w_{m+1,i}=\frac{w_{mi}}{Z_m}exp(-a_my_iG_m(x_i))wm+1,i=Zmwmiexp(amyiGm(xi))

我们先不看分母,他为一个常数,用于规范化的,看指数括号内的 − a m y i G m ( x i ) -a_my_iG_m(x_i)amyiGm(xi)

{ − a m 分 类 正 确 y i G m ( x i ) = 1 a m 分 类 失 败 y i G m ( x i ) = − 1

{amyiGm(xi)=1amyiGm(xi)=1{−am分类正确yiGm(xi)=1am分类失败yiGm(xi)=−1

{amyiGm(xi)=1amyiGm(xi)=1

而我们的权重 a m a_mam 为大于0的数,所以分类正确时指数函数的幂数为小于0的数,e x e^xex 函数当x小于0时,y小于1,所以此时的 e x p ( − a m y i G m ( x i ) ) exp(-a_my_iG_m(x_i))exp(amyiGm(xi)) 小于1,那么对应该样本之前的权重 w m i w_{mi}wmi 就会乘以一个小于1的数,导致新的样本权重减小。

而如果分类错误的话,对应的y大于1,所以此时新的样本权重会被放大。

分母上除以 Z m Z_mZm 是为了更新完每个样本的权重后,保持每个样本权重之和为1。

Z m = ∑ i = 1 N w m i e x p ( − a m y i G m ( x i ) ) Z_m=\sum_{i=1}^Nw_{mi}exp(-a_my_iG_m(x_i))Zm=i=1Nwmiexp(amyiGm(xi))

训练好m个分类器后,我们获得了这m个分类器和相对应的权重,之后我们就可以使用线性组合的方式将多个弱分类器组成一个强分类器。

f ( x ) = ∑ m = 1 m a m G m ( x ) f(x)=\sum_{m=1}^ma_mG_m(x)f(x)=m=1mamGm(x)

这里还有个注意的地方就是,我们每次更新样本的权重之和为1,而这些若分类器的权重之和是不为1的。

4.构造损失函数,求解参数

针对于整个模型的算法流程已经设计好了,接下来的问题就是如何求出每个弱分类器的参数,以及各个的权重,我们第一时间就是想到首先构造一个模型整体的损失函数,其次使用优化方法对该损失函数进行求解,一般对于连续值使用均方误差作为损失函数,对于分类问题使用交叉熵,然后优化方法使用梯度下降法进行求解各个参数,但是AdaBoost算法没有使用该方法,原因如下:

如果要构造损失函数,一般形式为:

m i n ∑ i = 1 N L ( y i , ∑ m = 1 M a m G m ( x , θ ) ) min\sum_{i=1}^NL(y_i,\sum_{m=1}^Ma_mG_m(x,\theta))mini=1NL(yi,m=1MamGm(x,θ))

其中的 θ \thetaθ 为每个基学习器的参数,如果使用梯度下降的方式进行优化的话不是不行,而是不好,因为假想我们每个基学习器使用线性回归分类器,那么对应的参数w就应该和特征数差不多,而我们又要串行训练那么多的基学习器,如果特征维度较大的话,我们使用梯度下降的话每次迭代训练的参数太多,一方面是计算资源问题,第二个是参数太多不容易优化。

所以我们考虑使用一种新的方式进行优化:前向分布算法。

5.前向分步算法

上面说过使用梯度下降单次迭代需要优化的参数太多不容易优化,所以我们想每次优化的参数能不能减少一点,一次不优化那么多的参数,显然可以,正巧我们的AdaBoost算法是串行模型组合,所以我们考虑能不能一个一个学习器模型进行学习,而不是直接学习总的损失函数。

因为AdaBoost是加法模型,所以我们能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式,这样就可以简化优化的复杂程度,每次优化的参数就可以少很多。

我们每一步只需要优化如下的损失函数:

m i n ∑ i = 1 N L ( y i , a G ( x ) ) min\sum_{i=1}^NL(y_i,aG(x))mini=1NL(yi,aG(x))

算法流程:

1.初始化 f 0 ( x ) = 0 f_0(x)=0f0(x)=0

2.对m=1,2,…,M

(a)极小化损失函数

( a , θ ) = a r g m i n a , θ   ∑ i = 1 N L ( y i , f m − 1 ( x i ) + a G ( x i , θ ) ) (a,\theta)=argmin_{a,\theta}\ \sum_{i=1}^NL(y_i,f_{m-1}(x_i)+aG(x_i,\theta))(a,θ)=argmina,θi=1NL(yi,fm1(xi)+aG(xi,θ))

(b)更新模型 f ( x ) f(x)f(x)

f m ( x ) = f m − 1 ( x ) + a G ( x , θ ) f_m(x)=f_{m-1}(x)+aG(x,\theta)fm(x)=fm1(x)+aG(x,θ)

3.得到加法模型

f ( x ) = f M ( x ) = ∑ i = 1 M a m G m ( x ) f(x)=f_M(x)=\sum_{i=1}^Ma_mG_m(x)f(x)=fM(x)=i=1MamGm(x)

其实这个算法的意思就是首先定义 f ( x ) f(x)f(x) 为0,然后训练第一个分类器,然后求解第一个模型的最优参数,然后将这个弱分类器模型更新到整个模型 f ( x ) f(x)f(x) 中,然后训练第二个分类器的参数,第一个模型就视为常数,内部的参数不需要更新,就这样不断更新每个弱分类器然后将其更新到整个模型中,得到最终的强分类器。

这样,前向分步算法将同时求解从 m = 1 m=1m=1 到M所有参数 a m , θ m a_m,\theta_mam,θm 的优化问题简化为逐次求解各个 a m , θ m a_m,\theta_mam,θm 的优化问题。


目录
相关文章
|
2月前
|
机器学习/深度学习 算法 PyTorch
125_训练加速:FlashAttention集成 - 推导注意力优化的独特内存节省
2025年,大型语言模型的训练面临着前所未有的挑战。随着模型参数量和序列长度的不断增加,传统注意力机制的内存瓶颈问题日益突出。FlashAttention作为一种突破性的注意力算法,通过创新的内存访问模式和计算优化,显著提升了训练效率和内存利用。
|
机器学习/深度学习 前端开发 测试技术
机器学习第10天:集成学习
机器学习第10天:集成学习
|
算法 索引
HashMap扩容时的rehash方法中(e.hash & oldCap) == 0算法推导
HashMap在扩容时,会创建一个新数组,并将旧数组中的数据迁移过去。通过(e.hash & oldCap)是否等于0,数据被巧妙地分为两类:一类保持原有索引位置,另一类索引位置增加旧数组长度。此过程确保了数据均匀分布,提高了查询效率。
239 2
|
人工智能 算法 大数据
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
这篇内容介绍了编程中避免使用 for 循环的一些方法,特别是针对 Python 语言。它强调了 for 循环在处理大数据或复杂逻辑时可能导致的性能、可读性和复杂度问题。
220 6
算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环
|
机器学习/深度学习
【机器学习】准确率、精确率、召回率、误报率、漏报率概念及公式
机器学习评估指标中的准确率、精确率、召回率、误报率和漏报率等概念,并给出了这些指标的计算公式。
3280 0
|
机器学习/深度学习 算法
【机器学习】简单解释贝叶斯公式和朴素贝叶斯分类?(面试回答)
简要解释了贝叶斯公式及其在朴素贝叶斯分类算法中的应用,包括算法的基本原理和步骤。
193 1
|
机器学习/深度学习 算法 数据挖掘
【机器学习】聚类算法中的距离度量有哪些及公式表示?
聚类算法中常用的距离度量方法及其数学表达式,包括欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、余弦相似度等多种距离和相似度计算方式。
1243 1
|
机器学习/深度学习 算法 前端开发
集成学习(Ensemble Learning)是一种机器学习技术,它通过将多个学习器(或称为“基学习器”、“弱学习器”)的预测结果结合起来,以提高整体预测性能。
集成学习(Ensemble Learning)是一种机器学习技术,它通过将多个学习器(或称为“基学习器”、“弱学习器”)的预测结果结合起来,以提高整体预测性能。
|
机器学习/深度学习 算法 前端开发
机器学习中的集成学习(二)
**集成学习概述** 集成学习通过结合多个弱学习器创建强学习器,如Bagging(Bootstrap Aggregating)和Boosting。Bagging通过随机采样产生训练集,训练多个弱模型,然后平均(回归)或投票(分类)得出结果,减少方差和过拟合。Boosting则是迭代过程,每个弱学习器专注于难分类样本,逐步调整样本权重,形成加权平均的强学习器。典型算法有AdaBoost、GBDT、XGBoost等。两者区别在于,Bagging模型并行训练且独立,而Boosting模型间有依赖,重视错误分类。
|
机器学习/深度学习 人工智能 自然语言处理
机器学习中的集成学习(一)
集成学习是一种将多个弱学习器组合成强学习器的方法,通过投票法、平均法或加权平均等策略减少错误率。它分为弱分类器集成、模型融合和混合专家模型三个研究领域。简单集成技术包括投票法(用于分类,少数服从多数)、平均法(回归问题,预测值取平均)和加权平均法(调整模型权重以优化结果)。在实际应用中,集成学习如Bagging和Boosting是与深度学习并驾齐驱的重要算法,常用于数据竞赛和工业标准。

热门文章

最新文章