[机器学习]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实现的高效解决方案,可以帮助我们快速完成这些任务。 需求概述 从配置文件…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
