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


目录
相关文章
|
1月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
50 3
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
244 1
|
2月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
125 0
|
1月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
99 4
|
9天前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
25 2
|
27天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
44 1
|
1月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
1月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
95 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
1月前
|
机器学习/深度学习 算法
深入探索机器学习中的决策树算法
深入探索机器学习中的决策树算法
41 0