[机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)
AdaBoost
AdaBoost(Adaptive Boosting)是一种Boosting算法,它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高分类性能。
AdaBoost算法的特点是它能够自适应地调整样本的权重,使那些被错误分类的样本在后续的训练中得到更多的关注。
加法模型
AdaBoost算法的最终分类器是一个加法模型,即多个弱分类器的线性组合。数学表达式如下:
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x) = \sum_{m=1}^{M} \alpha_m G_m(x) f(x)=m=1∑MαmGm(x)
其中, G m ( x ) G_m(x) Gm(x)是第m个弱分类器, α m \alpha_m αm 是第m个弱分类器的权重, M M M 是弱分类器的总数。
训练过程
-
初始化样本权重:在第一轮迭代中,所有样本的权重都相等,即每个样本的权重为 1 N \frac{1}{N} N1,其中N是样本总数。
-
训练弱分类器:在每一轮迭代中,使用当前的样本权重来训练一个弱分类器 G m ( x ) G_m(x) Gm(x)。
-
计算分类误差率:计算弱分类器 G m ( x ) G_m(x) Gm(x)在训练集上的分类误差率 ϵ m \epsilon_m ϵm,即被错误分类的样本数占总样本数的比例。
- 分类误差率范围确定: 0 < = ϵ m < = 0.5 0<=\epsilon_m<=0.5 0<=ϵm<=0.5
- 分类误差率计算公式为: ϵ m = ∑ i = 1 N w i ( m ) ⋅ I ( y i ≠ G m ( x i ) ) = ∑ y i ≠ G m ( x i ) w i ( m ) \epsilon_m ={\sum_{i=1}^{N} w_i^{(m)} \cdot \mathbb{I}(y_i \neq G_m(x_i))} = {\sum_{y_i \neq G_m(x_i)} w_i^{(m)}} ϵm=i=1∑Nwi(m)⋅I(yi=Gm(xi))=yi=Gm(xi)∑wi(m)
- I ( y i ≠ G m ( x i ) ) \mathbb{I}(y_i \neq G_m(x_i)) I(yi=Gm(xi))是一个指示函数(也称为指示变量),当样本i的真实标签 y i y_i yi 与弱分类器对样本i的预测 G m ( x i ) G_m(x_i) Gm(xi) 不相等,即样本被错误分类时,该函数的值为1;如果相等,即样本被正确分类时,该函数的值为0。
- ∑ y i ≠ G m ( x i ) w i ( m ) \sum_{y_i \neq G_m(x_i)} w_i^{(m)} ∑yi=Gm(xi)wi(m)对所有被第m个弱分类器错误分类的样本的权重进行累加。
-
计算弱分类器权重:根据分类误差率 ϵ m \epsilon_m ϵm 计算弱分类器的权重 α m \alpha_m αm。
- 分类误差率越大,权重越小;反之,分类误差率越小,权值越大。
- 权重的计算公式为:
α m = 1 2 ln ( 1 − ϵ m ϵ m ) \alpha_m = \frac{1}{2} \ln \left( \frac{1 - \epsilon_m}{\epsilon_m} \right) αm=21ln(ϵm1−ϵm)- 1 − ϵ m 1−ϵ_m 1−ϵm 是第m个弱分类器在训练集上的正确率,即被正确分类的样本数占总样本数的比例。
- 对数函数 ln ( 1 − ϵ m ϵ m ) \ln \left( \frac{1 - \epsilon_m}{\epsilon_m} \right) ln(ϵm1−ϵm) 用于计算正确率与误差率的比值的自然对数。这个比值反映了弱分类器的性能,正确率越高,误差率越低,比值越大。
-
更新样本权重:根据弱分类器的预测结果更新样本权重。对于被正确分类的样本,权重降低;对于被错误分类的样本,权重提高。将样本权重的更新视为损失函数

更新公式为:
w i ( m + 1 ) = w i ( m ) ⋅ exp ( − α m ⋅ y i ⋅ G m ( x i ) ) Z m w_{i}^{(m+1)} =\frac {w_{i}^{(m)} \cdot \exp(-\alpha_m \cdot y_i \cdot G_m(x_i)) }{Z_m} wi(m+1)=Zmwi(m)⋅exp(−αm⋅yi⋅Gm(xi))
- 其中, w i ( m ) w_{i}^{(m)} wi(m) 是第m轮中第i个样本的权重, y i y_i yi 是第i个样本的真实标签, G m ( x i ) G_m(x_i) Gm(xi) 是第m个弱分类器对第i个样本的预测结果
- Z m Z_m Zm是归一化因子,目的是把分子映射到0-1范围内。 Z m = ∑ i = 1 N w i ( m ) ⋅ exp ( − α m ⋅ y i ⋅ G m ( x i ) ) Z_m = \sum_{i = 1}^Nw_{i}^{(m)} \cdot \exp(-\alpha_m \cdot y_i \cdot G_m(x_i)) Zm=∑i=1Nwi(m)⋅exp(−αm⋅yi⋅Gm(xi))。
- 对于被正确分类的样本, y i ⋅ G m ( x i ) y_i \cdot G_m(x_i) yi⋅Gm(xi)同号,指数函数的值为 e − α m e^{-\alpha_m} e−αm 小于1,样本权重降低。
- 对于被错误分类的样本, y i ⋅ G m ( x i ) y_i \cdot G_m(x_i) yi⋅Gm(xi)异号,指数函数的值为 e α m e^{\alpha_m} eαm 大于1,样本权重提高。
- 上述公式也可以写成这样:

-
迭代:重复步骤2到6,直到达到指定的迭代次数M或总分类器的精度达到设定的阈值。
-
最终预测:在所有弱分类器训练完成后,AdaBoost算法通过加权多数表决来确定最终的分类结果。对于一个新样本x,最终的预测结果是所有弱分类器预测结果的加权和:
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x) = \sum_{m=1}^{M} \alpha_m G_m(x) f(x)=m=1∑MαmGm(x)
对于分类问题,最终的预测类别是使 f ( x ) f(x) f(x)最大化的类别。
例子
例子来源













代码实现
import numpy as np
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split# make_classification生成包含1000个样本和20个特征的模拟二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=0, random_state=42)
y = np.where(y == 0, -1, 1) # 将标签转换为-1和1# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 1. 初始化样本权重
sample_weights = np.ones_like(y_train) / len(y_train)# 设置参数
n_estimators = 50 # 弱分类器的数量
learning_rate = 1.0 # 学习率# 初始化弱分类器列表
weak_classifiers = []for m in range(n_estimators):# 2. 训练弱分类器from sklearn.tree import DecisionTreeClassifierclf = DecisionTreeClassifier(max_depth=1)clf.fit(X_train, y_train, sample_weight=sample_weights)y_pred = clf.predict(X_train)# 3. 计算分类误差率incorrect = np.sum(sample_weights * (y_train != y_pred))error_rate = incorrect / np.sum(sample_weights)# 如果误差率大于0.5,则拒绝这个分类器if error_rate > 0.5:continue# 4. 计算弱分类器权重alpha = np.log((1.0 - error_rate) / error_rate) / 2.0# 更新弱分类器列表weak_classifiers.append((clf, alpha))# 5. 更新样本权重sample_weights *= np.exp(-alpha * y_train * y_pred)sample_weights /= np.sum(sample_weights) # 归一化权重def predict(X, classifiers):votes = np.zeros((X.shape[0],))for clf, alpha in classifiers:votes += alpha * clf.predict(X)return np.sign(votes)# 7.预测
train_pred = predict(X_train, weak_classifiers)
test_pred = predict(X_test, weak_classifiers)# 计算准确率
train_accuracy = accuracy_score(y_train, train_pred)
test_accuracy = accuracy_score(y_test, test_pred)print(f"Train Accuracy: {train_accuracy:.4f}")
print(f"Test Accuracy: {test_accuracy:.4f}")
相关文章:
[机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)
AdaBoost AdaBoost(Adaptive Boosting)是一种Boosting算法,它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高分类性能。 AdaBoost算法的特点是它能够自适应地调整样本的权重,使那些被错误分类的样本在后续的训练中得到…...
深入了解Spring
目录 Spring基础 什么是Spring框架? Spring 包含的模块有哪些? Core Container AOP Data Access/Integration Spring Web Messaging Spring Test Spring,Spring MVC,Spring Boot 之间什么关系? Spring基础 什么是Spring框架? Sp…...
jar 包如何下载
maven官网:https://mvnrepository.com/ 点击搜索,找对应搜索结果点击...
ESlint代码规范,手动与自动修复
规范说明 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具 规范说明 可看到是main.js文件报错分别是第三行第30个字符,以及第七行第一个字符 后面则是规范说明,可以根据说明查找相应的规范 一.手动修正 ctrl f 可以搜索 二.自动修正 …...
利用编程获得money?
在当今数字化时代,编程技能为人们开辟了众多赚钱途径。无论你是编程新手还是经验丰富的开发者,都能在广阔的市场中找到适合自己的盈利方式。以下是一份详细的用编程赚钱指南。 一、自由职业平台 像 Upwork、Freelancer 和 Fiverr 等知名自由职业平台&am…...
设计规规范:【App 配色】
文章目录 引言I App 配色组成色彩象征 & 联想II 知识扩展设计流程图UI设计交互设计UI交互设计引言 设计规范,保持设计一致性,提高设计效率。宏观上对内统一,管理与合作变得容易。 按类型管理颜色、文本样式、图标、组件(symbol)。 蓝湖设计规范云 https://lanhuapp.co…...
react 使用 PersistGate 白屏解决方案
我在全局添加 PersistGate 组件后报错了 报错信息如下: Uncaught Error: A component suspended while responding to synchronous input. This will cause the UI to be replaced with a loading indicator. To fix, updates that suspend should be wrapped wi…...
F5中获取客户端ip地址(client ip)
当F5设备对其原始设置上的所有IP地址使用NAT时,连接到poo成员(nodes、backend servers)的出站连接将是NAT IP地址。 pool 成员(nodes、backend servers)将无法看到真实的客户端 ip地址,因为看到的是F5上的…...
Maven(生命周期、POM、模块化、聚合、依赖管理)详解
目录 Maven构建项目的生命周期 Maven的常用命令 POM 依赖管理 依赖导入 依赖范围设置 依赖版本维护 依赖传递 依赖冲突 解决依赖冲突的方法 使用maven提供的依赖调节原则 排除依赖,排除依赖的jar包 锁定版本 项目模块化 Maven项目的继承 Maven项目…...
电力场景绝缘子缺陷识别分割数据集labelme格式1099张3类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1099 标注数量(json文件个数):1099 标注类别数:3 标注类别名称:["brokenpart","brokeninsulator…...
【k8s集群应用】Kubernetes 容器编排系统
文章目录 Kubernetes 容器编排系统背景与发展Kubernetes 基本概念Kubernetes 集群架构与组件Kubernetes 核心组件Master 组件配置存储中心Node 组件 Kubernetes核心概念1. Pod2. Pod控制器3. Label与Label选择器4. Service5. Ingress6. Volume7. Name与Namespace K8S创建Pod资源…...
Unity3D仿星露谷物语开发2之工程初始化
1、依赖包安装 进入【Window -> Package Manager】 安装如下插件: 1)Cinemachine 它是一套专门控制Unity Camera的模块,适用于各种游戏场景中物体的移动变化,解决了许多关于摄像机间的复杂控制,混合,…...
Kafka篇之参数优化进而提高kafka集群性能
1. Kafka性能优化分类 Kafka集群的性能优化涉及多个方面,包括硬件资源、网络、配置文件参数等。 调优目标通常是为了提高吞吐量、减少延迟、提升稳定性和故障恢复能力。 以下是Kafka集群调优的常见策略,以及调优后的配置文件示例。 1. 硬件资源调优 C…...
关于SAP Router连接不稳定的改良
这个也是网上看来的,之前在用的时候也在想是不是建立一个长连接,就不至于断线。今天正好看到。 关于SAP Router连接不稳定的改良 我们在使用SAPRouter时经常会碰到断线,其发生原因有很多,如:网络不稳定、操作间隔时间…...
使用pygame做游戏(2):2048游戏的进一步改造,以失败告终
前言 受《Python树莓派编程从零开始》里的示例启发,我决定将上篇的2048游戏进行“面向对象化”改造。 这次除了要建立一些对象,还要能有移动效果,并能显示中文。 另外我还发现一个bug:方块放满了不代表输了,还要检查能…...
【CSS in Depth 2 精译_078】12.6 调整字间距,提升可读性 + 12.7 本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…...
泷羽sec学习打卡-brupsuite7搭建IP炮台
声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-IP炮台搭建 搭建炮台服务端安装zmap1、更新系统和安装基础依赖ÿ…...
使用Svelte构建轻量级应用详解
文章目录 前言一、为什么选择Svelte?二、快速上手Svelte三、理解Svelte的核心概念四、优化性能与用户体验五、案例研究:构建一个待办事项应用结语 前言 Svelte是一款新兴的前端框架,以其小巧的体积、高效的性能和直观的API赢得了开发者的青睐…...
Qt设置部件的阴影效果
QT中的比如QWidget,QLabel,QPushbutton,QCheckBox都可以设置阴影效果,就像这样: 以QWidget为例,开始尝试使用样式表的形式添加阴影,但没有效果,写法如下: QWidget#widget1::shadow{color: rgb…...
Python 助力 DBA:高效批量管理数据库服务器的多线程解决方案-多库查询汇总工具实现
批量数据库服务器连接测试与数据汇总:Python实现方案 作为数据库服务器运维人员,我们经常需要面对大量服务器的连接测试和数据汇总工作。本文将介绍一个使用Python实现的高效解决方案,可以帮助我们快速完成这些任务。 需求概述 从配置文件…...
为什么你的经典游戏在Windows 10/11上无法运行?DDrawCompat完美解决方案
为什么你的经典游戏在Windows 10/11上无法运行?DDrawCompat完美解决方案 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_…...
Go Context 生命周期与控制流分析
Go Context 生命周期与控制流分析 在Go语言中,Context是控制并发任务生命周期和传递请求范围数据的重要机制。它广泛应用于超时控制、取消信号传递以及跨API边界的数据共享。理解Context的生命周期及其对控制流的影响,对于编写高效、健壮的并发程序至关…...
突破传统切片限制:Excel驱动的GCode设计革命
突破传统切片限制:Excel驱动的GCode设计革命 【免费下载链接】FullControl-GCode-Designer Software for designing GCODE for 3D printing 项目地址: https://gitcode.com/gh_mirrors/fu/FullControl-GCode-Designer 在3D打印领域,GCode设计和参…...
告别乱码!Win11下Bandizip+Notepad++组合拳完美解决中文压缩包问题
告别乱码!Win11下BandizipNotepad组合拳完美解决中文压缩包问题 每次解压中文压缩包时看到满屏的"锟斤拷"和"烫烫烫",是不是瞬间血压飙升?作为开发者,我们每天要处理大量压缩文件,而编码问题就像隐…...
Automerge与区块链技术结合:构建去中心化数据协作的终极指南
Automerge与区块链技术结合:构建去中心化数据协作的终极指南 【免费下载链接】automerge A JSON-like data structure (a CRDT) that can be modified concurrently by different users, and merged again automatically. 项目地址: https://gitcode.com/gh_mirr…...
Krita AI Diffusion终极指南:从零开始掌握AI绘画插件
Krita AI Diffusion终极指南:从零开始掌握AI绘画插件 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitcode.…...
GLM-4-9B-Chat-1M镜像升级路径:从GLM-4-9B-Chat到1M版本的权重转换与验证
GLM-4-9B-Chat-1M镜像升级路径:从GLM-4-9B-Chat到1M版本的权重转换与验证 如果你正在使用GLM-4-9B-Chat模型,并且被它128K的上下文长度所吸引,那么现在有个好消息:它的“超级加强版”来了。GLM-4-9B-Chat-1M版本,直接…...
AI头像生成器效果展示:支持‘敦煌飞天纹样+半透明纱衣+暖光侧逆光’复杂提示
AI头像生成器效果展示:支持敦煌飞天纹样半透明纱衣暖光侧逆光复杂提示 当传统艺术遇见AI技术,会碰撞出怎样的视觉奇迹? 1. 惊艳开场:从想象到现实的艺术跨越 你有没有遇到过这样的困扰:心中有一个绝美的头像创意&…...
Nunchaku FLUX.1-dev部署教程:Linux系统下CUDA驱动与PyTorch匹配指南
Nunchaku FLUX.1-dev部署教程:Linux系统下CUDA驱动与PyTorch匹配指南 想用最新的Nunchaku FLUX.1-dev模型生成惊艳的AI图片,结果卡在了环境配置上?别担心,这篇教程就是为你准备的。很多朋友在部署时遇到的最大障碍,往…...
C++编程中new与delete操作符的深度解析
C编程中new与delete操作符的深度解析 在C编程的广阔天地里,内存管理是一个既基础又至关重要的环节。对于每一位C开发者而言,掌握内存的动态分配与释放是构建高效、稳定应用程序的基石。在众多内存管理工具中,new与delete操作符无疑是最为核心…...
