AdaBoost算法

news2024/9/25 11:15:37

Boosting是一种集成学习方法,AdaBoost是Boosting算法中的一种具体实现。

Boosting方法的核心思想在于将多个弱分类器组合成一个强分类器。这些弱分类器通常是简单的模型,比如决策树,它们在训练过程中的错误会被后续的弱分类器所修正。Boosting算法通过逐步增加新的弱分类器来提高整体模型的性能,每个新的弱分类器都专注于之前模型分类错误的样本。

AdaBoost(Adaptive Boosting)是Boosting算法家族中的一员,它的特点是使用了指数损失函数(exponential loss function),这种损失函数会给分类错误的样本赋予更大的权重,使得后续的弱分类器更加关注这些难以分类的样本。通过这种方式,AdaBoost能够自适应地调整每个样本的权重,从而提高模型的整体性能。除了AdaBoost,还有其他基于不同损失函数的Boosting算法,如L2Boosting和LogitBoost等。这些算法虽然在具体的实现细节上有所不同,但都遵循了Boosting方法将弱分类器组合成强分类器的基本框架。

Boosting每一个训练器重点关注前一个训练器不足的地方进行训练,通过加权投票的方式,得出预测结果。

12074e165e42446596b05c9341d2a1f1.png

Bagging 和 Boosting

Bagging 通过均匀取样的方式从原始样本集中抽取训练集,而 Boosting 使用全部样本,并在每一轮训练中根据错误率调整样例权重。这意味着 Bagging 的训练过程可以并行进行,因为它的基模型之间是独立的,而 Boosting 通常是串行进行的,因为每个模型都依赖于前一个模型的表现。

Bagging 方法中每个基模型对于最终决策的贡献是相等的,类似于民主投票制,每个模型有一票;而在 Boosting 中,每个基模型的贡献是根据其性能加权的,性能更好的模型会有更大的影响力。

AdaBoost

AdaBoost算法的核心步骤是:

  1. 权重更新:在每一轮迭代中,根据样本的分类结果来更新每个样本的权重。如果一个样本被正确分类,那么它的权重将会降低;如果一个样本被错误分类,那么它的权重将会增加。这样可以使得在后续的迭代中,分类器更加关注那些难以分类的样本。

  2. 弱分类器的选择:在每一轮迭代中,从所有的弱分类器中选择一个最佳的弱分类器。这个最佳的弱分类器是指在当前权重分布下,分类误差最小的那个弱分类器。

  3. 分类误差率较小的弱分类器的权值大,在表决中起较大作用。

AdaBoost 模型公式

faef75d595fb4150873e33cf90d62758.png 

  1. α 为模型的权重,m 为弱学习器数量。
  2. hi(x) 表示弱学习器
  3. H(x) 输出结果大于 0 则归为正类,小于 0 则归为负类。

AdaBoost 构建过程 

SampleFeature (x)Label (y)
11-1
22-1
331
441

初始化
D1​(1)=D1​(2)=D1​(3)=D1​(4)=1/4

第1轮迭代

  1. 训练一个弱分类器 ℎ1​(x),例如 h_1(x) = \sign(x - 1.5)。
  2. 计算错误率 ϵ1​,假设所有样本都被正确分类,则 ϵ1​=0。
  3. 计算权重α1​,由于epsilon1​=0,则α1​=infty。但通常我们会设置一个上限,比如α1​=0.5。
  4. 更新样本权重,由于所有样本都被正确分类,权重保持不变。

第2轮迭代

  1. 训练另一个弱分类器 ℎ2​(x),例如 h_2(x) = \sign(x - 3)。
  2. 计算错误率 ϵ2​,假设样本1和2被正确分类,样本3和4被错误分类,则ϵ2​=21​。
  3. 计算权重α2​,α2​=21​ln(21​2​)=21​ln(4)≈0.693。
  4. 更新样本权重,增加样本3和4的权重,减少样本1和2的权重。

最终分类器

  • 组合弱分类器的预测结果,形成最终的强分类器H(x)。

这个过程会根据迭代次数M 重复进行,直到达到预定的迭代次数或者满足某个停止条件(如错误率达到某个阈值)。

Demo实战 

import pandas as pd
df_wine = pd.read_csv('wine.data')

df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines',
'Proline']

df_wine = df_wine[df_wine['Class label'] != 1]

X = df_wine[['Alcohol', 'Hue']]
y = df_wine['Class label']

 划分训练集测试集

from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

le = LabelEncoder()
y = le.fit_transform(y)
# 划分训练集测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=1)
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier

tree = DecisionTreeClassifier(criterion='entropy',max_depth=1)
ada= AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1)

from sklearn.metrics import accuracy_score

tree = tree.fit(X_train,y_train)
y_train_pre = tree.predict(X_train)
y_test_pre = tree.predict(X_test)
tree_train = accuracy_score(y_train,y_train_pre)
tree_test = accuracy_score(y_test,y_test_pre)
print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test))
# 0.845/0.854


ada = ada.fit(X_train,y_train)
y_train_pre = ada.predict(X_train)
y_test_pre = ada.predict(X_test)
ada_train = accuracy_score(y_train,y_train_pre)
ada_test = accuracy_score(y_test,y_test_pre)
print('Adaboost train/test accuracies %.3f/%.3f' % (ada_train,ada_test))
# 1/0.875

 AdaBosst的决策区域比单层的决策区域更加复杂。

集成学习与单独的分类器性能比较,集成学习提高了复杂度,但在实践中,需要衡量是否愿意为适度提高预测性能付出更多的计算成本。

AdaBoost算法的总结

AdaBoost的核心思想是通过对错误分类的样本增加权重,使得后续的弱分类器更加关注这些难以分类的样本。通过加权投票的方式,将多个弱分类器的预测结果组合起来,形成一个强分类器。

  1. 初始化:为每个训练样本分配相同的权重。
  2. 迭代训练弱分类器:对于每一轮迭代,训练一个弱分类器,使其在加权训练集上的错误率最小化。
  3. 计算弱分类器权重:根据弱分类器在加权训练集上的错误率,计算其权重。错误率越低,权重越高。
  4. 更新样本权重:根据弱分类器的表现,更新样本权重。被错误分类的样本权重增加,正确分类的样本权重减少。
  5. 构建最终分类器:将所有弱分类器的预测结果按照其权重进行加权求和,形成最终的强分类器。

bb0366bb99fc4830b3d164a891213774.png

 

应用领域

AdaBoost算法广泛应用于各种机器学习任务,包括图像识别、文本分类、医学诊断等领域。

优点

  • 提高模型的性能:AdaBoost可以显著提高弱分类器的性能,使其成为一个强大的分类器。
  • 鲁棒性:AdaBoost对于过拟合具有很好的鲁棒性。
  • 灵活性:可以与各种类型的弱分类器结合使用。

缺点

  • 对噪声敏感:如果训练数据包含噪声,AdaBoost可能会给噪声样本分配较高的权重,从而影响模型的性能。
  • 长时间训练:对于大规模数据集,AdaBoost的训练时间可能会很长。 

 

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

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

相关文章

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Span组件 鸿蒙(HarmonyOS)作为Text组件的子组件&#xff0…

数模.matlab画图

一、mesh函数 上图是平常用到的方式 例题: 上图的meshgrid函数相当于上上图的前三个指令(temp,x,y) mash函数: mashc函数: mashz函数: 上图subplot函数的作用是将下标为index的图片放到对应的x&…

寒假作业-day6

简易QQ界面 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/tu/qq.png"));this->setWindowTitle("登录&qu…

第6章——深度学习入门(鱼书)

第6章 与学习相关的技巧 本章将介绍神经网络的学习中的一些重要观点,主题涉及 寻找最优权重参数的最优化方法、权重参数的初始值、超参数的设定方法 等。此外,为了应对过拟合,本章还将介绍 权值衰减、Dropout等正则化方法,并进行实…

不必为发“压岁钱”或“红包”烦恼

中国人的民俗——过年要发“压岁钱”,也称发“ 红包 ”,时间确定在除夕夜12点正。因为按照传统观念,除夕夜是阴阳交替重要时刻;发“压岁钱”,也代表着辟邪驱鬼、保佑平安。“岁”字的谐音“祟”,即灾祸&…

Page 251~254 Win32 GUI项目,第二次分析

11行,本程序要创建的窗口的窗口过程(回调函数),就是窗口用于处理消息的过程,返回值的类型是一个宏定义,即LRESULT,当操作系统分派消息给本窗口时,回调此函数,处理消息。 14行,使用全…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、ScrollBar组件 鸿蒙(HarmonyOS)滚动条组件ScrollBar&…

常见的ANSI转义码

ANSI 转义码是一组控制码,用于在文本中添加格式化和颜色。这些码以 ESC(Escape)字符为开头,通常是 \x1b,后面紧跟着一系列参数和指令。在 ANSI 标准中,这些码通常用于控制终端的文本输出。 下面是一些常见…

20240207大盘数据分析

先上图: 图1,涨跌分布 图1 涨跌数量分布 图2 各大指数涨跌分布 数据分析一下: 上证指数和深证指数是很宽的综合指数,上证指数有2162个上交所股票。深证指数有500个深交所股票。这两目前没有纳入救市范围。 比较有特点的是 上…

6个好看的wordpress模板

简站wordpress服务业通用主题 2023年立秋纪念版,简站wordpress服务行业通用主题,适合服务行业企业官网使用。 https://www.jianzhanpress.com/?p5393 小语种翻译wordpress主题 小语种国家外贸网站建设需要的wordpress主题模板,适合做小语…

使用异步命名管道通信的实例

记录一个使用异步命名管道通信的实例。代码参考了 MSDN 的文档&#xff1a;使用完成例程的命名管道服务器 - Win32 apps | Microsoft Learn。 服务端代码 #include <windows.h> #include <stdio.h> #include <tchar.h> #include <strsafe.h>#define…

相机图像质量研究(5)常见问题总结:光学结构对成像的影响--景深

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

ansible shell模块 可以用来使用shell 命令 支持管道符 shell 模块和 command 模块的区别

这里写目录标题 说明shell模块用法shell 模块和 command 模块的区别 说明 shell模块可以在远程主机上调用shell解释器运行命令&#xff0c;支持shell的各种功能&#xff0c;例如管道等 shell模块用法 ansible slave -m shell -a cat /etc/passwd | grep root # 可以使用管道…

Git中为常用指令配置别名

目录 1 前言 2 具体操作 2.1 创建.bashrc文件 2.2 添加指令 2.3 使其生效 2.4 测试 1 前言 在Git中有一些常用指令比较长&#xff0c;当我们直接输入&#xff0c;不仅费时费力&#xff0c;还容易出错。这时候&#xff0c;如果能给其取个简短的别名&#xff0c;那么事情就…

航芯ACM32G103开发板评测 08 ADC Timer外设测试

航芯ACM32G103开发板评测 08 ADC Timer外设测试 1. 软硬件平台 ACM32G103 Board开发板MDK-ARM Keil 2. 定时器Timer 在一般的MCU芯片中&#xff0c;定时器这个外设资源是非常重要的&#xff0c;一般可以分为SysTick定时器&#xff08;系统滴答定时器&#xff09;、常规定时…

如何利用IP定位技术锁定网络攻击者

在当今高度互联的数字世界中&#xff0c;网络安全威胁日益猖獗。为了维护网络空间的安全与稳定&#xff0c;追踪并锁定网络攻击者成为了关键一环。而IP定位技术&#xff0c;作为一种重要的追踪手段&#xff0c;正发挥着越来越重要的作用。 IP定位技术&#xff0c;简而言之&…

读懂 FastChat 大模型部署源码所需的异步编程基础

原文&#xff1a;读懂 FastChat 大模型部署源码所需的异步编程基础 - 知乎 目录 0. 前言 1. 同步与异步的区别 2. 协程 3. 事件循环 4. await 5. 组合协程 6. 使用 Semaphore 限制并发数 7. 运行阻塞任务 8. 异步迭代器 async for 9. 异步上下文管理器 async with …

JavaScript基础第六天

JavaScript 基础第六天 今天我们学习数组的遍历&#xff0c;以及数组的其他用法。 1. 数组遍历 1.1. 古老方法 可以使用 for 循环进行遍历。 let arr ["a", "b", "d", "g"]; for (let i 0; i < arr.length; i) {console.log…

JUnit实践教程——Java的单元测试框架

前言 大家好&#xff0c;我是chowley&#xff0c;最近在学单元测试框架——JUnit&#xff0c;写个博客记录一下&#xff01; 在软件开发中&#xff0c;单元测试是确保代码质量和稳定性的重要手段之一。JUnit作为Java领域最流行的单元测试框架&#xff0c;为开发人员提供了简单…

“bound drug/molecule”or “unbound drug/molecule”、molecule shape、sketching是什么?

“bound drug/molecule”or “unbound drug/molecule” For clarity, the following terms will be used throughout this study: “bound drug/molecule” (or “unbound drug/molecule”) refers to the drug/molecule that is bound (or unbound) to proteins [48]. 意思就是…