【机器学习】集成学习(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 的优化问题。


目录
相关文章
|
15天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
1天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
2天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
11 0
|
17天前
|
存储 异构计算
System Generator学习——使用 AXI 接口和 IP 集成器(三)
System Generator学习——使用 AXI 接口和 IP 集成器
13 3
|
24天前
|
机器学习/深度学习 分布式计算 算法
大模型开发:你如何确定使用哪种机器学习算法?
在大型机器学习模型开发中,选择算法是关键。首先,明确问题类型(如回归、分类、聚类等)。其次,考虑数据规模、特征数量和类型、分布和结构,以判断适合的算法。再者,评估性能要求(准确性、速度、可解释性)和资源限制(计算资源、内存)。同时,利用领域知识和正则化来选择模型。最后,通过实验验证和模型比较进行优化。此过程涉及迭代和业务需求的技术权衡。
|
1月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
|
1月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
26 1
|
1月前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
94 0
|
1月前
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
56 0
|
1月前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机(SVM)算法
【2月更文挑战第20天】 在数据科学与人工智能的领域中,支持向量机(SVM)是一种强大的监督学习算法,它基于统计学习理论中的VC维理论和结构风险最小化原理。本文将深入探讨SVM的核心概念、工作原理以及实际应用案例。我们将透过算法的数学原理,揭示如何利用SVM进行有效的数据分类与回归分析,并讨论其在处理非线性问题时的优势。通过本文,读者将对SVM有更深层次的理解,并能够在实践中应用这一算法解决复杂的数据问题。
18 0