机器学习强基计划10-2:详细推导串行集成AdaBoost算法(附Python实现)

news2024/11/28 6:42:42

目录

  • 0 写在前面
  • 1 串行集成学习
  • 2 AdaBoost原理推导
  • 3 Python实现
    • 3.1 算法流程
    • 3.2 核心代码
    • 3.3 可视化

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编写、测试与文章配套的各个经典算法,不依赖于现有库,可以大大加深对算法的理解。

🚀详情:机器学习强基计划(附几十种经典模型源码)


1 串行集成学习

串行集成学习是一种机器学习的技术,旨在通过将多个基学习器按顺序组合起来,以提高整体学习性能。在串行集成学习中,基学习器按照一定的顺序进行训练和集成,每个基学习器都依赖于前一个学习器的输出。

Boosting是一族将弱学习器提升为强学习器的串行集成算法,这族算法核心原理为:先从初始训练集训练出一个基学习器;再根据基学习器的表现对训练样本分布进行调整,实现不同学习器的差异性,同时使先前基学习器的误分类样本在后续受到更多关注;然后基于调整后的样本分布训练下一个基学习器;重复进行直至基学习器数目达到事先指定值 T T T,最终将这 T T T个基学习器进行集成输出。

在这里插入图片描述

Boosting族的著名算法是自适应提升(Adaptive Boosting, AdaBoost),其采用指数损失函数,具体原理参见第二节

2 AdaBoost原理推导

AdaBoost具体而言,分为两个步骤:

  • 从样本分布 D t \mathcal{D} _t Dt中训练分类器 h t h_t ht,使 H t − 1 H_{t-1} Ht1的误分类样本在 h t h_t ht作用下误分类概率下降
  • 生成 h t h_t ht后计算其权重 α t \alpha _t αt使总体损失最小

注意,标准AdaBoost算法只用于二分类问题

具体原理推导如下:首先考察 h t h_t ht的产生,理想的 h t h_t ht能纠正 H t − 1 H_{t-1} Ht1的所有错误,使损失最小

h t = a r g min ⁡ h ∈ H ∑ x e − f ( x ) [ H t − 1 ( x ) + α t h ( x ) ] = a r g min ⁡ h ∈ H ∑ x : h ( x ) = f ( x ) e − f ( x ) H t − 1 ( x ) e − α t + ∑ x : h ( x ) ≠ f ( x ) e − f ( x ) H t − 1 ( x ) e α t = a r g min ⁡ h ∈ H ∑ x e − f ( x ) H t − 1 ( x ) e − α t + ∑ x : h ( x ) ≠ f ( x ) e − f ( x ) H t − 1 ( x ) ( e α t − e − α t ) = a r g min ⁡ h ∈ H ∑ x : h ( x ) ≠ f ( x ) e − f ( x ) H t − 1 ( x ) = a r g min ⁡ h ∈ H ∑ x : h ( x ) ≠ f ( x ) e − f ( x ) H t − 1 ( x ) ∑ x e − f ( x ) H t − 1 ( x ) \begin{aligned}h_t&=\underset{h\in \mathcal{H}}{\mathrm{arg}\min}\sum_{\boldsymbol{x}}{e^{-f\left( \boldsymbol{x} \right) \left[ H_{t-1}\left( \boldsymbol{x} \right) +\alpha _th\left( \boldsymbol{x} \right) \right]}}\\&=\underset{h\in \mathcal{H}}{\mathrm{arg}\min}\sum_{\boldsymbol{x}:h\left( \boldsymbol{x} \right) =f\left( \boldsymbol{x} \right)}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}e^{-\alpha _t}}+\sum_{\boldsymbol{x}:h\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right)}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}e^{\alpha _t}}\\&=\underset{h\in \mathcal{H}}{\mathrm{arg}\min}\sum_{\boldsymbol{x}}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}e^{-\alpha _t}}+\sum_{\boldsymbol{x}:h\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right)}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}\left( e^{\alpha _t}-e^{-\alpha _t} \right)}\\&=\underset{h\in \mathcal{H}}{\mathrm{arg}\min}\sum_{\boldsymbol{x}:h\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right)}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}\\&=\underset{h\in \mathcal{H}}{\mathrm{arg}\min}\sum_{\boldsymbol{x}:h\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right)}{\frac{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}{\sum\nolimits_{\boldsymbol{x}}^{}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}}}\end{aligned} ht=hHargminxef(x)[Ht1(x)+αth(x)]=hHargminx:h(x)=f(x)ef(x)Ht1(x)eαt+x:h(x)=f(x)ef(x)Ht1(x)eαt=hHargminxef(x)Ht1(x)eαt+x:h(x)=f(x)ef(x)Ht1(x)(eαteαt)=hHargminx:h(x)=f(x)ef(x)Ht1(x)=hHargminx:h(x)=f(x)xef(x)Ht1(x)ef(x)Ht1(x)

其中 f f f为训练集 D D D中样本 x \boldsymbol{x} x到其标签 y y y的映射。若设分布

D t ( x ) = e − f ( x ) H t − 1 ( x ) ∑ x e − f ( x ) H t − 1 ( x ) \mathcal{D} _t\left( \boldsymbol{x} \right) =\frac{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}{\sum\nolimits_{\boldsymbol{x}}^{}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}} Dt(x)=xef(x)Ht1(x)ef(x)Ht1(x)

其中误分类样本 f ( x ) H t − 1 ( x ) < 0 f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right) <0 f(x)Ht1(x)<0权重升高,正确分类样本权重降低,则

h t = a r g min ⁡ h ∈ H ∑ x : h ( x ) ≠ f ( x ) D t ( x ) = a r g min ⁡ h ∈ H P x   D t ( h ( x ) ≠ f ( x ) ) h_t=\underset{h\in \mathcal{H}}{\mathrm{arg}\min}\sum_{\boldsymbol{x}:h\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right)}{\mathcal{D} _t\left( \boldsymbol{x} \right)}=\underset{h\in \mathcal{H}}{\mathrm{arg}\min}P_{\boldsymbol{x}~\mathcal{D} _t}\left( h\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right) \right) ht=hHargminx:h(x)=f(x)Dt(x)=hHargminPx Dt(h(x)=f(x))

换言之,只要根据 H t − 1 H_{t-1} Ht1调整下一轮迭代时的样本分布 D t ( x ) \mathcal{D} _t\left( \boldsymbol{x} \right) Dt(x),就能降低 H t − 1 H_{t-1} Ht1中误分类样本再次被误分类的概率。考虑迭代性,有

D t ( x ) = D t − 1 ( x ) ∑ x e − f ( x ) H t − 2 ( x ) ∑ x e − f ( x ) H t − 1 ( x ) e − f ( x ) H t − 1 ( x ) e − f ( x ) H t − 2 ( x ) = D t − 1 ( x ) e − f ( x ) α t − 1 h t − 1 ( x ) ∑ x D t − 1 ( x ) e − f ( x ) α t − 1 h t − 1 ( x ) \mathcal{D} _t\left( \boldsymbol{x} \right) =\mathcal{D} _{t-1}\left( \boldsymbol{x} \right) \frac{\sum\nolimits_{\boldsymbol{x}}^{}{e^{-f\left( \boldsymbol{x} \right) H_{t-2}\left( \boldsymbol{x} \right)}}}{\sum\nolimits_{\boldsymbol{x}}^{}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}}\frac{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}{e^{-f\left( \boldsymbol{x} \right) H_{t-2}\left( \boldsymbol{x} \right)}}=\frac{\mathcal{D} _{t-1}\left( \boldsymbol{x} \right) e^{-f\left( \boldsymbol{x} \right) \alpha _{t-1}h_{t-1}\left( \boldsymbol{x} \right)}}{\sum\nolimits_{\boldsymbol{x}}^{}{\mathcal{D} _{t-1}\left( \boldsymbol{x} \right) e^{-f\left( \boldsymbol{x} \right) \alpha _{t-1}h_{t-1}\left( \boldsymbol{x} \right)}}} Dt(x)=Dt1(x)xef(x)Ht1(x)xef(x)Ht2(x)ef(x)Ht2(x)ef(x)Ht1(x)=xDt1(x)ef(x)αt1ht1(x)Dt1(x)ef(x)αt1ht1(x)

接下来考虑 α t \alpha _t αt的计算,同样从优化指数损失出发

α t = a r g min ⁡ α e − α ∑ x : h t ( x ) = f ( x ) e − f ( x ) H t − 1 ( x ) ∑ x e − f ( x ) H t − 1 ( x ) + e α ∑ x : h t ( x ) ≠ f ( x ) e − f ( x ) H t − 1 ( x ) ∑ x e − f ( x ) H t − 1 ( x ) = a r g min ⁡ α e − α ∑ x : h t ( x ) = f ( x ) D t ( x ) + e α ∑ x : h t ( x ) ≠ f ( x ) D t ( x ) = a r g min ⁡ α e − α P x   D t ( h t ( x ) = f ( x ) ) + e α P x   D t ( h t ( x ) ≠ f ( x ) ) = η = P x   D t ( h t ( x ) ≠ f ( x ) ) a r g min ⁡ α e − α ( 1 − η ) + e α η \begin{aligned}\alpha _t&=\underset{\alpha}{\mathrm{arg}\min}e^{-\alpha}\sum_{\boldsymbol{x}:h_t\left( \boldsymbol{x} \right) =f\left( \boldsymbol{x} \right)}{\frac{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}{\sum\nolimits_{\boldsymbol{x}}^{}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}}}+e^{\alpha}\sum_{\boldsymbol{x}:h_t\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right)}{\frac{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}{\sum\nolimits_{\boldsymbol{x}}^{}{e^{-f\left( \boldsymbol{x} \right) H_{t-1}\left( \boldsymbol{x} \right)}}}}\\&=\underset{\alpha}{\mathrm{arg}\min}e^{-\alpha}\sum_{\boldsymbol{x}:h_t\left( \boldsymbol{x} \right) =f\left( \boldsymbol{x} \right)}{\mathcal{D} _t\left( \boldsymbol{x} \right)}+e^{\alpha}\sum_{\boldsymbol{x}:h_t\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right)}{\mathcal{D} _t\left( \boldsymbol{x} \right)}\\&=\underset{\alpha}{\mathrm{arg}\min}e^{-\alpha}P_{\boldsymbol{x}~\mathcal{D} _t}\left( h_t\left( \boldsymbol{x} \right) =f\left( \boldsymbol{x} \right) \right) +e^{\alpha}P_{\boldsymbol{x}~\mathcal{D} _t}\left( h_t\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right) \right) \\&\xlongequal{\eta =P_{\boldsymbol{x}~\mathcal{D} _t}\left( h_t\left( \boldsymbol{x} \right) \ne f\left( \boldsymbol{x} \right) \right)}\underset{\alpha}{\mathrm{arg}\min}e^{-\alpha}\left( 1-\eta \right) +e^{\alpha}\eta\end{aligned} αt=αargmineαx:ht(x)=f(x)xef(x)Ht1(x)ef(x)Ht1(x)+eαx:ht(x)=f(x)xef(x)Ht1(x)ef(x)Ht1(x)=αargmineαx:ht(x)=f(x)Dt(x)+eαx:ht(x)=f(x)Dt(x)=αargmineαPx Dt(ht(x)=f(x))+eαPx Dt(ht(x)=f(x))η=Px Dt(ht(x)=f(x)) αargmineα(1η)+eαη

从而

α t = 1 2 ln ⁡ 1 − η η \alpha _t=\frac{1}{2}\ln \frac{1-\eta}{\eta} αt=21lnη1η

最终结果采用加权平均法集成输出

Boosting算法要求基学习器能对特定数据分布进行学习,有两种实现方式:

  • 带权学习算法:重赋权(re-weighting)——在每次迭代时根据样本分布为每个训练样本重新赋权;
  • 无权学习算法:重采样(re-sampling)——在每次迭代时根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练。

3 Python实现

3.1 算法流程

基本流程如表所示

在这里插入图片描述

3.2 核心代码

核心训练代码如下

def train(self):
    self.base = []
    self.alpha = []
    # 样本权重
    w = np.ones(self.m) / self.m
    data = self.data
    for i in range(self.T):
        # 训练个体学习器
        tree = DT(data)
        tree.generateTree(tree.calGainInfo, layer=1)
        # 计算错误率
        _, res = tree.calPredictAcc(data, tree.tree)
        epi = np.sum(w[np.squeeze(np.argwhere(res==0))])
        if epi > 0.5 or epi == 0:
            break
        # 计算分类器权重
        alpha = 0.5 * np.log((1 - epi) / epi)
        # 更新样本权重
        res[res==0] = -1
        w = w * np.exp(-alpha * res)
        w = w / sum(w)
        # 添加个体学习器
        self.base.append(tree)
        self.alpha.append(alpha)
        # 基于样本权重采样(轮盘赌算法)
        p0 = 0
        cp = []
        for j in range(self.m):
            p0 = p0 + w[j]
            cp.append(p0)
        index = [bisect_left(cp, random.random()) for _ in range(self.m)]
        data = self.data.iloc[index]

3.3 可视化

1个个体学习器的分类情况

在这里插入图片描述

3个个体学习器的分类情况

在这里插入图片描述

5个个体学习器的分类情况

在这里插入图片描述

完整代码通过下方名片联系博主获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

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

相关文章

chatgpt赋能python:Python数据处理之去除NaN值

Python 数据处理之去除 NaN 值 作为数据分析和处理领域中的一种高效工具&#xff0c;Python 在数据清理方面表现优异。而 NaN 是数据处理中常见的问题之一&#xff0c;过多的 NaN 值常常会导致分析结果不准确或无法得出结论&#xff0c;因此 Python 提供了多种方法去除 NaN 值…

chatgpt赋能python:Python反转数字的方法

Python反转数字的方法 Python作为一种高级编程语言&#xff0c;拥有着丰富的数学计算、数组处理及字符串操作等功能。在实际开发中&#xff0c;需要进行反转数字的操作时&#xff0c;Python提供了多种方法来完成此项任务。 用Python反转数字 反转数字是指将一个数字从后往前…

SQL语句之DML语言

说明&#xff1a;DML&#xff08;Data Manipulation Language&#xff09;&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。注意&#xff0c;没有查询&#xff0c;数据的查询单独拎出来成DQL&#xff08;Data Query Language&#xff0c;数据查询语言&#xff09;&…

吴恩达 ChatGPT Prompt Engineering for Developers 系列课程笔记--03 Iterative

03 Iterative 本节主要通过代码来讲解如何在迭代中找到合适的prompt。对于初学者来说&#xff0c;第一次使用Prompt不一定得到语气的结果&#xff0c;开发者可以采用下述流程进行迭代优化&#xff1a; 给出清晰、具体的指令如果结果不正确&#xff0c;分析原因调整prompt重复…

ClickHouse的join优化

概要&#xff1a; ClickHouse 最为擅长的领域是一个大宽表来进行查询&#xff0c;多表 JOIN 时Clickhouse 性能表现不佳。 CK执行模式 第一阶段&#xff0c;Coordinator 收到查询后将请求发送给对应的 worker 节点&#xff1b;第二阶段&#xff0c;Coordinator 收到各个 work…

Java内存模型和常见的内存溢出类型及解决方案

Java内存模型与常见的内存溢出 一. Java 运行过程和内存分配1 Java的平台无关性2 Java内存模型2.1Java内存模型图 3 内存结构详解3.1 元空间&#xff08;MetaSpace&#xff09;3.2 堆区&#xff08;Heap&#xff09;新生代老年代 3.3 虚拟机栈&#xff08;VM Stack&#xff09;…

Linux :: vim 编辑器:详解:光标移动定位内容,行间:快速定位至文本:开头 / 结尾;行内:词间跳跃

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 前言&#x…

Asana替代方案推荐:盘点2023年8种优质的免费和付费替代工具

Asana是一个项目管理和团队合作软件平台&#xff0c;自2008年成立以来&#xff0c;一直在彻底改变团队合作的方式。Asana以其直观的用户界面而闻名&#xff0c;是项目经理和团队领导的热门选择。然而在快节奏的项目管理世界中&#xff0c;技术发展很快。因此&#xff0c;当涉及…

chatgpt赋能python:Python取余方法介绍

Python取余方法介绍 在Python编程中&#xff0c;取余&#xff08;也称为求模运算或取模运算&#xff09;是计算机程序经常使用的一种基本算术运算。Python提供了两种方法来执行取余运算&#xff1a;使用百分号符号&#xff08;%&#xff09;和divmod()函数。 使用百分号符号&…

揭秘HTTP代理的神奇力量:让你的系统突破内网限制

大家好&#xff0c;我是你们的小米&#xff01;今天&#xff0c;我要和大家聊聊一个技术问题&#xff0c;那就是关于"http代理"的使用。昨日&#xff0c;我刚刚午休睡醒&#xff0c;项目经理杰哥叫我关注下其中一个项目的部署进展情况。而就在这时&#xff0c;客户侧…

15天学会EasyX 第2天:EasyX里的设备坐标与打开关闭绘图窗口

本文为山城瑞宝创作&#xff0c;转载请标注版权&#xff01; 本文里的函数使用都不需要先写明原型&#xff0c;原型就在其对应的库里&#xff08;直接用&#xff09; 目录 1. 设备及其坐标 2. 如何打开与关闭绘图窗口 2.1. initgraph 2.1.1. 没有flag的代码示例 2.1.2. 使用了…

会声会影2023旗舰中文试用版下载安装教程

会声会影2023版(Corel VideoStudio)是一款专业视频制作软件及视频剪辑软件,可以剪辑合并视频,制作视频,屏幕录制,光盘制作,视频后期编辑,添加特效,字幕和配音等操作,界面美观,素材丰富,操作简洁而! 会声会影有多轨道式编辑功能&#xff0c;可以独立处理视频、图片、音频等素材&…

MATLAB笔记总结(1) 东华大学MOOC

循环语句 MATLAB函数句柄 https://zhuanlan.zhihu.com/p/266263265 https://blog.csdn.net/shaozheng0503/article/details/130305984?spm1001.2014.3001.5501 数据和变量 表达式 分号;) 逗号(, ), 省略号(3个英文句点…)。 历史指令调用&#xff1a;用方向键(↑↓) 数据…

离散分类和非离散分类问题中的模型评价

离散分类问题中的模型评价 假设分类目标只有两类&#xff1a;正样本&#xff08;positive&#xff09;和负样本&#xff08;negative&#xff09;。 分类器的分类结果会出现以下四种情况&#xff1a; TP: 若一个实例为正&#xff0c;且被预测为正&#xff0c;即为“真正类”(…

chatgpt赋能python:Python去空格输出:优化您的代码和网站速度

Python去空格输出&#xff1a;优化您的代码和网站速度 Python是一种简单易用的编程语言&#xff0c;广泛用于各种应用和网站开发。然而&#xff0c;Python的代码输出&#xff08;如HTML和CSS&#xff09;中不可避免地包含了空格、制表符和换行符。这些额外的字符可能会影响网站…

模式识别算法的常见评价指标TP/FP/FN/TN,ROC,DET,EER

文章目录 TP/FP/FN/TN&#xff08;TA/FA/FR/TR&#xff09;误报率&#xff08;FAR&#xff09;漏报率&#xff08;FRR&#xff09; ROC曲线&#xff08;Receiver Operating Characteristic Curve&#xff0c;受试者特征曲线&#xff09;DET曲线&#xff08;Detection Error Tra…

Maven高级——继承与聚合——版本锁定

在前面的文章已经实现了Maven的继承&#xff0c;初次之外&#xff0c;还可以在父工程当中统一管理依赖的版本。 场景介绍 有一些依赖不是各个模块共有的&#xff0c;则需要到那些子模块当中单独配置了&#xff0c;这时需要到各个模块单独配置了&#xff0c;比如下图有一个模块…

【小沐学Python】Python实现Web服务器(CentOS+Docker下部署Flask)

&#x1f37a;基于Python的Web服务器系列相关文章编写如下&#x1f37a;&#xff1a; &#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask快速入门&#xff09;&#x1f388;&#x1f388;【Web开发】Python实现Web服务器&#xff08;Flask案例测试&#xff09;&a…

Pyside6-第五篇-单选按钮QRadioButton

今天是Pyside6的第五篇内容。一起来看单选按钮。 QRadioButton。 class QRadioButton(QAbstractButton):"""QRadioButton(self, parent: Optional[PySide6.QtWidgets.QWidget] None) -> NoneQRadioButton(self, text: str, parent: Optional[PySide6.QtWidg…

9.wxss

wxss基本满足所有css&#xff0c;并在css的基础上增加了 rpx 尺寸单位import 导入样式 目录 1 rpx 2 import 3 全局样式与局部样式 4 样式权重 1 rpx rpx(responsive pixel)&#xff0c;中文名叫响应像素&#xff0c;它是用来解决屏幕适配的尺寸单位&#xff0c;它…