使用AdaBoost分类方法实现对Wine数据集分类

目录

  • 1. 作者介绍
  • 2. 什么是AdaBoost?
  • 2.1 什么是弱分类器
    • 2.2 什么是强分类器
    • 2.3 如何自适应增强
    • 2.4 如何组合弱分类器成为一个强分类器?
  • 3. 什么是Wine数据集
    • 3.1 Wine 数据集
    • 3.2 Wine 数据集结构
  • 4. 使用AdaBoost分类方法实现对Wine数据集分类
  • 5. 完整代码

1. 作者介绍

赵俊旗,男,西安工程大学电子信息学院,2023级研究生
研究方向:水下目标检测与信号处理
电子邮件:2230648022@qq.com

徐达,男,西安工程大学电子信息学院,2023级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1374455905@qq.com

2. 什么是AdaBoost?

AdaBoost (Adaptive Boosting-自适应增强), AdaBoost通过组合多个弱分类器(那些比随机猜测略好的分类器)来构建一个强分类器。
这短短一句话读完就会发现信息量挺大的,什么是弱分类器?什么是强分类器?是如何进行自适应增强的?以及怎么组合成一个强分类器的?把这四个问题搞懂,可能就会更容易理解AdaBoost.

2.1 什么是弱分类器

弱分类器是指分类准确率在 60% 到 80% 之间的分类器,即比随机预测略好,但准确率不高。比如一个二分类问题,随机猜测进行分类的正确率都有50%,所以弱分类器比随即猜测略好一些。
弱分类器的常用类型包括:决策树桩、K近邻分类器、朴素贝叶斯分类器等。
如决策树桩:
在这里插入图片描述

2.2 什么是强分类器

强分类器是指分类准确率在 90% 以上的分类器。

2.3 如何自适应增强

这是理解Adaboost的一个重点!其核心思想是关注那些被前一轮弱分类器错误分类的样本,通过逐步调整样本的权重,使后续的弱分类器更注重这些困难样本,从而提高整体分类器的准确性。
抽象的概念不容易理解? 举个例子:
有一个简单的分类任务,将5个颜色分别为红色(标签+1)和蓝色(标签-1)的圆点分开,使用3个决策树桩作为弱分类器。
STEP1:使用第一个弱分类器h1(即使用第1个决策树)
(1)初始化样本权重(使所有样本权重相等),因为共5个圆点,所以共5个样本,每个样本的权重为wi =1/5。
(2)计算第一个弱分类器的错误率ϵ1和权重α1
①计算第一个弱分类器错误率ϵ1:
在这里插入图片描述
其中wi为样本权重(即上述的1/5), I(yi≠hi(xi))为指示函数, hi(xi)为弱分类器的预测, yi为真实值,指示函数在这里的意义是当预测与真实值相等时,指示函数为0;当预测与真实值不相等时,指示函数为1,所以在这里就相当于增加了错误样本的权重,对应上述“更注重分类错误的样本”。
如我们这5个样本里有两个被分类错误,分别是第1个和第3个,则错误率ϵ1计算为:
在这里插入图片描述
②计算第一个弱分类器的权重α1
在这里插入图片描述
其中ϵt为第①步计算出来的错误率。可以根据表达式看到,错误率越大,此弱分类器的权重越小,此弱分类器在所有的3个弱分类器的话语权也就越低。反之,错误率越小,其权重越大,此弱分类器在所有的3个弱分类器的话语权也就越高。
所以第一个弱分类器的权重α1计算为:
在这里插入图片描述
(3)更新样本权重
在这里插入图片描述
根据初始样本权重wi和计算出来的第一个弱分类器的权重α1以及其是否被真实预测可得到新的样本权重。其中若被真实预测, yiht(xi)的值为11或(-1)(-1)均为1,若没有被真实预测,则yiht(xi)的值为1*(-1)或(-1)*1均为-1,可以根据表达式观察到,当其没有被真实预测时,其下一次的权重将会增大。
所以经过第一个弱分类器得到新的样本权重为:
在这里插入图片描述
可以看到,在第1个和第3个样本被错误分类时,其样本的权重会增大,回扣AdaBoost核心思想里“更注重分类错误的样本”。
现在经过第一个分类器后,可以得到其样本新的权重 和第1个弱分类器的权重α1。
STEP2: 使用第二个弱分类器h2(即使用第2个决策树),此时不再使所有样本权重相等,而是使用经第一个弱分类器更新完成的新的权重wi(2),计算第2个弱分类器的错误率ϵ2从而得到权重α2,进而可以得到一个更新的样本权重wi(3)(即重复STEP1)。
STEP3:使用第三个弱分类器h3(即使用第3个决策树),此时使用经第二个弱分类器更新完成的更新的权重wi(3),计算第3个弱分类器的错误率ϵ3从而得到权重α3,进而可以得到一个最新的样本权重wi(4)(即重复STEP1)。
好了,现在得到了三个弱分类器的权重,是时候要将他们组合在一起了。

2.4 如何组合弱分类器成为一个强分类器?

强分类器𝐻(𝑥)的预测结果通过弱分类器加权投票决定。
现在有三个弱分类器 h1,h2,h3 及其对应的权重 α1,α2,α3,每个弱分类器会对输入样本进行分类,得到的结果是要么是+1要么是-1(即二分类任务中的类别标签)。
现在有一个输入样本x,
1.弱分类器1(h1)对输入样本x的预测是 -1,权重α1 = 0.2027
2.弱分类器2(h2)对输入样本x的预测是 +1,权重α2= 0.5
3.弱分类器3(h3)对输入样本x的预测是 +1,权重α3 =0.8
组合最终的强分类器
强分类器 𝐻(𝑥)的预测结果通过加权投票决定:
在这里插入图片描述
其中sign(x)为符号函数,当x大于0时值为+1,x小于0时值为-1。所以加权投票组成强分类器分类结果为:
在这里插入图片描述
至此我们更能清晰地理解何为AdaBoost自适应增强。
注意:一般的AdaBoost自适应增强需要多个弱分类器才能达到最好的效果,此处为了简便理解,选择3个弱分类器;同时要注意理解样本的权重和弱分类器的权重,样本权重是为了下一个弱分类器更关注上一个分类错误的样本,弱分类器的权重是为了看出其在构建强分类器时话语权的强弱。
AdaBoost的部分优点如下:
简单且灵活:AdaBoost可以与任何弱分类器一起使用,且易于实现。
无需调整参数:AdaBoost对弱分类器的选择和参数设定相对不敏感。
自动聚焦难分类样本:通过动态调整样本权重,AdaBoost使后续的分类器更关注难分类的样本。
AdaBoost的部分缺点如下:
对噪声敏感:因为错误分类的样本权重会增加,数据集中存在的噪声点可能会导致模型过拟合。
需要多个弱分类器:AdaBoost的性能依赖于多个弱分类器的结合,单个弱分类器的性能不能太差。

3. 什么是Wine数据集

Wine 数据集是一个经典的机器学习数据集,用于多分类任务。该数据集包含来自意大利同一地区的三种不同类型的葡萄酒的化学分析结果。每种葡萄酒的特征和类别标签都已标注,用于分类模型的训练和评估。

3.1 Wine 数据集

在这里插入图片描述

3.2 Wine 数据集结构

在python的scikit-learn 库中,Wine 数据集可以直接通过 load_wine 函数加载,其中alcohol, malic_acid, ash,等是特征列,target 是目标变量,表示红酒的类别。
导入并查看前5行数据(以图片展示,完整程序附后):
在这里插入图片描述
其数据集结构为:
在这里插入图片描述

4. 使用AdaBoost分类方法实现对Wine数据集分类

(1)首先pip安装scikit-learn 和 pandas 库

pip install scikit-learn pandas

(2) 加载并预处理数据集
• 使用 scikit-learn 自带的 Wine 数据集,它已经分为特征数据x和目标标签y
• 对特征数据进行标准化处理,确保每个特征的均值为0,方差为 1,有助于提升模型的性能。
• 将数据集划分为训练集(70%)和测试集(30%)
在这里插入图片描述
(3)构建并训练 AdaBoost 模型
在这里插入图片描述
• 使用决策树桩作为弱分类器
• 构建一个 AdaBoost 分类器,并用训练集数据训练模型n_estimators=50 表示使用 50 个弱分类器
(4)预测与评估
对测试集进行预测,并使用准确率来评估模型的性能。
在这里插入图片描述
打印输出:
在这里插入图片描述
(5)可视化分类结果
①混淆矩阵
在这里插入图片描述
③决策边界
在这里插入图片描述
④学习曲线
在这里插入图片描述
⑤特征重要性
在这里插入图片描述
另外:可以考虑改变训练集和测试集比例对结果的影响,以及改变迭代次数(弱分类器个数)对结果的影响。

5. 完整代码

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, ConfusionMatrixDisplay# 加载数据集
wine = load_wine()
X, y = wine.data, wine.target# 数据标准化处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 使用PCA将数据降维到2D以便可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.3, random_state=42)# 使用决策树桩作为弱分类器
base_estimator = DecisionTreeClassifier(max_depth=1)# 初始化AdaBoost分类器,训练模型n_estimators=50,即为50个弱分类器(可更改分类器个数观察分类效果)
clf = AdaBoostClassifier(base_estimator=base_estimator, n_estimators=50, random_state=42)
clf.fit(X_train, y_train)# 评估模型,观察准确率
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")# 绘制混淆矩阵
cm = confusion_matrix(y_test, y_pred, labels=clf.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=clf.classes_)
disp.plot()
plt.title("Confusion Matrix")
plt.show()# 绘制决策边界函数
def plot_decision_boundary(X, y, clf, ax, title=""):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.02),np.arange(y_min, y_max, 0.02))Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)ax.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.RdYlBu)scatter = ax.scatter(X[:, 0], X[:, 1], c=y, s=30, edgecolor='k', cmap=plt.cm.RdYlBu)legend = ax.legend(*scatter.legend_elements(), title="Classes")ax.add_artist(legend)ax.set_title(title)# 初始化决策树桩分类器并训练初始模型
initial_clf = DecisionTreeClassifier(max_depth=1)
initial_clf.fit(X_train, y_train)# 绘制初始状态和每10次迭代的决策边界观察第1、10、20、30、40、50次迭代的决策边界
fig, axes = plt.subplots(3, 2, figsize=(20, 15))
axes = axes.flatten()plot_decision_boundary(X_test, y_test, initial_clf, axes[0], title="Initial State")for i in range(1, 6):n_estimators = i * 10clf_partial = AdaBoostClassifier(base_estimator=base_estimator, n_estimators=n_estimators, random_state=42)clf_partial.fit(X_train, y_train)plot_decision_boundary(X_test, y_test, clf_partial, axes[i], title=f"After {n_estimators} Estimators")plt.tight_layout()
plt.show()# 提取和显示特征重要性
original_clf = AdaBoostClassifier(base_estimator=base_estimator, n_estimators=50, random_state=42)
original_clf.fit(X_scaled, y)feature_importances = np.mean([tree.feature_importances_ for tree in original_clf.estimators_
], axis=0)# 特征重要性可视化,观察数据集哪几个特征为主要影响因素
features = wine.feature_names
indices = np.argsort(feature_importances)[::-1]plt.figure(figsize=(10, 6))
plt.title("Feature Importances")
plt.bar(range(X.shape[1]), feature_importances[indices], align="center")
plt.xticks(range(X.shape[1]), np.array(features)[indices], rotation=90)
plt.xlim([-1, X.shape[1]])
plt.show()# 绘制学习曲线,观察其错误率随迭代次数的变化
n_estimators = len(clf.estimators_)
error_rate = np.zeros(n_estimators)for i, y_pred_iter in enumerate(clf.staged_predict(X_test)):error_rate[i] = 1 - accuracy_score(y_test, y_pred_iter)plt.figure(figsize=(10, 6))
plt.plot(range(1, n_estimators + 1), error_rate, marker='o', label='Test Error Rate')
plt.xlabel('Number of Estimators')
plt.ylabel('Error Rate')
plt.title('AdaBoost Test Error Rate vs. Number of Estimators')
plt.legend(loc='best')
plt.show()

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

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

相关文章

k8s 配置资源管理

一、Secret的资源配置 1.1 Secret配置的相关说明 Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。 有四种类型&a…

react快速开始(四)-之Vite 还是 (Create React App) CRA? 用Vite创建项目

文章目录 react快速开始(四)-之Vite 还是 (Create React App) CRA? 用Vite创建项目背景Vite 和 (Create React App) CRAVite?Vite 是否支持 TypeScript? 用Vite创建react项目参考 react快速开始(四)-之Vite 还是 (Create React App) CRA? 用Vite创建项…

Java面向对象笔记

多态 一种类型的变量可以引用多种实际类型的对象 如 package ooplearn;public class Test {public static void main(String[] args) {Animal[] animals new Animal[2];animals[0] new Dog();animals[1] new Cat();for (Animal animal : animals){animal.eat();}} }class …

MeshFusion Pro : Ultimate Optimization Tool

MeshFusion Pro是Unity的强大优化工具,它使用一种高效的方法来组合对象,以减少绘制调用并提高FPS。 MeshFusion Pro可用于组合静态对象以及LODGroups。您还可以创建动态组合对象,其中每个单独的网格都可以在运行时移动,新的组合网格将自动更新。在保持单个网格自由度的同时…

【数据结构与算法 | 二叉树篇】力扣101, 104, 111

1. 力扣101 : 对称二叉树 (1). 题 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false…

Java1.8语言+ springboot +mysql + Thymeleaf 全套家政上门服务平台app小程序源码

Java1.8语言 springboot mysql Thymeleaf 全套家政上门服务平台app小程序源码 家政系统是一套可以提供上门家政、上门维修、上门洗车、上门搬家等服务为一体的家政平台解决方案。它能够与微信对接、拥有用户端小程序,并提供师傅端app,可以帮助创业者在…

树的算法基础知识

什么是树: 树是n(n>0)个结点的有限集。n0时称为空树。在任意一棵非空树中: 有且仅有一个特定的称为根的结点当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......、Tm&…

ElasticSearch学习笔记之三:Logstash数据分析

第3章 Logstash数据分析 Logstash使用管道方式进行日志的搜集处理和输出。有点类似*NIX系统的管道命令 xxx | ccc | ddd,xxx执行完了会执行ccc,然后执行ddd。 在logstash中,包括了三个阶段: 输入input --> 处理filter(不是必须…

异或炸弹(easy)(牛客小白月赛95)

题目链接: D-异或炸弹(easy)_牛客小白月赛95 (nowcoder.com) 题目: 题目分析: 一看 还以为是二维差分的题呢 到后来才发现是一维差分问题 这里的距离是 曼哈顿距离 dis abs(x - xi) abs(y - yi) 暴力的做法 就是枚举 n * n 个…

word-海报制作

1、确定海报的尺寸大小 2、创建主题颜色 设计-颜色-自定义颜色-柑橘rgb值改变着色1-着色6的颜色 3、将文字添加至文本框,更改字体颜色、大小和格式 4、添加背景水印:插入-形状-文本框 5、组合全部元素 图片素材网址:

Spark Streaming 概述及入门案例

一、介绍 1. 不同的数据处理 从数据处理的方式: 流式数据处理(Streaming)批量数据处理(Batch) 从数据处理的延迟: 实时数据处理(毫秒级别)离线数据处理(小时或天级别) 2. 简介 SparkStreaming 是一个准实时(秒或分钟级别)、微批量的数据处理框架Spa…

系统架构设计师【第19章】: 大数据架构设计理论与实践 (核心总结)

文章目录 19.1 传统数据处理系统存在的问题19.2 大数据处理系统架构分析19.2.1 大数据处理系统面临挑战19.2.2 大数据处理系统架构特征 19.3 Lambda架构19.3.1 Lambda架构对大数据处理系统的理解19.3.2 Lambda架构应用场景19.3.3 Lambda架构介绍19.3.4  Lambda架构的实…

内网安全:横向传递攻击(PTH || PTK || PTT 哈希票据传递)

内网安全:横向传递攻击. 横向移动就是在拿下对方一台主机后,以拿下的那台主机作为跳板,对内网的其他主机再进行后面渗透,利用既有的资源尝试获取更多的凭据、更高的权限,一步一步拿下更多的主机,进而达到控…

CodeMirror 创建标签计算编辑器

在日常开发中对于一些数据计算场景可能会遇到标签计算的需求&#xff0c;下面关于如何使用CodeMirror实现标签计算编辑功能。 1&#xff0c;结果图 2&#xff0c;主体代码逻辑 大家只需要复制粘贴主要codeMirror使用逻辑即可 <template><el-dialogref"dialogRe…

抖店商家疑惑,自然流量突然下滑,为什么呢?

大家好&#xff0c;我是喷火龙。 很多的抖店商家会遇到一种情况&#xff0c;那就是自己店铺的流量好好的&#xff0c;不知道怎么的就突然没流量了&#xff0c;各方面的数据都断崖式的下降。 为什么会这样呢&#xff1f;原因有以下几点&#xff0c;大家可以检查一下&#xff0…

低代码和零代码软件时代质量管理(QM)和质量管理系统(QMS)

【前言】 质量控制过程的目的是为了确保产品的制造标准得到保持和改进。质量控制过程使公司能够满足客户的期望&#xff0c;同时确保产品质量的一致水平。采用这些标准创造了一种公司文化&#xff0c;鼓励所有员工努力实现高质量的生产标准。低代码和零代码软件可以成为质量控…

【网络通信层】华为云连接MQTT设备

本文介绍华为云设备连接到设备的操作。 目录 一、在华为云创建设备 二、连接MQTT 三、通信 一、在华为云创建设备 现在华为云上可以免费使用部分受限服务&#xff0c;包括免费创建自己的设备连接。 首先&#xff0c;登录华为云平台共建智能世界云底座-华为云 (huaweicl…

Qt Window Dialog 无标题栏 ,无边框,可拖动

1.效果&#xff1a; 2. 主要实现步骤&#xff1a; 设置窗口 flag&#xff1a; this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); 创建变量存储位置 QPoint m_dragPosition; 对鼠标左键按下和移动事件做处理 void DraggableDialog::mousePre…

Web 页面性能衡量指标-以用户为中心的效果指标

Web 页面性能衡量指标-以用户为中心的性能指标 以用户为中心的性能指标是理解和改进站点体验的关键点 一、以用户为中心的性能指标 1. 指标是用来干啥的&#xff1f; 指标是用来衡量性能和用户体验的 2. 指标类型 感知加载速度&#xff1a;网页可以多快地加载网页中的所有…

如何在vs code中安装JavaFX

目录 下载JavaFX 配置vs code工程 编写测试代码 下载JavaFX 网站链接:https://openjfx.io 选择如下的版本