首页 > 其他分享 >最强分类器调优秘诀!AdaBoost让性能飙升!

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

时间:2024-12-14 22:11:58浏览次数:6  
标签:分类 权重 错误率 样本 分类器 调优 AdaBoost

本文已收录在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 发布!

标签:分类,权重,错误率,样本,分类器,调优,AdaBoost
From: https://www.cnblogs.com/JavaEdge/p/18607295

相关文章

  • Linux内核调优参数配置
    在Linux中,内核调优涉及到对系统内核的各种参数进行优化,以适应不同的工作负载和场景。这些参数主要存储在两个地方:一个是运行时动态可调的/proc/sys目录下的文件,另一个是持久化的配置文件/etc/sysctl.conf。1.内核调优配置文件/etc/sysctl.conf:这是最常用的内核参数配置文件,用......
  • 瓦斯浓度预测 | 基于BiLSTM-Adaboost实现瓦斯数据回归预测附matlab代码
    预测效果研究概述将BiLSTM(双向长短期记忆网络)与Adaboost(自适应增强)算法结合用于瓦斯数据回归预测是一个相对不常见的做法,因为Adaboost通常用于分类任务,而不是回归任务。然而,可以通过一些变通的方法将Adaboost的思想应用于回归场景,比如使用回归树作为Adaboost的弱学习......
  • Linux系统性能调优技巧深度解析
    Linux系统性能调优技巧深度解析在Linux系统中,性能调优是确保系统在高负载下依然能够稳定、高效运行的重要环节。调优的目标包括优化系统资源的利用率(如CPU、内存、磁盘和网络),减少瓶颈,并提升系统的响应速度。本文将详细介绍Linux系统性能调优的技巧,并提供具体的代码使用案例......
  • 《机器学习》3.7-4.3end if 启发式 uci数据集klda方法——非线性可分的分类器
    目录uci数据集klda方法——非线性可分的分类器计算步骤1:选择核函数步骤2:计算核矩阵步骤4:解广义特征值问题 と支持向量机(svm)目标:方法:核技巧的应用:区别:使用OvRMvM将多分类任务分解为二分类任务求解时,试述为何无需专门针对类别不平衡性进行处理  end......
  • 分布式锁有哪些实现方式?它们各自的优缺点是什么? JVM调优的基本步骤有哪些如何实现OAut
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)分布式锁有哪......
  • MongoDB 建模调优&change stream实战
    MongoDB开发规范(1)命名原则。数据库、集合命名需要简单易懂,数据库名使用小写字符,集合名称使用统一命名风格,可以统一大小写或使用驼峰式命名。数据库名和集合名称均不能超过64个字符。(2)集合设计。对少量数据的包含关系,使用嵌套模式有利于读性能和保证原子性的写入。对于复杂的......
  • JVM 性能调优 -- Arthas
    前言:之前陆陆续续的分享了JDK自带的相关调优命令、图形化界面工具、第三方网站工具等,本篇我们分享一下Alibaba开源的工具Arthas。JVM系列文章传送门初识JVM(Java虚拟机)深入理解JVM(Java虚拟机)一文搞懂JVM垃圾回收(JVMGC)深入理解JVM垃圾回收算法一文搞懂......
  • Python 潮流周刊#80:Django 项目性能调优(摘要)
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。分享了12篇文章,12个开源项目,3则音视频,全文2100字。以下是本期摘要:......
  • 一次彻底掌握数据中心级的JVM调优实战经验
    出现内存溢出的场景通常发生在应用程序中存在内存泄漏、对象生命周期过长、对象频繁创建但未能及时回收等问题。以下是几个真实的业务场景,结合内存溢出问题,并从多个角度提出优化方法,来提高内存使用效率。场景1:大量业务数据缓存导致堆内存溢出场景描述:一个企业级Web应......
  • 大数据新视界 -- 大数据大厂之 Hive MapReduce 性能调优实战(下)(24 / 30)
           ......