AdaBoost提升分类器性能

目录

AdaBoost算法原理

AdaBoost工作详情

初始权重分配

第一轮

第二轮

后续轮次

最终模型

AdaBoost的API解释

AdaBoost 对房价进行预测

AdaBoost 与决策树模型的比较

结论


AdaBoost算法原理

在数据挖掘中,分类算法可以说是核心算法,其中 AdaBoost算法与随机森林算法一样都属于分类算法中的集成算法.

集成的含义就是集思广益,博取众长,当我们做决定的时候,我们先听取多个专家的意见,再做决定。集成算法通常有两种方式,分别是投票选举(bagging)和再学习(boosting)。 投票选举的场景类似把专家召集到一个会议桌前,当做一个决定的时候,让 K 个专家(K 个模 型)分别进行分类,然后选择出现次数最多的那个类作为最终的分类结果。再学习相当于把 K 个专家(K 个分类器)进行加权融合,形成一个新的超级专家(强分类器),让这个超级专家 做判断.

 Boosting 算法的原理

AdaBoost 的关键在于它会给训练数据中的每个样本分配一个权重,并在每一轮迭代中调整这些权重。错误分类的样本在下一轮迭代中会得到更高的权重,从而使弱分类器集中注意力于难以分类的样本。以下是一个具体的示例来解释 AdaBoost 算法的原理:

AdaBoost工作详情

假设我们有一个简单的二分类问题,训练数据集包含5个样本:{x1, x2, x3, x4, x5},它们的真实标签分别为 {1, -1, 1, 1, -1}

初始权重分配

首先,每个样本都被赋予相同的权重,即 1/5

第一轮

  1. 训练第一个弱分类器:例如,一个简单的决策树。
  2. 计算错误率:弱分类器在加权训练数据上的错误率。例如,假设它错误地分类了样本 x2x5
  3. 更新样本权重:增加被错误分类的样本的权重,减少正确分类的样本的权重。例如,x2x5 的权重增加,而其余样本的权重减少。
  4. 计算分类器权重:基于错误率计算分类器权重,错误率越低的分类器在最终模型中的权重越高。
分类器权重的计算公式

第二轮

  1. 训练第二个弱分类器:使用更新后的样本权重。
  2. 重复计算错误率、更新样本权重和分类器权重的过程。

后续轮次

重复以上步骤,直到达到预定的迭代次数,或者达到某个性能阈值。

最终模型

最终的 AdaBoost 模型是所有弱分类器的加权组合,其中每个弱分类器的贡献由其权重决定。这样,模型在预测新数据时,会考虑所有弱分类器的预测并加权得到最终结果。

AdaBoost的API解释

AdaBoostClassifier(base_estimator=None, n_estimators=50, learning_rate=1.0, algorithm=’SAMME.R’, random_state=None)

这个函数,其中有几 个比较主要的参数,我分别来讲解下:

1. base_estimator:代表的是弱分类器。在 AdaBoost 的分类器和回归器中都有这个参数, 在 AdaBoost 中默认使用的是决策树,一般我们不需要修改这个参数,当然你也可以指定 具体的分类器。

2.   n_estimators:算法的最大迭代次数,也是分类器的个数,每一次迭代都会引入一个新的 弱分类器来增加原有的分类器的组合能力。默认是 50。

3.   learning_rate:代表学习率,取值在 0-1 之间,默认是 1.0。如果学习率较小,就需要比 较多的迭代次数才能收敛,也就是说学习率和迭代次数是有相关性的。当你调整 learning_rate 的时候,往往也需要调整 n_estimators 这个参数。

4.   algorithm:代表我们要采用哪种 boosting 算法,一共有两种选择:SAMME 和 SAMME.R。默认是 SAMME.R。这两者之间的区别在于对弱分类权重的计算方式不同。

5.   random_state:代表随机数种子的设置,默认是 None。随机种子是用来控制随机模式 的,当随机种子取了一个值,也就确定了一种随机规则,其他人取这个值可以得到同样的结果。如果不设置随机种子,每次得到的随机数也就不同

AdaBoost 对房价进行预测

了解了 AdaBoost 工具包之后,我们看下 sklearn 中自带的波士顿房价数据集。这个数据集一共包括了 506 条房屋信息数据,每一条数据都包括了 13 个指标,以及一个房屋 价位。13 个指标的含义,可以参考下面的表格

这些指标分析得还是挺细的,但实际上,我们不用关心具体的含义,要做的就是如何通过这 13 个指标推导出最终的房价结果。
 
首先加载数据,将数据分割成训练集和测试集,然后创建 AdaBoost 回归模型,传入训练集 数据进行拟合,再传入测试集数据进行预测,就可以得到预测结果。最后将预测的结果与实际 结果进行对比,得到两者之间的误差。具体代码如下:

from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error from sklearn.datasets import load_boston
from sklearn.ensemble import AdaBoostRegressor
# 加载数据
data=load_boston()
# 分割数据
train_x, test_x, train_y, test_y = train_test_split(data.data, data.target, test_size=0.25, random_state=33)
# 使用AdaBoost回归模型
regressor=AdaBoostRegressor()

regressor.fit(train_x,train_y) 12 
pred_y = regressor.predict(test_x)

mse = mean_squared_error(test_y, pred_y)
print("房价预测结果  ", pred_y) 15 
print("均方误差  = ",round(mse,2))


运行结果

同样,我们可以使用不同的回归分析模型分析这个数据集,比如使用决策树回归和 KNN 回归。
编写代码如下:

# 使用决策树回归模型
dec_regressor=DecisionTreeRegressor() dec_regressor.fit(train_x,train_y) 
pred_y = dec_regressor.predict(test_x) mse = mean_squared_error(test_y, pred_y)
print("决策树均方误差 = ",round(mse,2))

# 使用KNN回归模型
knn_regressor=KNeighborsRegressor()
knn_regressor.fit(train_x,train_y) 
pred_y = knn_regressor.predict(test_x) 
mse = mean_squared_error(test_y, pred_y)
print("KNN均方误差  = ",round(mse,2))
运行结果

你能看到相比之下,AdaBoost 的均方误差更小,也就是结果更优。虽然 AdaBoost 使用了弱 分类器,但是通过 50 个甚至更多的弱分类器组合起来而形成的强分类器,在很多情况下结果 都优于其他算法。因此 AdaBoost 也是常用的分类和回归算法之一 

AdaBoost 与决策树模型的比较

在 sklearn 中 AdaBoost 默认采用的是决策树模型,我们可以随机生成一些数据,然后对比 下 AdaBoost 中的弱分类器(也就是决策树弱分类器)、决策树分类器和 AdaBoost 模型在 分类准确率上的表现。

如果想要随机生成数据,我们可以使用 sklearn 中的 make_hastie_10_2 函数生成二分类数 据。假设我们生成 12000 个数据,取前 2000 个作为测试集,其余作为训练集。有了数据和训练模型后,我们就可以编写代码。我设置了 AdaBoost 的迭代次数为 200,代 表 AdaBoost 由 200 个弱分类器组成。针对训练集,我们用三种模型分别进行训练,然后用测试集进行预测,并将三个分类器的错误率进行可视化对比,可以看到这三者之间的区别:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.metrics import zero_one_loss
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import  AdaBoostClassifier
# 设置AdaBoost迭代次数
n_estimators=200
# 使用
X,y=datasets.make_hastie_10_2(n_samples=12000,random_state=1)
# 从12000个数据中取前2000行作为测试集,其余作为训练集
train_x, train_y = X[2000:],y[2000:]
test_x, test_y = X[:2000],y[:2000]
# 弱分类器
dt_stump = DecisionTreeClassifier(max_depth=1,min_samples_leaf=1)
dt_stump.fit(train_x, train_y)
dt_stump_err = 1.0-dt_stump.score(test_x, test_y)
# 决策树分类器
dt = DecisionTreeClassifier()
dt.fit(train_x,  train_y)
dt_err = 1.0-dt.score(test_x, test_y)
# AdaBoost分类器
ada = AdaBoostClassifier(base_estimator=dt_stump,n_estimators=n_estimators)
ada.fit(train_x,  train_y)
# 三个分类器的错误率可视化
fig = plt.figure()
# 设置plt正确显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
ax = fig.add_subplot(111)
ax.plot([1,n_estimators],[dt_stump_err]*2, 'k-', label=u'决策树弱分类器 错误率')
ax.plot([1,n_estimators],[dt_err]*2,'k--', label=u'决策树模型 错误率')
ada_err = np.zeros((n_estimators,))
# 遍历每次迭代的结果 i为迭代次数, pred_y为预测结果
for i,pred_y in enumerate(ada.staged_predict(test_x)):
     # 统计错误率
    ada_err[i]=zero_one_loss(pred_y, test_y)
# 绘制每次迭代的AdaBoost错误率
ax.plot(np.arange(n_estimators)+1, ada_err, label='AdaBoost Test 错误率', color='orange')
ax.set_xlabel('迭代次数')
ax.set_ylabel('错误率')
leg=ax.legend(loc='upper right',fancybox=True)
plt.show()
运行结果

从图中你能看出来,弱分类器的错误率最高,只比随机分类结果略好,准确率稍微大于 50%。决策树模型的错误率明显要低很多。而 AdaBoost 模型在迭代次数超过 25 次之后,错 误率有了明显下降,经过 125 次迭代之后错误率的变化形势趋于平缓。

因此我们能看出,虽然单独的一个决策树弱分类器效果不好,但是多个决策树弱分类器组合起来形成的AdaBoost 分类器,分类效果要好于决策树模型。

结论

AdaBoost 算法有效地集中于那些难以正确分类的样本,逐渐调整分类器以解决这些难题。这使得 AdaBoost 成为一种强大的集成方法,尤其适用于处理复杂的分类问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??

如果我想让gpt从pdf文档中提取相关关键词的内容,可以怎么做呢??我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题,ChatGPT都能为您提供实用且高质量的建议和指导&am…

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统,每秒处理的数据量高达数百万,而机器模型一般比较笨重,虽然功能强大,但是qps一般都比较低,日常工作中,我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…

9.Docker的虚悬镜像-Dangling Image

1.虚悬镜像的概念 虚悬镜像 (Dangling Image) 指的是仓库名 (镜像名) 和标签 TAG 都是 的镜像。 2.构建本地虚悬镜像 这里我以unbuntu为例来说明。 2.1 编写Dockerfile文件 FROM ubuntu:22.042.2 根据Dockerfile文件构建虚悬镜像 docker build .上面这段命令&#xff0c…

C#开发的OpenRA游戏之属性RenderSprites(8)

C#开发的OpenRA游戏之属性RenderSprites(8) 本文开始学习RenderSprites属性,这个属性是跟渲染有关的,因此它就摄及颜色相关的内容,所以我们先来学习一下调色板,这是旧游戏的图片文件保存的格式,如果放在现代来看,不会再采用这种方法,毕竟现在存储空间变大,便宜了,并…

做流体分析需要知道的两大核心问题:内流和外流

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件,可以快速轻松的分析产品内部或外部流体的流动情况,以用来改善产品性能和功能。SOLIDWORKS Flow Simulation将专业的流体分析进行功能优化,让普通机械设计师也能进行流体力学分析…

【Linux系统编程二十】:(进程通信2)--命名管道/共享内存

【Linux系统编程二十】:命名管道/共享内存 一.命名管道1.创建管道2.打开管道3.进行通信(server/client) 二.共享内存1.实现原理2.申请内存3.挂接4.通信5.去关联6.释放共享内存7.特性: 一.命名管道 上一篇介绍的一个管道是没有名字的 因为你打开那个文件…

在Python中调用imageJ开发

文章目录 一、在ImageJ中进行Python开发二、在Python中调用imageJ开发2.1、简介2.2、环境配置2.3、测试一2.4、测试二 Python imageJ 解决方案,采坑记录 一、在ImageJ中进行Python开发 原生ImageJ仅支持JS脚本(JAVAScript),而Im…

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

Stm32l071原理图: PA11与PA12连接着UNL2803 ULN2803是一种集成电路芯片,通常被用作高电压和高电流负载的驱动器。 ULN2803是一个达林顿阵列,当输入引脚(IN1至IN8)被连接到正电源时,相应的输出引脚&#xff…

大数据-计算框架选型与对比

计算框架选型与对比 一、大数据平台二、计算框架分类1.批处理架构2.实时流处理架构3.流批一体处理架构 三、计算框架关键指标1.处理模式2.可伸缩性3.消息传递3.1 至少一次(at least once)3.2 至多一次(ai most once)3.3 恰好一次&…

Redis报错:JedisConnectionException: Could not get a resource from the pool

1、问题描述: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 2、简要分析: redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 r…

【git】使用ssh

前言 git之前一直使用https,因为很方便随时随地都可以用。最近把代码托管到GitHub,使用https就使用不了。后面听同事说GitHub使用ssh是没问题的,就想着尝试一下。 git ssh配置 设置用户名和邮箱 git config --global use.name username g…

FFmpeg常用命令讲解及实战二

文章目录 前言一、ffmpeg 常用命令1、ffmpeg 的封装转换2、ffmpeg 的编转码3、ffmpeg 的基本编转码原理 二、ffprobe 常用参数1、show_format2、show_frames3、show_streams4、print_format5、select_streams 三、ffplay 的常用命令1、ffplay 常用参数2、ffplay 高级参数3、ffp…

教你看现货黄金实时报价

现货黄金投资市场上的交易软件众多,很多人不知道选择什么软件好,但选择主流软件MT4,基本就可以满足投资者不同的需求。本文为大家讲讲,为什么有那么多的投资者,都选择通过MT4获取实时的行情报价。 现货黄金市场波动激烈…

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫(Web Crawler)是一种自动化的网页浏览程序,能够根据一定的规则和算法,从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术,它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

【MySQL】子查询

文章目录 子查询IN运算符子查询 VS 连接ALL关键字ANY关键字相关子查询 !EXISTS运算符select子句中的子查询from子句中的子查询 子查询 获取价格大于id为3的货物的商品 用到了内查询,获取id为3的商品的单价,把结构传给外查询 在where子句中编写子查询&am…

导数、方向导数、梯度方向、梯度

导数:自变量改变一定量时(大于或小于0),因变量改变多少 方向导数:限定在某一个方向上,自变量改变一定量时(大于0),因变量改变多少 梯度方向:方向导数最大的…

Java实现王者荣耀小游戏

主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…

2023年最新PyCharm环境搭建教程(含Python下载安装)

文章目录 写在前面PythonPython简介Python生态圈Python下载安装 PyCharmPyCharm简介PyCharm下载安装PyCharm环境搭建 写在后面 写在前面 最近博主收到了好多小伙伴的吐槽称不会下载安装python,博主听到后非常的扎心,经过博主几天的熬夜加班,…

网络安全如何自学?

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

Nginx环境搭建:安装与卸载

目录 一、卸载 二、安装 注:如果直接使用yum安装nginx,则默认安装路径为:/usr/share/nginx/ 下面这种方式我们是指定了安装目录 一、卸载 因为我之前的虚拟机上面已经有了nginx服务,所以这里可以先介绍一下nginx的卸载方法&a…