【漫话机器学习系列】Adaboost算法

Adaboost(Adaptive Boosting)是一种经典的集成学习方法,主要思想是通过将多个弱学习器(通常是简单模型,如决策树桩)加权组合,来提升整体模型的预测能力。Adaboost 是一种自适应的学习方法,能够不断调整弱学习器的训练过程,专注于难分类的样本,从而逐步提高分类性能。

1. 背景与基本原理

在机器学习中,弱学习器是指其分类准确率略高于随机猜测的学习器。Adaboost的目标是将多个弱学习器组合成一个强学习器,来提高分类精度。它的基本原理是:

  • 每个弱学习器会根据当前的样本权重进行训练,样本权重较大的样本对训练结果影响更大。
  • 在每一轮训练中,Adaboost 会调整样本的权重,使得上一轮分类错误的样本权重增大,上一轮分类正确的样本权重减小,从而让后续的弱学习器更加关注难以分类的样本。
  • 最终,Adaboost 会将所有弱学习器加权组合,形成一个强学习器。

2. 算法步骤

以下是 Adaboost 算法的详细步骤:

2.1 初始化

假设有 N 个训练样本,每个样本的特征为 \mathbf{x}_i​ 和标签为 y_i \in \{-1, 1\},其中 y_i = 1 代表正样本,y_i = -1 代表负样本。所有样本的初始权重设置为均等的:

w_i^{(1)} = \frac{1}{N}, \quad i = 1, 2, \dots, N

2.2 迭代训练弱学习器

Adaboost 会进行 T 次迭代(即训练 T 个弱学习器)。在每一轮 t:

  1. 训练弱学习器
    在当前样本权重的基础上训练一个弱学习器 h_t(x),其目标是最小化加权的训练误差。常用的弱学习器是决策树桩(深度为1的决策树)。

  2. 计算弱学习器的错误率
    计算当前弱学习器的加权错误率(即样本分类错误的权重总和):

    \epsilon_t = \frac{\sum_{i=1}^N w_i^{(t)} \cdot \mathbb{I}(h_t(x_i) \neq y_i)}{\sum_{i=1}^N w_i^{(t)}}

    其中,\mathbb{I}(h_t(x_i) \neq y_i)是指示函数,当 h_t(x_i) 错误时返回1,否则为0。

  3. 计算弱学习器的权重
    基于错误率 \epsilon_t,计算弱学习器 hth_tht​ 的权重 \alpha_t

    \alpha_t = \frac{1}{2} \ln\left(\frac{1 - \epsilon_t}{\epsilon_t}\right)

    该权重反映了弱学习器在最终模型中的重要性。如果弱学习器的误差很小,\alpha_t​ 会很大,反之则很小。

  4. 更新样本权重
    对每个样本 i,根据是否被当前弱学习器错误分类来调整其权重。分类错误的样本会增加权重,分类正确的样本则减少权重:

    w_i^{(t+1)} = w_i^{(t)} \cdot \exp(-\alpha_t y_i h_t(x_i))

    其中,y_i h_t(x_i) 的值为1时表示分类正确,-1时表示分类错误。然后将 w_i^{(t+1)} 归一化:

    sum_{i=1}^N w_i^{(t+1)} = 1i=1

    这样可以保持样本权重的总和不变。

2.3 强学习器的构建

最终的强学习器 H(x) 是所有弱学习器的加权组合:

H(x) = \text{sign}\left(\sum_{t=1}^T \alpha_t h_t(x)\right)

其中,\text{sign}(z) 表示符号函数,若 z \geq 0 则返回 1,否则返回 -1。

2.4 输出结果

最终的分类结果由所有弱学习器的加权输出决定。如果弱学习器的加权输出之和为正,则预测为正类(1),否则为负类(-1)。


3. 误差分析

  • 误差的上界
    Adaboost 通过加权组合弱学习器来减小整体的错误率。理论上,Adaboost 可以将训练误差降到接近于零。如果每个弱学习器的错误率都小于 0.5,且足够多的弱学习器参与训练,最终的强学习器会越来越强。

  • 对噪声敏感
    Adaboost 对噪声(错误标注的样本)比较敏感。如果训练集包含大量噪声,Adaboost 会过度关注这些噪声样本,可能导致过拟合。


4. 优缺点

优点
  • 简单易用:Adaboost 算法实现相对简单,且不需要对弱学习器的构造做特别要求。它能够显著提高弱学习器的性能。
  • 高效性:通过调整样本权重,Adaboost 可以高效地集中学习难分类的样本。
  • 减少过拟合:相较于传统的单一学习器,Adaboost 更能减小过拟合风险,尤其是在弱学习器较弱时。
缺点
  • 对噪声敏感:由于样本权重会随着分类错误的次数增加,如果数据中含有噪声,Adaboost 可能会对噪声过度拟合,导致性能下降。
  • 计算开销较大:每轮训练都需要根据样本权重来训练弱学习器,计算开销较大,特别是对于样本数非常大的数据集。

5. 应用场景

Adaboost 广泛应用于分类问题,尤其适用于:

  • 二分类问题:如文本分类、面部识别、疾病预测等。
  • 异常检测:通过提高难分类样本的权重,Adaboost 能有效地识别异常数据。
  • 特征选择:在特征较多的情况下,Adaboost 可以通过选择适合的弱学习器,逐步提升分类效果。

6. 实际应用与优化

  • 弱学习器的选择:虽然决策树桩是常见的弱学习器,但你也可以选择其他简单的模型(如 SVM、神经网络)作为弱学习器,根据任务的不同选择合适的模型。
  • 与其他方法结合:Adaboost 可以与其他集成学习方法(如 Bagging、Gradient Boosting)结合,或与其他算法结合使用,进一步提高模型的性能。

7.示例代码

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.metrics import accuracy_score# 生成示例数据
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_informative=2, n_redundant=0, random_state=42)
y = np.where(y == 0, -1, 1)  # 将标签转化为 -1 和 1class AdaBoost:def __init__(self, n_estimators=50):self.n_estimators = n_estimatorsself.models = []  # 弱学习器self.model_weights = []  # 弱学习器的权重def fit(self, X, y):n_samples, _ = X.shape# 初始化样本权重sample_weights = np.ones(n_samples) / n_samplesfor _ in range(self.n_estimators):# 初始化弱学习器(决策树桩)model = DecisionTreeClassifier(max_depth=1)model.fit(X, y, sample_weight=sample_weights)predictions = model.predict(X)# 计算误差率error = np.sum(sample_weights * (predictions != y)) / np.sum(sample_weights)# 计算弱学习器权重alpha = 0.5 * np.log((1 - error) / max(error, 1e-10))# 更新样本权重sample_weights *= np.exp(-alpha * y * predictions)sample_weights /= np.sum(sample_weights)  # 归一化# 保存弱学习器及其权重self.models.append(model)self.model_weights.append(alpha)def predict(self, X):# 强学习器的预测pred = np.zeros(X.shape[0])for model, alpha in zip(self.models, self.model_weights):pred += alpha * model.predict(X)return np.sign(pred)# 初始化并训练 Adaboost 模型
adaboost = AdaBoost(n_estimators=50)
adaboost.fit(X, y)# 进行预测并评估性能
y_pred = adaboost.predict(X)
accuracy = accuracy_score(y, y_pred)
print(f"Accuracy: {accuracy:.2f}")# 可视化结果(可选)
import matplotlib.pyplot as pltdef plot_decision_boundary(model, X, y):x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),np.arange(y_min, y_max, 0.01))Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.8)plt.scatter(X[:, 0], X[:, 1], c=y, edgecolor='k', marker='o')plt.show()plot_decision_boundary(adaboost, X, y)

 代码说明

  1. 初始化权重sample_weights 对每个样本初始化为相等的权重。
  2. 弱学习器:使用 sklearnDecisionTreeClassifier,限制深度为 1(决策树桩)。
  3. 误差和权重更新:根据 Adaboost 的公式计算误差、弱学习器权重 α\alphaα,并更新样本权重。
  4. 强学习器预测:通过对所有弱学习器的加权预测求和来得到最终分类结果。
  5. 可视化:通过绘制决策边界直观展示 Adaboost 分类结果。

输出结果

Accuracy: 1.00


8. 总结

Adaboost 是一种非常强大的集成学习方法,通过加权组合多个弱学习器,提升模型的预测能力。其基本思路是通过加权关注难以分类的样本,并通过简单的弱学习器(如决策树桩)来逐步改善分类性能。尽管 Adaboost 在大多数情况下能提供良好的分类效果,但它对噪声和离群点非常敏感,需要小心使用。

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

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

相关文章

WebStorm快捷键保持跟Idea一致

修改连续行局部多选 在WebStorm中同时按下ctrl alt s; 选择KeyMap 输入Column Selection Mode选择快捷键, 右键选择Add Mouse Shortcut 按下alt 鼠标左键 如果出现占用的情况,直接删除其他使用该快捷键的地方即可; 修改跨行局部多选 在…

图的遍历之DFS邻接矩阵法

本题要求实现一个函数,对给定的用邻接矩阵存储的无向无权图,以及一个顶点的编号v,打印以v为起点的一个深度优先搜索序列。 当搜索路径不唯一时,总是选取编号较小的邻接点。 本题保证输入的数据(顶点数量、起点的编号等…

如何解决java.lang.UnsatisfiedLinkError:org.hyperic.sigar.ProcStat.gather问题

在新装的centos7.4服务器上部署部署应用系统,应用系统系统启动报错:“java.lang.UnsatisfiedLinkError:org.hyperic.sigar.ProcStat.gather” 一、报错分析 java.lang.UnsatisfiedLinkError通常是由于Java程序无法找到、加载或链接到所需的本地库而引发的…

Qt Chart 模块化封装曲线图

一 版本说明 此文档会从头到尾演示创建初始化流程 二 完成示例 此文章包含:曲线轴设置,曲线切换,单条曲线显示,坐标轴。。。 三 曲线图UI创建 在UI界面拖放一个QWidget,然后在 Widget里面放一个 graphicsView 四 代码介绍 1 头文件 #include <QString> #includ…

【时时三省】(C语言基础)结构体内存对齐

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 我们已经掌握了结构体的基本使用了。现在我们深入讨论一个问题&#xff1a;计算结构体的大小。 这也是一个特别热门的考点&#xff1a;结构体内存对齐 示例&#xff1a; 第一个s如果根据字…

云数据库 MongoDB

MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;它与传统的关系型数据库不同&#xff0c;采用的是灵活的文档结构&#xff08;类似 JSON 格式&#xff09;。MongoDB 是开源的&#xff0c;且高度可扩展&#xff0c;通常用于处理大量的非结构化或半结构化数据。 云数据库 Mon…

第一个 JSP 程序

一个简单的 JSP 程序&#xff1a; 使用 IDEA 开发工具新建一个 maven 项目&#xff0c;具体操作如图所示&#xff1a; 配置 Tomcat 服务器 项目结构如下图所示&#xff1a; 3. 修改 index.jsp 页面的代码&#xff1a; <% page language"java" contentType&q…

项目代码第2讲:从0实现LoginController.cs,UsersController.cs、User相关的后端接口对应的前端界面

一、User 1、使用数据注解设置主键和外键 设置主键&#xff1a;在User类的U_uid属性上使用[Key]注解。 设置外键&#xff1a;在Order类中&#xff0c;创建一个表示外键的属性&#xff08;例如UserU_uid&#xff09;&#xff0c;并使用[ForeignKey]注解指定它引用User类的哪个…

【NLP 9、实践 ① 五维随机向量交叉熵多分类】

目录 五维向量交叉熵多分类 规律&#xff1a; 实现&#xff1a; 1.设计模型 2.生成数据集 3.模型测试 4.模型训练 5.对训练的模型进行验证 调用模型 你的平静&#xff0c;是你最强的力量 —— 24.12.6 五维向量交叉熵多分类 规律&#xff1a; x是一个五维(索引)向量&#xff…

01-Chromedriver下载与配置(mac)

下载地址&#xff1a; 这里我用的最后一个&#xff0c;根据自己chrome浏览器选择相应的版本号即可 ChromeDriver官网下载地址&#xff1a;https://sites.google.com/chromium.org/driver/downloads ChromeDriver官网最新版下载地址&#xff1a;https://googlechromelabs.git…

Redis(上)

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…

JS学习(1)(基本概念与作用、与HTML、CSS区别)

目录 一、JavaScript是什么&#xff1f; &#xff08;1&#xff09;基本介绍 &#xff08;2&#xff09;简称&#xff1a;JS&#xff1f; 二、JavaScript的作用。 三、HTML、CSS、JS之间的关系。 &#xff08;1&#xff09;html、css。 &#xff08;2&#xff09;JavaScript。 …

使用AI工具Screenshot to Code将UI设计图翻译成代码

一、获取openAI apikey。 一般有两种方式&#xff0c;一种是到openAI官网注册账号&#xff0c;付费申请GPT4的apikey。另一种是某宝买代理。我这里采用第二种。 二、安装Screenshot to Code 1.到github下载源码。 2.启动&#xff0c;两种方式&#xff1a;源码启动和docker启动…

ETCD的封装和测试

etcd是存储键值数据的服务器 客户端通过长连接watch实时更新数据 场景&#xff1a; 当主机A给服务器存储 name&#xff1a; 小王 主机B从服务器中查name ,得到name-小王 当主机A更改name 小李 服务器实时通知主机B name 已经被更改成小李了。 应用&#xff1a;服务注册与发…

Github 2024-12-01 开源项目月报 Top20

根据Github Trendings的统计,本月(2024-12-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目9Go项目2HTML项目1Shell项目1Jupyter Notebook项目1屏幕截图转代码应用 创建周期:114 天开发语言:TypeScript, Py…

李飞飞:Agent AI 多模态交互的前沿探索

发布于:2024 年 11 月 27 日 星期三 北京 #RAG #李飞飞 #Agent #多模态 #大模型 Agent AI在多模态交互方面展现出巨大潜力,通过整合各类技术,在游戏、机器人、医疗等领域广泛应用。如游戏中优化NPC行为,机器人领域实现多模态操作等。然而,其面临数据隐私、偏见、可解释性…

C语言期末考试——重点考点

目录 1.C语言的结构 2.三种循环结构 3.逻辑真假判断 4. printf函数 5. 强制类型转化 6. 多分支选择结构 7. 标识符的定义 8. 三目运算符 1.C语言的结构 选择结构、顺序结构、循环结构 2.三种循环结构 for、while、do-while 3.逻辑真假判断 C语言用0表示false,用非0(不…

ansible基础教程(下)

一、playbook 简介&#xff1a; playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。 通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。 使用场景&#xff1a; 像执行shell命令与写…

mid360使用cartorapher进行3d建图导航

1. 添加urdf配置文件&#xff1a; 添加IMU配置关节点和laser关节点 <!-- imu livox --> <joint name"livox_frame_joint" type"fixed"> <parent link"base_link" /> <child link"livox_frame" /> <o…

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程

聚合支付系统/官方个人免签系统/三方支付系统稳定安全高并发 附教程 系统采用FastAdmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置…