【人工智能Ⅰ】实验4:贝叶斯分类

news2024/9/24 13:17:30

实验4  贝叶斯分类

一、实验目的

1. 了解并学习机器学习相关库的使用。

2. 熟悉贝叶斯分类原理和方法,并对MNIST数据集进行分类。

二、实验内容

1. 使用贝叶斯方法对mnist或mnist variation数据集进行分类,并计算准确率。数据集从网上下载(如百度飞桨平台)。

2. 改变算法参数,观察对识别准确率的影响。

三、实验环境

平台

Jupyter Notebook (anaconda3)

Python版本

python 3.9

第三方依赖

numpy、scikit-learn、matplotlib

四、方法流程

1:配置第三方依赖;

2:下载mnist数据集;

3:划分数据集为训练集train和测试集test;

4:调用机器学习库的贝叶斯分类模型;

5:设置pred为模型预测的结果;

6:比较test和pred,计算准确率;

7:输出测试集test的混淆矩阵;

8:按照上述方法继续对其他模型进行调参并对比模型的训练结果。

五、实验展示(训练过程和训练部分结果进行可视化)

1:三种贝叶斯模型的训练结果对比

模型

名称

分类准确率

GaussianNB

高斯Bayes算法

55.58%

MultinomialNB

多项式Bayes算法

83.65%

BernoulliNB

伯努利Bayes算法

84.13%

可视化训练结果(混淆矩阵):


GaussianNB


MultinomialNB


BernoulliNB

训练数据:


X = mnist.data(像素结果)


y = mnist.target(标签结果)

2:高斯Bayes算法(GaussianNB)在不同平滑参数下的训练结果对比

平滑参数var_smoothing

分类准确率

0.95

74.97%

0.8

75.89%

0.5

77.91%

0.3

79.77%

0.05

81.40%

不采用

55.58%

 

3:高斯Bayes算法(GaussianNB)在设置均等先验概率下的训练结果


可以发现,与未设置priors参数时候的结果一致,说明模型预先就均分了先验概率。

4:伯努利Bayes算法(BernoulliNB)在是否禁用学习类的先验概率的训练结果对比

先验概率使用fit_prior

分类准确率

True

84.13%

False

84.15%

5:伯努利Bayes算法(BernoulliNB)在不同加法(Laplace/Lidstone)平滑参数下的训练结果对比

平滑参数alpha

分类准确率

0.1

84.15%

0.5

84.14%

0.9

84.14%

6:伯努利Bayes算法(BernoulliNB)在不同二值化阈值参数下的训练结果对比

二值化阈值参数binarize

分类准确率

0.0

84.13%

0.5

84.13%

1.0

84.13%

7:多项式Bayes算法(MultinomialNB)在不同加法(Laplace/Lidstone)平滑参数下的训练结果对比

平滑参数alpha

分类准确率

0.1

83.67%

0.5

83.66%

0.9

83.65%

8:伯努利Bayes算法(BernoulliNB)在是否禁用学习类的先验概率的训练结果对比

先验概率使用fit_prior

分类准确率

True

83.65%

False

83.65%

9:多项式Bayes算法(MultinomialNB)的单张图片测试结果

10:对数据集进行主成分分析、标准化和归一化处理后的训练结果

主成分分析:

PCA_Transfer=PCA(n_components=0.95)

PCA_x=PCA_Transfer.fit_transform(x)

标准化:

Standard_Transfer=StandardScaler()

standard_x_train=Standard_Transfer.fit_transform(x_train)

standard_x_test=Standard_Transfer.fit_transform(x_test)

归一化:

MinMax_Transfer=MinMaxScaler()

Guiyihua_x_train=MinMax_Transfer.fit_transform(x_train)

Guiyihua_x_test=MinMax_Transfer.fit_transform(x_test)

经过上述操作后的模型训练结果:

模型

名称

分类准确率

GaussianNB

高斯Bayes算法

77.49%

MultinomialNB

多项式Bayes算法

85.45%

BernoulliNB

伯努利Bayes算法

74.14%

六、实验结论

1:在GaussianNB中,我们可以改变的主要参数是priors和var_smoothing。priors参数可以手动设置每个类别的先验概率,默认让模型根据数据自动计算先验概率。var_smoothing参数用于控制对类别不确定性的处理方式。var_smoothing值过大,可能会让模型对实际数据中的变化不敏感,导致模型性能降低;var_smoothing值过小,可能会对数据中的噪声和异常值更敏感,导致训练数据过拟合。

2:在MultinomialNB中,我们可以改变的主要参数是alpha、fit_prior、class_prior和min_categories。加法平滑参数alpha用于处理因数据稀疏而在学习数据中未观察到的特征,防止概率计算时出现0值。是否学习类的先验概率fit_prior如果为假,使用均匀的先验概率,即认为所有输出类别的可能性相等。类别的先验概率class_prior如果指定,则不根据数据调整先验概率。指定每个特征的最小类别数min_categories帮助防止在特征维度非常高但训练样本相对较少时出现过拟合。

3:在BernoulliNB中,我们可以改变的主要参数是alpha、binarize、fit_prior和class_prior。与MultinomialNB相比,binarize是用于二值化输入特征的阈值。如果设定,则输入特征大于这个阈值的将会被二值化为1,否则二值化为0。

4:在模型选择方面,MultinomialNB和BernoulliNB更适合处理MNIST数据集,因为MNIST的图像可以表示为像素强度计数(适合多项式分布)或二值化的像素存在与否(适合伯努利分布)。GaussianNB可能在没有适当预处理(如归一化)的情况下表现不佳。

5:在使用贝叶斯分类器后,进行误差分析(比如混淆矩阵)可以揭示某些数字更难区分。数字之间难以区分通常是由贝叶斯模型的独立性假设造成的。

七、遇到的问题及其解决方案

问题1:安装第三方依赖时,显示pip有更新。

解决1:采用【pip install --upgrade pip】命令,升级pip即可。

问题2:Jupyter Notebook只显示ipykernel为python 3,不显示具体的python版本。

解决2:采用【!pip3 -V】命令进行查看,结果如下图所示。

八、附件

1:三类贝叶斯模型的基本调用源代码

import numpy as np 

import matplotlib.pyplot as plt 

from sklearn.datasets import fetch_openml 

 

# 加载MNIST或MNIST Variation数据集 

mnist = fetch_openml('mnist_784', version=1) 

X, y = mnist.data, mnist.target 

X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] 

# 训练贝叶斯分类器 

from sklearn.naive_bayes import GaussianNB 

gnb = GaussianNB() 

gnb.fit(X_train, y_train) 

 

# 预测测试集 

y_pred = gnb.predict(X_test) 

 

# 计算准确率

acc = np.sum(y_pred == y_test) / len(y_test) 

print("Accuracy:", acc) 

 

# 可视化结果 

plt.scatter(y_pred, y_test, s=20) 

plt.xlabel("Predicted label") 

plt.ylabel("True label") 

plt.title("Confusion Matrix") 

plt.show()

plt.savefig('ret.png')

# 训练贝叶斯分类器 

from sklearn.naive_bayes import MultinomialNB 

gnb1 = MultinomialNB()

gnb1.fit(X_train, y_train) 

 

# 预测测试集 

y_pred = gnb1.predict(X_test) 

 

# 计算准确率

acc = np.sum(y_pred == y_test) / len(y_test) 

print("Accuracy:", acc) 

 

# 可视化结果 

plt.scatter(y_pred, y_test, s=20) 

plt.xlabel("Predicted label") 

plt.ylabel("True label") 

plt.title("Confusion Matrix") 

plt.show()

plt.savefig('ret1.png')

# 训练贝叶斯分类器 

from sklearn.naive_bayes import BernoulliNB

gnb2 = BernoulliNB()

gnb2.fit(X_train, y_train) 

 

# 预测测试集 

y_pred = gnb2.predict(X_test) 

 

# 计算准确率

acc = np.sum(y_pred == y_test) / len(y_test) 

print("Accuracy:", acc) 

 

# 可视化结果 

plt.scatter(y_pred, y_test, s=20) 

plt.xlabel("Predicted label") 

plt.ylabel("True label") 

plt.title("Confusion Matrix") 

plt.show()

plt.savefig('ret2.png')

2:单张图片对模型进行测试的代码

import matplotlib.pyplot as plt

from sklearn.datasets import fetch_openml

from sklearn.model_selection import train_test_split

from sklearn.naive_bayes import GaussianNB

from sklearn.metrics import accuracy_score

from skimage import io, color, filters

from skimage.transform import resize

import numpy as np

# 训练贝叶斯分类器 

from sklearn.naive_bayes import MultinomialNB 

gnb = MultinomialNB()

gnb.fit(X_train, y_train)

# 读取图像文件

image_path = r'C:\Users\86158\Desktop\train_labels\train_examples_labels\train_new\5.png'

image = io.imread(image_path)

# 将图像缩放到28x28像素

scaled_image = resize(image, (28, 28), anti_aliasing=True)

# 将图像数据转换为一维数组

flat_image = scaled_image.flatten()

# 将像素值缩放到0到1(如果你的模型是在这个范围的数据上训练的)

processed_image = flat_image / 255.0

# 确保这里的processed_image具有与模型训练数据相同的形状

# 如果是MNIST,它应该有784个特征

processed_image = processed_image.reshape(1, -1)

# 使用模型进行预测

prediction = gnb.predict(processed_image)

print(f"Predicted class for the input image: {prediction[0]}")

# 可选:显示图像

plt.imshow(scaled_image, cmap='gray')

plt.title(f'Predicted Class: {prediction[0]}')

plt.show()

3:对数据集进行主成分分析、标准化和归一化处理的完整代码

from sklearn.datasets import fetch_openml

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.decomposition import PCA

from sklearn.neighbors import KNeighborsClassifier

from sklearn.naive_bayes import MultinomialNB,GaussianNB,BernoulliNB

import matplotlib.pyplot as plt

from sklearn.preprocessing import MinMaxScaler

from sklearn.model_selection import GridSearchCV

from sklearn.tree import DecisionTreeClassifier

from sklearn.tree import plot_tree

from sklearn.tree import export_graphviz

from sklearn.ensemble import RandomForestClassifier

from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import learning_curve

from sklearn.metrics import classification_report

import numpy as np

mnist=fetch_openml("mnist_784",version=1,cache=True)

x=mnist.data

y=mnist.target

# 对输入特征进行主成分分析降维

print("降维前的特征数:",x.shape[1])

PCA_Transfer=PCA(n_components=0.95)

PCA_x=PCA_Transfer.fit_transform(x)

print("降维后的特征数:",PCA_x.shape[1])

# 划分训练集和测试集

x_train,x_test,y_train,y_test=train_test_split(PCA_x,y,test_size=0.2,random_state=1)

# 对输入特征值进行标准化处理

Standard_Transfer=StandardScaler()

standard_x_train=Standard_Transfer.fit_transform(x_train)

standard_x_test=Standard_Transfer.fit_transform(x_test)

# 对输入特征值进行归一化处理

MinMax_Transfer=MinMaxScaler()

Guiyihua_x_train=MinMax_Transfer.fit_transform(x_train)

Guiyihua_x_test=MinMax_Transfer.fit_transform(x_test)

Bayes_estimator1=MultinomialNB()

param_dic={"alpha":[0.5,0.6,0.7,0.8,0.9,1,1.1,1.2]}

Bayes_estimator1=GridSearchCV(Bayes_estimator1,param_grid=param_dic,cv=10,n_jobs=-1)

Bayes_estimator1.fit(Guiyihua_x_train,y_train)

print("多项式Bayes算法在测试集上的平均预测成功率:",Bayes_estimator1.score(Guiyihua_x_test,y_test))

Bayes_estimator2=GaussianNB()

Bayes_estimator2=GridSearchCV(Bayes_estimator2,cv=10,param_grid={},n_jobs=-1)

Bayes_estimator2.fit(x_train,y_train)

print("高斯Bayes算法在测试集上的平均预测成功率:",Bayes_estimator2.score(x_test,y_test))

Bayes_estimator3=BernoulliNB()

Bayes_estimator2=GridSearchCV(Bayes_estimator2,cv=10,param_grid={},n_jobs=-1)

Bayes_estimator3.fit(x_train,y_train)

print("伯努利Bayes算法在测试集上的平均预测成功率:",Bayes_estimator3.score(x_test,y_test))

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

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

相关文章

【C++】异常处理 ② ( 异常捕获类型 | 异常捕获机制 - 严格匹配异常类型 | 未知异常捕获 - 不知道异常类型 )

文章目录 一、异常捕获机制 - 严格匹配异常类型1、异常捕获机制 - 严格匹配异常类型2、代码示例 - 异常捕获严格匹配异常类型 二、异常捕获机制 - 未知异常捕获1、未知异常捕获 - 不知道异常类型2、代码示例 - 未知异常捕获 一、异常捕获机制 - 严格匹配异常类型 1、异常捕获机…

嵌入式Linux:配置Ubuntu系统环境和安装开发工具

目录 1、配置Ubuntu系统环境 1.1、APT下载工具 1.2、更新语言 1.3、更新本地数据库 1.4、安装VIM编辑器 1.5、Ubuntu 和 Windows 文件互传 1.6、开启NFS服务 1.7、开启SSH服务 2、安装开发工具 2.1、Ubuntu安装VSCode 2.2、Windows安装MobaXterm 安装好Ubuntu系统环…

需求不明确的情况下,测试该如何处理?

当需求不明确的情况下,测试团队可以采取以下措施来处理: 1. 与项目团队进行沟通:测试团队应与项目团队密切合作,与业务分析师、产品经理等相关人员进行沟通,以获取更多的需求细节和背景信息。通过与相关方的交流&…

No matching version found for @babel/compat-data@^7.23.5 处理

npm ERR! notarget No matching version found for babel/compat-data^7.23.5 处理 报错信息 npm WARN ERESOLVE overriding peer dependency npm ERR! code ETARGET npm ERR! notarget No matching version found for babel/compat-data^7.23.5. npm ERR! notarget In most …

Shopee引流妙招!Shopee产品标签重要吗?教你有效打标签引爆流量!

对Shopee平台的卖家来说,在新产品上架时除了要注重产品title、介绍以及图文的优化,还有一件事情很重要,那就是——产品打标签。 对于每个跨境电商卖家来讲,对产品打标签都是必不可少的一个运营环节 下面小宇就来告诉大家&#xf…

字符串的旋转

字符串的旋转 左旋(逆时针) 示例:abcd------>bcda 右旋(顺时针) 示例:abcd------>dabc 例: 输入若干个字符串(1≤长度≤1000)右旋转串后的n(-长度…

芒格传奇落幕!生前最后一次谈论比特币,说了什么?

当地时间11月28日,知名投资公司伯克希尔哈撒韦发布声明,公司董事会副主席查理芒格(Charlie Munger)于当天早上在美国加利福尼亚州的一家医院去世,终年99岁,距离其百岁生日仅剩1个月。 巴菲特在一份声明中表示:“没有查…

Anaconda超简单安装教程,超简洁!!!(Windows环境下,亲测有效)

写下这篇文章的动机,是今天在装Anaconda的时候,本来想搜点教程按照教程一步一步安装的,但没想到,所谓“保姆级”教程呀,“最详细”之类的,好复杂。然后一些本应该详细说的反而一笔带过了。所以今天我想把我…

基于YOLOv8深度学习的安全帽目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

滴滴遭遇重击:12小时内损失千万订单量与超4亿成交额,背后有何启示?

近期,中国最大的出行平台之一——滴滴,经历了一次长达12小时的系统崩溃,造成了重大的经济损失。这一事件引起了广泛关注,并凸显出一些关键信息。本文将深入探讨此次事件中凸显的关键信息和可能的技术原因。 首先,滴滴作…

GeoServer改造Springboot源码四(图层管理设计)

一、界面设计 图 1图层管理列表 图 2选择图层数据源 图 3添加图层 图 4编辑图层

从setText处理来学习绘制流程

Android中TextView调用setText是会进行text文字的更新,是一个比较简单的画面变化,这可以作为一个出发点来查看绘制处理流程。这里来问问chatGPT,来查看大致流程 请讲讲Android中textView的setText处理流程 ChatGPT Poe 当你调用 textView.s…

【人工智能Ⅰ】实验3:蚁群算法

实验3 蚁群算法的应用 一、实验内容 TSP 问题的蚁群算法实现。 二、实验目的 1. 熟悉和掌握蚁群算法的基本概念和思想; 2. 理解和掌握蚁群算法的参数选取,解决实际应用问题。 三、实验原理 1.算法来源 蚁群算法的基本原理来源于自然界…

P1025 [NOIP2001 提高组] 数的划分

暴搜 剪枝 枚举固定的位置 #include<bits/stdc.h> using namespace std; using ll long long; const int N 1e310; int n,k; int res; void dfs(int last,int sum,int cur){if(curk){if(sumn)res;return;}for(int ilast;isum<n;i)dfs(i,sumi,cur1); } int main() {c…

DDD落地:从携程订单系统重构,看DDD的巨大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

玄学调参实践篇 | 深度学习模型 + 预训练模型 + 大模型LLM

&#x1f60d; 这篇主要简单记录一些调参实践&#xff0c;无聊时会不定期更新~ 文章目录 0、学习率与batch_size判断1、Epoch数判断2、判断模型架构是否有问题3、大模型 - 计算量、模型、和数据大小的关系4、大模型调参相关论文经验总结5、训练时模型的保存 0、学习率与batch_s…

抑制过拟合——Dropout原理

抑制过拟合——Dropout原理 Dropout的工作原理 实验观察 在机器学习领域&#xff0c;尤其是当我们处理复杂的模型和有限的训练样本时&#xff0c;一个常见的问题是过拟合。简而言之&#xff0c;过拟合发生在模型对训练数据学得太好&#xff0c;以至于它捕捉到了数据中的噪声和…

热烈欢迎省工信厅毛郑建处长莅临公司调研指导工作

2023年11月28日&#xff0c;河南省工信厅信息化和软件服务业处毛郑建处长莅临郑州埃文计算机科技有限公司&#xff08;以下简称“埃文科技”&#xff09;调研考察工作。河南省工业信息安全产业发展联盟理事长任传军陪同调研。 首先&#xff0c;埃文科技董事长王永向毛处长介绍埃…

开源运维监控系统-Nightingale(夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

JDK 动态代理从入门到掌握

快速入门 本文介绍 JDK 实现的动态代理及其原理&#xff0c;通过 ProxyGenerator 生成的动态代理类字节码文件 环境要求 要求原因JDK 8 及以下在 JDK 9 之后无法使用直接调用 ProxyGenerator 中的方法&#xff0c;不便于将动态代理类对应的字节码文件输出lombok为了使用 Sne…