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


目录
相关文章
|
机器学习/深度学习 存储 数据采集
Elasticsearch 与机器学习的集成
【9月更文第3天】Elasticsearch 不仅仅是一个强大的分布式搜索和分析引擎,它还是一个完整的数据平台,通过与 Kibana、Logstash 等工具结合使用,能够提供从数据采集、存储到分析的一站式解决方案。特别是,Elasticsearch 集成了机器学习(ML)功能,使得在实时数据流中进行异常检测和趋势预测成为可能。本文将详细介绍如何利用 Elasticsearch 的 ML 功能来检测异常行为或预测趋势。
642 4
|
机器学习/深度学习 人工智能 搜索推荐
如何让你的Uno Platform应用秒变AI大神?从零开始,轻松集成机器学习功能,让应用智能起来,用户惊呼太神奇!
【9月更文挑战第8天】随着技术的发展,人工智能与机器学习已融入日常生活,特别是在移动应用开发中。Uno Platform 是一个强大的框架,支持使用 C# 和 XAML 开发跨平台应用(涵盖 Windows、macOS、iOS、Android 和 Web)。本文探讨如何在 Uno Platform 中集成机器学习功能,通过示例代码展示从模型选择、训练到应用集成的全过程,并介绍如何利用 Onnx Runtime 等库实现在 Uno 平台上的模型运行,最终提升应用智能化水平和用户体验。
507 1
|
机器学习/深度学习 TensorFlow 算法框架/工具
全面解析TensorFlow Lite:从模型转换到Android应用集成,教你如何在移动设备上轻松部署轻量级机器学习模型,实现高效本地推理
【8月更文挑战第31天】本文通过技术综述介绍了如何使用TensorFlow Lite将机器学习模型部署至移动设备。从创建、训练模型开始,详细演示了模型向TensorFlow Lite格式的转换过程,并指导如何在Android应用中集成该模型以实现预测功能,突显了TensorFlow Lite在资源受限环境中的优势及灵活性。
2111 1
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
1134 1
|
机器学习/深度学习 运维 算法
【阿里天池-医学影像报告异常检测】3 机器学习模型训练及集成学习Baseline开源
本文介绍了一个基于XGBoost、LightGBM和逻辑回归的集成学习模型,用于医学影像报告异常检测任务,并公开了达到0.83+准确率的基线代码。
409 9
|
机器学习/深度学习 算法
【机器学习】迅速了解什么是集成学习
【机器学习】迅速了解什么是集成学习
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
456 0
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
447 0
|
机器学习/深度学习 PyTorch TensorFlow
NumPy 与机器学习框架的集成
【8月更文第30天】NumPy 是 Python 中用于科学计算的核心库之一,它提供了高效的多维数组对象,以及用于操作数组的大量函数。NumPy 的高效性和灵活性使其成为许多机器学习框架的基础。本文将探讨 NumPy 如何与 TensorFlow 和 PyTorch 等流行机器学习框架协同工作,并通过具体的代码示例来展示它们之间的交互。
296 0
|
机器学习/深度学习 数据采集 缓存
Elasticsearch与机器学习集成的最佳实践
【8月更文第28天】Elasticsearch 提供了强大的搜索和分析能力,而机器学习则能够通过识别模式和预测趋势来增强这些能力。将两者结合可以实现更智能的搜索体验、异常检测等功能。
496 0

热门文章

最新文章