[机器学习]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=1MαmGm(x)

其中, G m ( x ) G_m(x) Gm(x)是第m个弱分类器, α m \alpha_m αm 是第m个弱分类器的权重, M M M 是弱分类器的总数。

训练过程

  1. 初始化样本权重:在第一轮迭代中,所有样本的权重都相等,即每个样本的权重为 1 N \frac{1}{N} N1,其中N是样本总数。

  2. 训练弱分类器:在每一轮迭代中,使用当前的样本权重来训练一个弱分类器 G m ( x ) G_m(x) Gm(x)

  3. 计算分类误差率:计算弱分类器 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=1Nwi(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个弱分类器错误分类的样本的权重进行累加。
  4. 计算弱分类器权重:根据分类误差率 ϵ 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) 用于计算正确率与误差率的比值的自然对数。这个比值反映了弱分类器的性能,正确率越高,误差率越低,比值越大。
  5. 更新样本权重:根据弱分类器的预测结果更新样本权重。对于被正确分类的样本,权重降低;对于被错误分类的样本,权重提高。将样本权重的更新视为损失函数
    在这里插入图片描述

更新公式为:
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(αmyiGm(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(αmyiGm(xi))
- 对于被正确分类的样本, y i ⋅ G m ( x i ) y_i \cdot G_m(x_i) yiGm(xi)同号,指数函数的值为 e − α m e^{-\alpha_m} eαm 小于1,样本权重降低。
- 对于被错误分类的样本, y i ⋅ G m ( x i ) y_i \cdot G_m(x_i) yiGm(xi)异号,指数函数的值为 e α m e^{\alpha_m} eαm 大于1,样本权重提高。
- 上述公式也可以写成这样:
在这里插入图片描述

  1. 迭代:重复步骤2到6,直到达到指定的迭代次数M或总分类器的精度达到设定的阈值。

  2. 最终预测:在所有弱分类器训练完成后,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=1Mα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}")

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

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

相关文章

PHP代码审计学习(一)--命令注入

1、漏洞原理 参数用户可控&#xff0c;程序将用户可控的恶意参数通过php可执行命令的函数中运行导致。 2、示例代码 <?php echorec-test; $command ping -c 1 .$_GET[ip]; system($command); //system函数特性 执行结果会自动打印 ?> 通过示例代码可知通过system函…

【并发容器】源码级ConcurrentHashMap详解(java78)

1. ConcurrentHashMap 为什么要使用ConcurrentHashmap 在多线程的情况下&#xff0c;使用HashMap是线程不安全的。另外可以使用Hashtable&#xff0c;其是线程安全的&#xff0c;但是Hashtable的运行效率很低&#xff0c;之所以效率低下主要是因为其实现使用了synchronized关…

Redis的基本使用命令(GET,SET,KEYS,EXISTS,DEL,EXPIRE,TTL,TYPE)

目录 SET GET KEYS EXISTS DEL EXPIRE TTL redis中的过期策略是怎么实现的&#xff08;面试&#xff09; 上文介绍reids的安装以及基本概念&#xff0c;本章节主要介绍 Redis的基本使用命令的使用 Redis 是一个基于键值对&#xff08;KEY - VALUE&#xff09;存储的…

基于SpringBoot的乡村信息服务平台的设计与实现

摘 要 乡村信息服务平台的研究背景源于当前乡村振兴战略的实施和信息化技术的快速发展。随着城乡经济差距的逐渐凸显&#xff0c;乡村信息服务平台成为一种新型的信息化手段。本系统采用Java语言&#xff0c;MySQL数据库&#xff0c;采用MVC框架, JS技术开发。乡村信息服务平…

大数据技术与应用——数据可视化(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 数据可视化 大…

【C++移动语义与完美转发】左值右值,引用,引用折叠,移动语义,万能引用与完美转发

前言 nav2系列教材&#xff0c;yolov11部署,系统迁移教程我会放到年后一起更新&#xff0c;最近年末手头事情多&#xff0c;还请大家多多谅解。本期是一个鸽了半年的教程&#xff0c;很早以前我就一直想写一篇文章有关C的移动语义&#xff0c;一直拖到现在()&#xff0c;那么今…

暂停一下,给Next.js项目配置一下ESLint(Next+tailwind项目)

前提 之前开自己的GitHub项目&#xff0c;想着不是团队项目&#xff0c;偷懒没有配置eslint&#xff0c;后面发现还是不行。eslint的存在可以帮助我们规范代码格式&#xff0c;同时 ctrl s保存立即调整代码格式是真的很爽。 除此之外&#xff0c;团队使用eslint也是好处颇多…

Hadoop学习笔记(包括hadoop3.4.0集群安装)(黑马)

Hadoop学习笔记 0-前置章节-环境准备 0.1 环境介绍 配置环境&#xff1a;hadoop-3.4.0&#xff0c;jdk-8u171-linux-x64 0.2 VMware准备Linux虚拟机 0.2.1主机名、IP、SSH免密登录 1.配置固定IP地址&#xff08;root权限&#xff09; 开启master&#xff0c;修改主机名为…

扩展SpringBoot中的SpringMVC的默认配置

SpringBoot默认已经给我们做了很多SpringMVC的配置&#xff0c;哪些配置&#xff1f; 视图解析器ViewResolver静态资料的目录默认首页index.html图标名字和图标所在目录&#xff0c;favicon.ico类型转换器Converter&#xff0c;格式转换器的Formatter消息转换器HttpMessageCon…

企业内训|阅读行业产品运营实战训练营-某运营商数字娱乐公司

近日&#xff0c;TsingtaoAI公司为某运营商旗下数字娱乐公司组织的“阅读行业产品运营实战训练营”在杭州落下帷幕。此次训练营由TsingtaoAI资深互联网产品专家程靖主持。该公司的业务骨干——来自内容、市场、业务、产品与技术等跨部门核心岗位、拥有8-10年实战经验的中坚力量…

Android Room 数据库使用详解

一、Room介绍 Android Room 是 Google 提供的一个 Android 数据持久化库&#xff0c;是 Android Jetpack 组成部分之一。它提供了一个抽象层&#xff0c;使得 SQLite 数据库的使用更为便捷。通过 Room&#xff0c;开发者可以轻松地操作数据库&#xff0c;不需要直接编写繁琐的…

IS-IS协议

IS-IS协议介绍 IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;协议是一种链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在同一个自治系统&#xff08;Autonomous System, AS&#xff09;内部的路由器之间交换路由信息。IS-I…

QoS分类和标记

https://zhuanlan.zhihu.com/p/160937314 1111111 分类和标记是识别每个数据包优先级的过程。 这是QoS控制的第一步&#xff0c;应在源主机附近完成。 分组通常通过其分组报头来分类。下图指定的规则仔细检查了数据包头 &#xff1a; 下表列出了分类标准&#xff1a; 普通二…

电机控制杂谈(23)——共模电压与轴电流

1.共模电压与轴电流的关系和危害 对于电压源换流器&#xff0c;由于功率半导体器件的快速开关和PWM调制方案&#xff0c;将在电机定子绕组的中性点&#xff08;N&#xff09;和接地点&#xff08;O&#xff09;之间产生高频共模电压&#xff08;Common-mode voltage&#xff0…

FPGA设计-使用 lspci 和 setpci 调试xilinx的PCIe 问题

目录 简介 lspci lspci-TV lspci-vvv 注意事项 lspci -vs lspci -vvvs 设置pci 识别setpci中的寄存器 setpci -s 00:01.0 d0.b42 简介 lspci 和 setpci 命令在 Linux 发行版中本身可用。该命令具有各种级别的输出&#xff0c;并提供非常有用的时间点查看 PCI 总线…

vue+node+mysql8.0,详细步骤及报错解决方案

1.下载需要安装的插件 下载express npm install express下载cors&#xff0c;用于处理接口跨域问题 npm install cors下载mysql npm install mysql 2.配置服务器 可以在vue项目的src同级创建server文件夹&#xff08;这里的位置可随意选择&#xff09; 然后依次创建&#…

并发修改导致MVCC脏写问题

并发修改导致MVCC脏写问题 一、概要 1.1 业务场景 数据库表结构设计&#xff1a; 一个主档数据&#xff0c;通过一个字段&#xff0c;逗号分隔的方式去关联其他明细信息的id。 如主档数据A&#xff0c;有3条明细数据与A关联&#xff0c;其id分别是1,2,3&#xff0c;那么其存…

SSE(Server-Sent Events)主动推送消息

说明 使用Java开发web应用&#xff0c;大多数时候我们提供的接口返回数据都是一次性完整返回。有些时候&#xff0c;我们也需要提供流式接口持续写出数据&#xff0c;以下提供一种简单的方式。 SSE&#xff08;Server-Sent Events&#xff09; SSE 是一种允许服务器单向发送事…

Java四大内部类之局部内部类、匿名内部类

目录 一、局部内部类 二、匿名内部类 基于接口的匿名内部类 基于类的匿名内部类 三、匿名内部类的实践 类的五大成员&#xff1a;属性、方法、构造器、代码块、内部类 内部类的分类 定义在外部类局部位置上&#xff08;比如说方法内&#xff09;&#xff1a; 局部内部类&…

请求go web后端接口 java安卓端播放视频

前端代码 添加gradle依赖 implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0 添加访问网络权限 <uses-permission android:name"android.permission.INTERNET" />允许http 请求请求 andro…