AdaBoost算法介绍和代码实现

news2024/11/24 4:36:00

AdaBoost算法介绍和代码实现

算法原理

AdaBoost算法的核心思想是将弱分类器组合成一个强分类器。在每一轮迭代中,AdaBoost会训练一个新的弱分类器并调整每个样本的权重,使得之前分类错误的样本在下一轮迭代中受到更多的关注。最终,AdaBoost将所有弱分类器的预测结果加权求和,得到最终的分类结果。

具体来说,AdaBoost算法的步骤如下:

  1. 初始化样本权重:给每个样本赋予相等的权重,即 w i = 1 / N w_i=1/N wi=1/N,其中 N N N是样本数量。

  2. 迭代训练基本分类器:在每个迭代中,使用当前样本权重训练一个基本分类器,并计算该分类器的误差率。误差率定义为分类错误的样本数量除以总样本数量。

  3. 计算基本分类器的权重:根据分类器的误差率计算其相应的权重,其中误差率越低的分类器获得的权重越高。具体计算公式为 w j = 1 2 ln ⁡ ( 1 − ϵ j ϵ j ) w_j=\frac{1}{2}\ln(\frac{1-\epsilon_j}{\epsilon_j}) wj=21ln(ϵj1ϵj),其中 ϵ j \epsilon_j ϵj是第 j j j个分类器的误差率。

  4. 更新样本权重:对于每个样本,如果它被正确分类,则降低其权重;如果它被错误分类,则提高其权重。具体公式为 w i ( t + 1 ) = w i ( t ) exp ⁡ ( − α t y i h t ( x i ) ) Z t w_i^{(t+1)}=\frac{w_i^{(t)}\exp(-\alpha_ty_ih_t(x_i))}{Z_t} wi(t+1)=Ztwi(t)exp(αtyiht(xi)),其中 α t \alpha_t αt是第 t t t轮迭代的分类器权重, y i y_i yi是样本 i i i的真实标签, h t ( x i ) h_t(x_i) ht(xi)是第 t t t轮迭代的分类器对样本 i i i的预测结果, Z t Z_t Zt是规范化因子,使得新的样本权重之和为1。

  5. 组合基本分类器:将所有基本分类器组合成一个强分类器,其中每个分类器的权重等于其相应的权重。

代码实现

以下是一个使用Python和scikit-learn库实现的AdaBoost算法示例:

# 导入所需的库和数据集
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载数据集
data = load_iris()
X, y = data.data, data.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化AdaBoost算法,并使用两种不同的基本分类器
base_estimators = [
    DecisionTreeClassifier(max_depth=1),  # 使用深度为1的决策树作为第一个基本分类器
    SVC(kernel='linear', C=1.0)          # 使用线性SVM作为第二个基本分类器
]
n_estimators = 50                        # 设置迭代次数为50
learning_rate = 1.0                      # 设置学习率为1.0
#使用AdaBoost算法创建分类器对象clf,estimator参数指定使用的基本分类器,这里选择使用base_estimators列表中的第一个元素,即深
#度为1的决策树
clf = AdaBoostClassifier(estimator=base_estimators[0], n_estimators=n_estimators, learning_rate=learning_rate)

# 在训练集上拟合模型
clf.fit(X_train, y_train)

# 在测试集上评估模型
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))

在以上示例中,我们首先使用load_iris函数加载鸢尾花数据集,然后将数据集分为训练集和测试集。接着,我们初始化一个AdaBoost分类器,其中基本分类器是深度为1的决策树,迭代次数为50,学习率为1.0。最后,我们在训练集上拟合模型,并在测试集上评估模型的准确性。

在AdaBoost算法中,每个基本分类器都被赋予一个权重,这个权重表示了这个基本分类器的重要性。在训练过程中,AdaBoost算法会逐步构建一个强分类器,这个强分类器是基于所有基本分类器的加权组合而成的。

在AdaBoost算法的每一轮迭代中,它会使用当前的强分类器对数据进行分类,并根据分类结果对数据进行加权,以便下一轮迭代可以更好地处理错误分类的数据。具体来说,对于每个被错误分类的样本,AdaBoost算法会增加它的权重,以便下一轮迭代可以更加关注这些错误分类的样本。而对于正确分类的样本,它们的权重会减少,以便下一轮迭代可以更加关注那些难以分类的样本。

在训练过程中,每个基本分类器的权重都是根据它在当前强分类器中的分类性能来确定的。具体来说,分类性能越好的基本分类器,其权重就越大,反之亦然。在每一轮迭代结束后,AdaBoost算法会计算当前强分类器的错误率,并根据错误率来为下一轮迭代中的基本分类器分配权重。

最终,当达到指定的迭代次数或错误率满足要求时,AdaBoost算法会返回一个强分类器,这个强分类器是所有基本分类器的加权组合。这个强分类器可以用于对新样本进行分类,从而实现对未知数据的预测。

调整超参数

可以使用以下代码调整超参数并绘制学习曲线:

import matplotlib.pyplot as plt

# 调整迭代次数
n_estimators_range = range(1, 101, 10)
train_scores = []
test_scores = []
for n_estimators in n_estimators_range:
    clf = AdaBoostClassifier(estimator=base_estimators[0], n_estimators=n_estimators, learning_rate=learning_rate)
    clf.fit(X_train, y_train)
    train_scores.append(clf.score(X_train, y_train))
    test_scores.append(clf.score(X_test, y_test))
plt.plot(n_estimators_range, train_scores, label="Train")
plt.plot(n_estimators_range, test_scores, label="Test")
plt.xlabel("n_estimators")
plt.ylabel("Accuracy")
plt.legend()
plt.show()

# 调整学习率
learning_rate_range = [0.1, 0.5, 1, 2, 5]
train_scores = []
test_scores = []
for learning_rate in learning_rate_range:
    clf = AdaBoostClassifier(estimator=base_estimators[0], n_estimators=n_estimators, learning_rate=learning_rate)
    clf.fit(X_train, y_train)
    train_scores.append(clf.score(X_train, y_train))
    test_scores.append(clf.score(X_test, y_test))
plt.plot(learning_rate_range, train_scores, label="Train")
plt.plot(learning_rate_range, test_scores, label="Test")
plt.xlabel("learning_rate")
plt.ylabel("Accuracy")
plt.legend()
plt.show()

请添加图片描述
请添加图片描述

在这里,我们分别调整了迭代次数和学习率两个超参数,并绘制了对应的学习曲线。从学习曲线可以看出,随着迭代次数的增加,模型的准确性逐渐提高,但在达到一定程度后就趋于稳定。同时,随着学习率的增加,模型的准确性会先上升后下降,因此需要进行适当的调参。需要注意的是,实际应用中还可以调整其他超参数,例如基本分类器的深度、支持向量机的核函数等,以获得更好的性能。

总结

总之,AdaBoost算法是一种强大的集成学习方法,可以将多个弱分类器组合成一个强分类器,从而提高模型的准确性和泛化能力。在实际应用中,我们可以根据具体问题选择不同的基本分类器和调整不同的超参数,以获得最佳的性能。

需要注意的是,AdaBoost算法对基本分类器的要求比较宽松,可以使用任何分类器作为基本分类器,例如决策树、支持向量机等。同时,调整迭代次数和学习率等超参数也会对模型性能产生影响,需要进行适当的调参。

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

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

相关文章

认识监听器(Listener)

监听器是什么? 监听器(Listener)是一种运行在后台的程序,它主要用于监控某些事件在系统中的发生,并且根据这些事件做一些特定的处理。在Web应用程序中,监听器可以观察ServletContext、HttpSession以及Serv…

PostgreSQL-数值类型

数值类型是最常用的几种数据类型之一,主要分为: 整型浮点型精确小数 数值类型介绍 数值类型列表 类型名称存储空间描述范围smallint2字节小范围的整数。Oracle中没有此数值类型,使用number代替-2^15 ~ 2^15-1int 或 integer4字节常用的整数…

日常开发为什么需要做Code Review

日常开发为什么需要做Code Review 一、背景 最近在开始一个新的项目,在查看项目中代码及具体细节时,发现这个项目真实一堆乱麻,没有规律可循,可总结下这个项目的缺陷 没有规律可循,没有结构性设计不做公共封装&#…

08_Uboot顶层Makefile分析_make过程

目录 make 过程 make 过程 配置好 uboot 以后就可以直接make 编译了,因为没有指明目标,所以会使用默认目标,主 Makefile 中的默认目标如下: 目标_all 又依赖于all,如下所示: 如果KBUILD_EXTMOD为空的话_all 依 赖 于all 。这 里 不 编 译 模 块,所 以KBUILD_EXTMOD肯定为空,_…

二分分类.

2.1 二分分类 在神经网络的计算中,通常先有一个叫做前向暂停(forward pause)或叫做前向传 播(foward propagation)的步骤,接着有一个叫做反向暂停(backward pause) 或叫做反向传播 (backward propagation)的步骤。 一张图片在计算机中是如何表示的&…

4。计算机组成原理(1)数据表示和运算

嵌入式软件开发,非科班专业必须掌握的基本计算机知识 核心知识点:数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 一 进位计数法和不同进制数的相互转换 其他进制(b),转十进制的计算公式 十进制数,转…

Linux系统编程——多线程[上]:线程概念和线程控制

目录 1.再谈页表 2.Linux线程概念 2.1pthread原生库的基本使用 2.2PID和LWP 2.3Linux线程的资源以及优缺点 2.4Linux线程健壮性问题 2.5可重入函数和线程独立栈 3.Linux线程控制 3.1Linux线程终止 3.2Linux线程等待 3.3线程取消 3.4线程分离 使用线程库的注意事项…

【Python入门】Python基础语法

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

净利润同比增长48.9%,中国平安“一览众山小”

中国平安价值迸发的速度,或许超过了所有人的想象。 4月26日晚,中国平安发布2023年一季度业绩报告,许多自媒体用“炸裂”来形容其亮眼的财务数据。财报显示,第一季度,集团实现营收2537.78亿元,同比增长30.8…

农机电招平台~java

摘要 随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业,并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单,变…

LeetCode:383. 赎金信

🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题解目录 一、🌱[383. 赎金信](https://leetcode.cn/problems/ransom-note/)…

DOM概述

DOM概述 什么是DOM对象树化的DOM模型DOM 节点 如何获取DOM元素如何更改我们的DOM模型常用属性修改控制样式属性 事件事件监听 事件类型鼠标事件键盘事件焦点事件文本框输入事件 事件对象回调函数DOM 节点插入节点插入节点删除节点查找节点父子关系兄弟关系 什么是DOM 当网页被…

SPSS如何进行因子分析和主成分分析之案例实训?

文章目录 0.引言1.因子分析2.主成分分析 0.引言 因科研等多场景需要进行绘图处理,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对因子分析和主成分分析进行阐述。 1.因子分…

Android:LeakCanary原理的简单理解和使用

LeakCanary原理的简单理解和使用 1、背景2、LeakCanary2.1、LeakCanary 工作原理2.1.1、检测未被 GC 回收的对象2.1.2、转储堆2.1.3、分析堆2.1.4、对泄漏进行分类 2.2、LeakCanary 使用2.2.1、引入依赖2.2.1.1、原理 2.2.2、配置 LeakCanary2.2.3、检测内存泄漏 3、Fragment 和…

Hystrix断路器 (豪猪)-保险丝

一、概述 重点:能让服务的调用方,够快的知道被调方挂了!不至于说让用户在等待。 Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)。 雪崩&am…

自动驾驶行业观察之2023上海车展-----车企发展趋势(2)

自主品牌发展 比亚迪:展示3款新车,均于2023年年内上市 比亚迪在本次展会上推出了3款新车:宋L概念车(王朝系列)、驱逐舰07(海洋系列)、海鸥(海洋系列)。 • 宋L&#x…

FreeRTOS:任务的创建和删除

目录 一、函数xTaskCreate二、函数xTaskCreateStatic三、函数xTaskCreateRestricted四、函数vTaskDelete五、任务创建和删除(动态)代码5.1实验要求5.2程序代码 一、函数xTaskCreate 此函数用来创建一个任务,任务需要RAM来保存与任务有关的状…

Mysql数据库基本操作(增删改查)

目录 一、数据库的基本操作1.1 登录数据库1.2 创建数据库并进入数据库 二、查看数据库结构2.1 查看数据库信息2.2 查看数据库中包含的表及表结构2.3、常用的数据库类型 三、Mysql数据文件3.1 MYD文件3.2 MYI文件3.3 MyISAM存储引擎 四、SQL 语句1、 DDL数据定义语言1.1 删除指定…

〖Python网络爬虫实战㉒〗- 数据存储之数据库详解

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…

Eureka、Zookeeper、Consul服务注册与发现

一、Eureka服务注册与发现 1.1 概念 Eureka 是 Netflix 公司开源的一个服务注册与发现的组件 。 Eureka 和其他 Netflix 公司的服务组件(例如负载均衡、熔断器、网关等) 一起,被 Spring Cloud 社区整合为Spring-Cloud-Netflix 模块。 Eure…