【揭秘】AdaBoost:那些年,我们一起追过的算法

news2024/9/22 5:33:11

在往期文章机器学习进阶之路:集成学习带你走向巅峰和揭秘Bagging与随机森林:构建更强大预测模型的秘密中,我们总结了集成学习的原理,并展开介绍了集成学习中Bagging和随机森林这一分枝算法,在本篇博客中,我们继续介绍另一个分枝——Boosting,并对Boosting系列中的经典算法Adaboost展开分析。

一 Boosting

Boosting是一种串行的工作机制,即基学习器的训练存在依赖关系,必须一步一步序列化进行。其基本思想是:增加前一个基学习器在训练训练过程中预测错误样本的权重,使得后续基学习器更加关注这些打标错误的训练样本,尽可能纠正这些错误,一直向下串行直至产生需要的T个基学习器,Boosting最终对这T个学习器进行加权结合,产生学习器委员会。

Boosting系列算法又称为提升学习算法,算法目标就是将弱分类器提升为强分类器。这里的弱分类器和强分类器是根据准确率对学习器进行的一种划分,弱分类器准确率较低(高于50%即可),强分类器则需要有一个有令人满意准确率。很明显,强分类器是机器学习的最终目标,但在很多场景下,直接训练获取一个强分类器有时候是非常困难的,相比之下,但弱分类器通常通过简单训练即可获得,通过反复学习获得大量弱分类器进行组合也可以获得一个性能优异的强分类器。如果只是这样的话,那么Boosting与Bagging系列的集成算法也就没什么太大区别,在上一篇博客中,我们说过集成学习的所有基本分类器满足符合以下两个条件:

(1)基本分类器之间应该有差异性。如果基本分类器将没有差异,那么集成起来的结果是没有变化的。

(2)每个基本分类器的精度必须大于0.5。

用一句话说就是所有的基本分类器必须“好而不同”,为了达到这一目的,Boosting使用了加法模型和前向分步算法。

加法模型是指强学习器是由一个个弱分类器累加组合而来:

H M ( x ) = ∑ m = 1 M α m h m ( x ) {H_M}(x) = \sum\limits_{m = 1}^M {{\alpha _m}{h_m}(x)} HM(x)=m=1Mαmhm(x)

其中, h m ( x ) {{h_m}(x)} hm(x)是指第 m m m个弱分类器, α m {\alpha _m} αm h m ( x ) {{h_m}(x)} hm(x) M M M个分类器中的权重。

前向分步算法是指在算法迭代过程中,每一个分类器是又上一次迭代产生的分类器基础上进行训练获得。数学表示如下:

H m ( x ) = H m − 1 ( x ) + α m h m ( x ) {H_m}(x) = {H_{m - 1}}(x) + {\alpha _m}{h_m}(x) Hm(x)=Hm1(x)+αmhm(x)

Boosting在集成思想上结合加法模型和前向分步算法的一种集成学习方法:首先从初始训练集中训练一个初始基本分类器,在根据初始分类器的表现对训练样本分布进行调整,使得训练下一个分类器时对上一个学习器误分类样本更加关注,通过此种方式不同循环训练一系列分类器,直到分类器达到指定数量亦或者累加后的强分类器达到指定精度。

前向分步算法决定了在Boosting系列算法中,所有分类器间只能是一种串行的结构,每一个分类器只能在上一个的学习器基础上进行学习,这是与Bagging系列算法分类器间的并行结构最大的不同。

建立在这一思想的基础上,很多Boosting系列算法相继提出,AdaBoost算法就是其中之一。本文接下来内容对AdaBoost算法展开介绍。

二 Adaboost

2.1 算法原理

AdaBoost,是英文Adaptive Boosting的缩写,可直接翻译为自适应提升算法,由Yoav Freund和Robert Schapire在1995年提出。

AdaBoost使用的是指数损失函数,因此AdaBoost的权值与样本分布的更新都是围绕着最小化指数损失函数进行的。看到这里回想一下之前的机器学习算法,不难发现机器学习的大部分带参模型只是改变了最优化目标中的损失函数:如果是Square loss,那就是最小二乘了;如果是Hinge Loss,那就是著名的SVM了;如果是log-Loss,那就是Logistic Regression了。

定义基学习器的集成为加权结合,则有:

AdaBoost算法的指数损失函数定义为:

AdaBoost算法在每一次迭代中根据训练集之中每个样本的分类正确与否,以及上次的总体分类的准确率,来为每个样本设置一个权值,通过增加在上一个弱分类器中被误分类的样本的权值使得该样本在下一次迭代训练弱分类器时得到更多的重视,通过这种方式,每一次迭代都前面弱分类器分类结果基础上训练新的分类器,最终将弱分类器融合起来,作为强分类器进行决策使用,如下图所示。细致一点来说,AdaBoost就可以分为以下三个步骤:

  1. 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。

  2. 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。

  3. 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。

整个AdaBoost的算法流程如下所示:

算法在每次迭代都会更新样本的分布权重 D m D_m Dm,在下一次迭代前会根据 D m D_m Dm进行一次训练样本的重采样

从偏差-方差分解来看:Boosting算法主要关注于降低偏差,每轮的迭代都关注于训练过程中预测错误的样本,将弱学习提升为强学习器。

从AdaBoost的算法流程来看,标准的AdaBoost只适用于二分类问题

Boosting算法要求基学习器能对特定分布的数据进行学习,即每次都更新样本分布权重,这里书上提到了两种方法:“重赋权法”(re-weighting)和“重采样法”(re-sampling),书上的解释有些晦涩,这里进行展开一下:

重赋权法 : 对每个样本附加一个权重,这时涉及到样本属性与标签的计算,都需要乘上一个权值。

重采样法 : 对于一些无法接受带权样本的及学习算法,适合用“重采样法”进行处理。方法大致过程是,根据各个样本的权重,对训练数据进行重采样,初始时样本权重一样,每个样本被采样到的概率一致,每次从N个原始的训练样本中按照权重有放回采样N个样本作为训练集,然后计算训练集错误率,然后调整权重,重复采样,集成多个基学习器。

即,如下图流程所示:

可以看出:AdaBoost的核心步骤就是计算基学习器权重和样本权重分布

三 adaboost实现过程简单举例

下面我们举一个简单的例子来看看adaboost的实现过程:

图中,“+”和“-”分别表示两种类别,在这个过程中,我们使用水平或者垂直的直线作为分类器,来进行分类。

Step 1:

根据分类的正确率,得到一个新的样本分布 D 2 D_2 D2­,一个子分类器 h 1 h_1 h1

其中划圈的样本表示被分错的。在右边的途中,比较大的“+”表示对该样本做了加权。

Step 2:

根据分类的正确率,得到一个新的样本分布 D 3 D_3 D3,一个子分类器 h 2 h_2 h2

Step 3:

得到一个子分类器 h 3 h_3 h3

整合所有子分类器:

​ 因此可以得到整合的结果,从结果中看,及时简单的分类器,组合起来也能获得很好的分类效果,在例子中所有的。

四 AdaBoost多分类问题

详细介绍,请看李航的《统计学习方法》 第8章 提升方法

五 总结

最后对AdaBoost算法进行一下总结。AdaBoost主要有如下特性:

  1. 简单易用,需要进行调节的参数很少;

  2. 原始的AdaBoost算法只适用于二分类任务;

  3. 对于噪声数据较为敏感,这是因为AdaBoost算法倾向于对噪声数据进行拟合,容易造成过拟合;

  4. 弱学习器可以使用任何算法进行构建,例如可使用逻辑回归、决策树、线性回归等;

  5. 可以用来做特征选择,例如进行人群信用风险评估时,特征属性宝库年龄、居住地址、收入、有无不动产等等,用AdaBoost算法金信诺迭代时,每一次迭代需要用一个弱分类器划分数据样本,假设用的是决策树算法,我们只能选择一个特征属性进行划分数据样本,在建模完成后,看看弱分类器都是使用那些特征属性进行决策就可以知道哪些特征属性重要,方便做出特征选择。

AdaBoost 算法还有另一个 解释, 即可以认为 AdaBoost 算法是模型为加法模型损失函数为指数函数学习算法为前向分步算法时的二类分类学习方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF—[BJDCTF2020]The mystery of ip

题解 打开环境点击上面的flag可以看到这个IP页面。 抓个包看看有啥东西无,可以看到在返回包有IP。 看到IP就想到X-Forwarded-For这个玩意,我们用X-Forwarded-For随便添加个IP看看。可以看到返回的IP内容变成了123。 X-Forwarded-For:123 推测它会输出我…

Java-数据结构-ArrayList-练习 ψ(*`ー´)ψ

目录: 一、练习一(删除str1中str2出现的元素): 二、练习二(杨辉三角): 三、练习三(简单的洗牌算法): 总结: 一、练习一(删除str1中str2出现的元素): 我们…

Apple 重發iOS 17.6.1 修正版

蘋果又再次替 iPhone 和 iPad 用戶釋出 iOS 17.6.1更新(21G101),這次更新與8日所推出的 iOS 17.6.1 正式版相同,官方在更新說明內也沒有提到任何修改,依舊是維持修正進階資料保護的問題 iOS 17.6.1 更新修正版內容重點…

JavaEE-HTTPHTTPS

目录 HTTP协议 一、概念 二、http协议格式 http请求报文 http响应报文 URL格式 三、认识方法 四、认识报头 HTTP响应中的信息 HTTPS协议 对称加密 非对称加密 中间人攻击 解决中间人攻击 HTTP协议 一、概念 HTTP (全称为 "超⽂本传输协议") 是⼀种应⽤…

深度学习应用 - 自然语言处理(NLP)篇

序言 在信息技术的浩瀚星空中,深度学习犹如一颗璀璨的新星,正引领着人工智能领域的深刻变革。作为这一领域的核心分支,自然语言处理( NLP \text{NLP} NLP)更是借助深度学习的力量,实现了前所未有的飞跃。自…

4. GIS前端工程师岗位职责、技术要求和常见面试题

本系列文章目录: 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

开源还是封闭?人工智能的两难选择

这篇文章于 2024 年 7 月 29 日首次出现在 The New Stack 上。人工智能正处于软件行业的完美风暴中,现在马克扎克伯格 (Mark Zuckerberg) 正在呼吁开源 AI。 关于如何控制 AI 的三个强大观点正在发生碰撞: 1 . 所有 AI 都应该是开…

SpringCloud开发实战(四):Feign远程调用

目录 SpringCloud开发实战(一):搭建SpringCloud框架 SpringCloud开发实战(二):通过RestTemplate实现远程调用 SpringCloud开发实战(三):集成Eureka注册中心 Feign简介 我…

009.Python爬虫系列_urllib模块案例

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

windows安装composer

windows安装composer 1.介绍 Composer 是一个用于PHP的依赖管理工具。Composer允许你声明你的PHP项目所依赖的库,并管理它们。它会安装和更新你项目所需要的库。 Composer为我们的项目提供了两个功能: 帮助PHP进行依赖管理。在项目中实现文件自动加载…

【C/C++】C语言实现蛇形矩阵

目录 题目描述输入描述:输出描述:示例思路代码 题目描述 给你一个整数n&#xff0c;输出n∗n的蛇形矩阵。 输入描述: 输入一行&#xff0c;包含一个整数n 输出描述: 输出n行&#xff0c;每行包含n个正整数&#xff0c;通过空格分隔。 1<n<1000 示例 输入 4输出 …

主题切换过渡切割效果

主题切换过渡切割效果 效果图上代码 效果图 参考api View Transitions API View Transitions API 提供了一种机制&#xff0c;可以在更新 DOM 内容的同时&#xff0c;轻松地创建不同 DOM 状态之间的动画过渡。同时还可以在单个步骤中更新 DOM 内容。 上代码 <!--* Descript…

人工智能造福公众:未来一片光明

作者&#xff1a;来自 Elastic Peter Dutton 我们如何衡量人工智能对政府的影响&#xff1f;毫无疑问&#xff0c;人工智能将为运营流程和决策带来的好处已被广泛讨论 —— 从自动化工作流程到节省成本再到减少重复工作。 但对于以服务公众为目标的组织来说&#xff0c;人工智…

黑马头条docker启动minio访问不了,端口一直变化

原先代码为 docker run -p 9000:9000 --name minio -d --restartalways -e "MINIO_ROOT_USERminio" -e "MINIO_ROOT_PASSWORDminio123" -v /home/data:/data -v /home/config:/root/.minio minio/minio server /data 访问结果为&#xff0c;且9000会变为3…

PostgreSQL的repmgr工具介绍

PostgreSQL的repmgr工具介绍 repmgr&#xff08;Replication Manager&#xff09;是一个专为 PostgreSQL 设计的开源工具&#xff0c;用于管理和监控 PostgreSQL 的流复制及实现高可用性。它提供了一组工具和实用程序&#xff0c;简化了 PostgreSQL 复制集群的配置、维护和故障…

glsl着色器学习(九)屏幕像素空间和设置颜色

在上一篇文章中&#xff0c;使用的是裁剪空间进行绘制&#xff0c;这篇文章使用屏幕像素空间的坐标进行绘制。 上一篇的顶点着色器大概是这样子的 回归一下顶点着色的主要任务&#xff1a; 通常情况下&#xff0c;顶点着色器会进行一系列的矩阵变换操作&#xff0c;将输入的顶…

凯伦股份助力胖东来打造一流商超项目

在当下快节奏的城市生活里头&#xff0c;很多线下零售业务都已经被网购平台所冲击或影响&#xff0c;但偏偏河南许昌市的“胖东来”超市&#xff0c;每天的客流量高达数万人&#xff0c;且供不应求&#xff0c;大众赞誉它为“商超行业的顶尖品牌”、“中国超市的标杆”、“河南…

【数学建模】2024数学建模国赛经验分享

文章目录 一、关于我二、我的数模历程三、经验总结&#xff1a; 一、关于我 我的CSDN主页&#xff1a;https://gxdxyl.blog.csdn.net/ 2020年7月&#xff08;大二结束的暑假&#xff09;开始在CSDN写作&#xff1a; 阿里云博客专家&#xff1a; 接触的领域挺多的&#xff…

【Linux】应用层自定义协议与序列化

一、应用层 我们程序员写的一个一个解决实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。在应用层中的协议也是最多的。 1.1 再次认识协议 协议是一种约定&#xff0c;是通信双方约定的一种数据结构。在之前写的UDP服务器和TCP服务器中&#xff0c;…

C++和Python混合编程——C++调用Python入门

大纲 代码结构初始化 Python 解释器获取 GIL为什么需要 GIL&#xff1f;GIL 的影响 导入 Python 模块并执行代码释放 GIL终止 Python 解释器 完整代码编译执行结果项目地址 在《C和Python混合编程——Python调用C入门》一文中&#xff0c;我们熟悉了Python调用C编译的动态库的方…