最强分类器调优秘诀!AdaBoost让性能飙升!

news/2024/12/14 22:05:11/文章来源:https://www.cnblogs.com/JavaEdge/p/18607295

本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

  • 编程严选网

0 前言

数据挖掘中,分类算法可以说是核心算法,其中AdaBoost算法与随机森林算法一样都属于分类算法中的集成算法。

集成的含义是集思广益,博取众长。决定时,先听取多个专家的意见,再决定。集成算法通常有两种方式:

  • 投票选举(bagging):投票选举的场景类似把专家召集到一个会议桌前,当做一个决定的时候,让K个专家(K个模型)分别进行分类,然后选择出现次数最多的那个类作为最终的分类结果
  • 再学习(boosting):相当于把K个专家(K个分类器)进行加权融合,形成一个新的超级专家(强分类器),让这个超级专家做判断

Boosting含义是提升,作用是每次训练时,都对上次训练进行改进提升,训练过程中这K个“专家”之间是有依赖性,当引入第K个“专家”(第K个分类器),实际是对前K-1个专家的优化。而bagging在做投票选举的时候可以并行计算,也就是K个“专家”在做判断的时候是相互独立的,不存在依赖性。

1 AdaBoost工作原理

AdaBoost,Adaptive Boosting,自适应提升算法。Freund等人于1995年提出,对Boosting算法的实现。

啥是Boosting算法?

集成算法的一种,也是一类算法的总称。这类算法通过训练多个弱分类器,将它们组合成一个强分类器,也就是我们俗话说的“三个臭皮匠,顶个诸葛亮”。为什么要这么做呢?因为臭皮匠好训练,诸葛亮却不好求。因此要打造一个诸葛亮,最好的方式就是训练多个臭皮匠,然后让这些臭皮匠组合起来,这样往往可以得到很好的效果。

可用上图表示最终得到的强分类器,它通过一系列弱分类器根据不同权重组合而成。

若弱分类器为:

\[G_{i}(x) \]

它在强分类器中的权重:

\[α_{i} \]

可得强分类器f(x):

\[f(x) = \sum_{i=1}^{n} \alpha_i G_i(x) \]

有这公式,为求解强分类器,会关注:

  1. 咋得到弱分类器,即每次迭代训练过程,咋得最优弱分类器?

  2. 每个弱分类器在强分类器中的权重咋计算?

先看第二个问题。K个弱分类器中组成的强分类器中,若:

  • 弱分类器的分类效果好,权重应较大
  • 弱分类器的分类效果一般,权重应降低

所以要基于这个弱分类器对样本的分类错误率来决定它的权重,公式:

\[α_i = \frac{1}{2} log{\frac{1-e_i}{e_i}} \]

\[e_{i} \]

代表第i个分类器的分类错误率。

再看第一个问题,AdaBoost算法是通过改变样本的数据分布来实现的。AdaBoost会判断每次训练的样本是否正确分类,对于正确分类的样本,降低它的权重,对于被错误分类的样本,增加它的权重。再基于上一次得到的分类准确率,来确定这次训练样本中每个样本的权重。然后将修改过权重的新数据集传递给下一层的分类器进行训练。这样做的好处就是,通过每一轮训练样本的动态权重,可以让训练的焦点集中到难分类的样本上,最终得到的弱分类器的组合更容易得到更高的分类准确率。

可用

\[D_{k+1} \]

代表第k+1轮训练中,样本的权重集合,其中

\[W_{k+1,1} \]

代表第k+1轮中第一个样本的权重,以此类推:

\[W_{k+1,N} \]

代表第k+1轮中第N个样本的权重,公式:

\[D_{k+1} = (w_{k+1,1}, w_{k+1,2}, ..., w_{k+1,N}) \]

第k+1轮中的样本权重,是根据该样本在第k轮的权重以及第k个分类器的准确率而定,具体的公式为:

\[w_{k+1,i} = \frac{w_{k,i}}{Z_k} \exp(-\alpha_k y_i G_k(x_i)), i = 1, 2, ..., N \]

2 示例

有10个训练样本:

X 0 1 2 3 4 5 6 7 8 9
Y 1 1 1 -1 -1 -1 1 1 1 -1

现在我希望通过AdaBoost构建一个强分类器。

该怎么做呢?按照上面的AdaBoost工作原理,我们来模拟一下。

首先在第一轮训练中,我们得到10个样本的权重为1/10,即初始的10个样本权重一致,D1=(0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1)。

假设我有3个基础分类器:

\[f_1(x) = \begin{cases} 1, & x < 2.5 \\ -1, & x > 2.5 \end{cases} \]

\[f_2(x) = \begin{cases} -1, & x < 5.5 \\ 1, & x > 5.5 \end{cases} \]

\[f_3(x) = \begin{cases} 1, & x < 8.5 \\ -1, & x > 8.5 \end{cases} \]

可知分类器f1的错误率为0.3,即x取值6、7、8时分类错误;分类器f2的错误率为0.4,即x取值0、1、2、9时分类错误;分类器f3的错误率为0.3,即x取值为3、4、5时分类错误。

f1、f3分类器错误率最低,因此选f1或f3作最优分类器,若选f1,即第一轮训练得:

\[G_1(x) = \begin{cases} 1, & x \leq 2.5 \\ -1, & x > 2.5 \end{cases} \]

按分类器权重公式得:

\[\alpha_{1}=\frac{1}{2}\log\frac{1-e_{1}}{e_{1}}=0.4236 \]

然后对下一轮的样本更新求权重值,代入

\[W_{k+1,i} \]

\[D_{k+1} \]

的公式,可得新的权重矩阵:D2=(0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.0715, 0.1666, 0.1666, 0.1666, 0.0715)。

第二轮训练继续统计三个分类器准确率,可得:

  • f1错误率0.1666*3,即x取值为6、7、8时分类错误
  • f2错误率为0.0715*4,即x取值为0、1、2、9时分类错误
  • f3错误率为0.0715*3,即x取值3、4、5时分类错误

f3错误率最低,因此选f3作第二轮训练最优分类器:

\[G_2(x) = \begin{cases} 1, & x \leq 8.5 \\ -1, & x > 8.5 \end{cases} \]

按分类器权重公式得:

\[\alpha_{2}=\frac{1}{2}\log\frac{1-e_{2}}{e_{2}}=0.6496 \]

对下轮的样本更新求权重值,代入

\[W_{k+1,i} \]

\[D_{k+1} \]

的公式,得D3=(0.0455,0.0455,0.0455,0.1667, 0.1667,0.01667,0.1060, 0.1060, 0.1060, 0.0455)。

第三轮训练,继续统计三个分类器的准确率,可得:

  • f1错误率0.1060*3,即x取值6、7、8时分类错误
  • f2错误率为0.0455*4,即x取值为0、1、2、9时分类错误
  • f3的错误率为0.1667*3,即x取值3、4、5时分类错误

f2错误率最低,因此选f2作第三轮训练的最优分类器:

\[G_3(x) = \begin{cases} -1, & x <= 5.5 \\ 1, & x > 5.5 \end{cases} \]

我们根据分类器权重公式得到:

\[\alpha _{3}=\frac{1}{2}\log \frac{1-e_{3}}{e_{3}}=0.7514 \]

若只进行3轮训练,选择3个弱分类器,组合成一个强分类器,则最终的强分类器

\[G(x) = 0.4236G1(x) + 0.6496G2(x)+0.7514G3(x) \]

AdaBoost算法是个框架,你可指定任意分类器,通常用CART分类器作弱分类器。通过上面示例运算,体会AdaBoost计算流程即可。

3 总结

AdaBoost可理解为一种集成算法,通过训练不同弱分类器,集成起来形成一个强分类器。每轮训练都加入一个新的弱分类器,直到达到够低错误率或达到指定最大迭代次数。每次迭代都会引入一个新弱分类器(这个分类器是每一次迭代中计算出来的,是新的分类器,不是事先备好)。

在弱分类器的集合中,你不必担心弱分类器太弱了。实际上它只需要比随机猜测的效果略好一些即可。如果随机猜测的准确率是50%的话,那么每个弱分类器的准确率只要大于50%就可用。AdaBoost的强大在于迭代训练的机制,这样通过K个“臭皮匠”的组合也可以得到一个“诸葛亮”(强分类器)。

当然在每一轮的训练中,我们都需要从众多“臭皮匠”中选择一个拔尖的,也就是这一轮训练评比中的最优“臭皮匠”,对应的就是错误率最低的分类器。当然每一轮的样本的权重都会发生变化,这样做的目的是为了让之前错误分类的样本得到更多概率的重复训练机会。

同样原理也在日常,如善用错题本提升学习效率和成绩。

AdaBoost的核心思想

  • 迭代训练: AdaBoost通过迭代的方式训练多个弱分类器。
  • 加权组合: 将多个弱分类器按照其准确率赋予不同的权重,线性组合成一个强分类器。
  • 样本权重更新: 在每一轮迭代中,对分类错误的样本赋予更高的权重,使得后续的分类器更加关注这些困难样本。

弱分类器与强分类器

  • 弱分类器: 分类准确率仅比随机猜测略高的分类器。通常是简单模型,如决策树桩。
  • 强分类器: 由多个弱分类器加权组合而成的分类器,具有很高的分类准确率。

AdaBoost训练过程

  1. 初始化样本权重: 给每个样本赋予相同的初始权重。
  2. 训练弱分类器: 基于当前样本分布,训练一个弱分类器。
  3. 计算分类错误率: 计算该弱分类器在当前样本分布下的分类错误率。
  4. 计算弱分类器的权重: 根据分类错误率计算该弱分类器的权重。
  5. 更新样本权重: 对于分类错误的样本,增加其权重;对于分类正确的样本,降低其权重。
  6. 组合弱分类器: 将得到的弱分类器按照权重线性组合,得到一个强分类器。
  7. 重复步骤2-6,直到达到预设的迭代次数或分类错误率满足要求。

为什么AdaBoost有效?

  • 关注困难样本: 通过不断调整样本权重,AdaBoost能够重点关注那些难以分类的样本,从而提高模型的整体性能。
  • 多样性: 每个弱分类器都关注不同的特征,通过组合这些弱分类器,可以得到一个更加鲁棒的模型。
  • 逐步提升: AdaBoost是一种自适应算法,通过逐步迭代,不断提升模型的性能。

进一步思考

  • 弱分类器的选择: AdaBoost对弱分类器的要求并不高,只要其准确率略高于随机猜测即可。常见的弱分类器包括决策树桩、神经网络等。
  • 过拟合问题: 过多的迭代可能会导致过拟合,因此需要设置合适的迭代次数。
  • 其他Boosting算法: 除了AdaBoost之外,还有其他的Boosting算法,如梯度提升树(GBDT)等。

本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Toyota Programming Contest 2024#12(AtCoder Beginner Contest 384)题解

总体情况感觉这次在起飞。 20 分钟后就在罚坐。 A - aaaadaa 题目描述 给定一个长度为 \(N\) 的字符串 \(S\) ,由小写英文字母以及小写英文字母 \(c_1\) 和 \(c_2\) 组成。 查找将 \(S\) 中所有不属于 \(c_1\) 的字符替换为 \(c_2\) 后得到的字符串。 思路分析 直接模拟。代码…

解决2024.1以后新版本IDEA Lombok (@Data)等不生效的问题

做项目做着做着新模块用不了 lombok 真的要崩溃了,各种检查插件、配置,发现都无法恢复;乱试指定版本:终于可用了。。真的有崩溃感

DNS之公共DNS

阿里 AliDNS 阿里公共DNS是阿里巴巴集团推出的DNS递归解析系统,目标是成为国内互联网基础设施的组成部分,面向互联网用户提供“快速”、“稳定”、“智能”的免费DNS递归解析服务。 DNS 服务器 IP 地址: 首选:223.5.5.5 备选:223.6.6.6 阿里公共DNS114DNS 国内用户量巨大的…

NestJS 部署Apache

要将Nest.JS应用搭建在Apache服务器上,你需要了解Nest.JS是一个基于Node.js的框架,因此它本质上是一个后端服务,而Apache通常用作前端服务器或反向代理。以下是将Nest.JS应用与Apache服务器结合使用的步骤: 一、准备环境安装Node.js:确保在服务器上安装了Node.js。你可以从…

综合设计——多源异构数据采集与融合应用综合实践

这个项目属于哪个课程2024数据采集与融合技术实践 组名 从你的全世界爬过团队logo:项目简介 项目名称:博物识植项目logo:项目介绍:在探索自然奥秘的旅途中,我们常与动植物相伴而行,却无法准确识别它们,更难以深入了解他们的特征。为了更好地理解和欣赏自然界的多样性,…

maven docker-maven-plugin 发布docker 20241214

1、docker开启远程访问 端口 2375docker主机:192.168.177.128 vi /usr/lib/systemd/system/docker.service #修改ExecStart这行 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 #重新加载配置文件 [root@localhost ~]# systemctl daemon-reload #重启服务 [root@lo…

10大关键技术解构:智能合同审查系统全景解析

前言 随着企业数字化转型的深入,合同管理在业务流程中的重要性愈加凸显。传统的人工审查合同方式不仅耗时耗力,还容易出现疏漏,尤其在复杂法律条款和跨部门协作的场景中,这一问题尤为明显。为了解决这一痛点,思通数科智能合同审查系统应运而生。基于人工智能和大数据分析的…

2024-2025-1 20241403《计算机基础与程序设计》第十二周学习总结

2024-2025-1 20241403《计算机基础与程序设计》第十二周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 指针与一维…

我的新博客 MarisaMagics Blog

新博客地址 MarisaMagics Blog 最近用 github + hexo 配置了一个新的博客,以后可能基本上都在新博客平台上更新文章 DA⭐ZE ~一切都是命运石之门的选择,本文章来源于博客园,作者:MarisaMagic,出处:https://www.cnblogs.com/MarisaMagic/p/18607182,未经允许严禁转载

locust 压力测试工具windows平台从零开始安装使用

locust是一个用python写的接口压力测试应用,我们只需要编写简单的代码才能运行测试,前期安装需要一点python基础。 用以测试的接口需要一个一个通过代码添加,如下: 这就是一个测试的接口了,很简单,只需要接口的路径和参数,接口的主机地址会在web端输入: locust需要pyth…