欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > Python----机器学习(基于贝叶斯的鸢尾花分类)

Python----机器学习(基于贝叶斯的鸢尾花分类)

2025/4/14 9:40:53 来源:https://blog.csdn.net/weixin_64110589/article/details/146562822  浏览:    关键词:Python----机器学习(基于贝叶斯的鸢尾花分类)

        贝叶斯方法是一种统计推断的 方法,它利用贝叶斯定理来更新我们对事件概率的信念。这种方法在机器学习和数据 分析中得到广泛应用,特别是在分类和概率估计问题上。

一、数据集介绍

        这是分类方法文献中最早使用的数据集之一,广泛用于统计和机器学习。该数据集包含 3 个类,每个类 50 个实例,其中每个类都引用一种鸢尾植物。一个类与其他 2 个类线性可分;后者彼此之间不能线性分离。 预测属性:鸢尾植物的类别。

数据集地址

        Iris - UCI 机器学习存储库

变量名称角色类型描述单位缺失值
萼片长度特征连续的厘米
萼片宽度特征连续的厘米
花瓣长度特征连续的厘米
花瓣宽度特征连续的厘米
目标分类鸢尾植物类:山鸢尾-- 变色鸢尾-- 弗吉尼亚鸢尾 

二、基准模型性能 

三、设计思路

3.1、读取数据集

import pandas as pd
df=pd.read_csv('./dataset/iris.data',names=['萼片长度','萼片宽度','花瓣长度','花瓣宽度','类'])
df.head()

3.2、划分特征

X=df.drop(columns='类')
y=df['类']

3.3、划分数据集和测试集

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=0.75,random_state=42)

3.4、标准化

from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_train_scaler=scaler.fit_transform(X_train)
X_test_scaler=scaler.transform(X_test)

3.5、模型的构建,训练,预测

from sklearn.naive_bayes import GaussianNB
gb=GaussianNB()
gb.fit(X_train,y_train)
y_pred=gb.predict(X_test)

3.6、模型评估

        模型训练完成后,我们对模型的性能进行评估。我们使用测试集进行预测,并计算准 确率、混淆矩阵和分类报告等指标来了解模型的表现。

        准确度 (Accuracy):准确度是正确预测的样本数与总样本数之比。

        混淆矩阵(Classification Report): 混淆矩阵显示了模型的分类情况。对角线上的元素表示正确分类的样本数,而非对角 线上的元素表示错误分类的样本数。例如,29个类别一被正确分类,而5个类别二被 错误分类成类别三。

分类报告 (Classification Report):

        分类报告提供了更详细的性能指标,包括精度(precision)、召回率(recall)、F1分数 (f1-score)等。

        对于“Iris-setosa”类别,精度为100%,召回率为100%,F1分数为100%。

        对于“Iris-versicolor”类别,精度为100%,召回率为100%,F1分数为100%。

        宏平均 (macro avg) 和加权平均 (weighted avg) 提供了整体性能的总结。在这个 情况下,宏平均的精确度分数为100%,加权平均的精确度分数为100%;宏平均的 召回率分数为100%,加权平均的召回率分数为100%;宏平均的F1分数为100%,加 权平均的F1分数为100%。这些指标是所有类别性能的平均值。 

from sklearn.metrics import accuracy_score,confusion_matrix,classification_report
# 准确率:计算分类模型的准确率,也可以计算准确个数
accuracy = accuracy_score(y_test, y_pred)# 混淆矩阵:可以直观的展示分类模型在各个类别上的预测情况。
# 返回一个二维数组(也就是混淆矩阵),矩阵的行表示真实类别,矩阵的列表示预测类别
conf_matrix = confusion_matrix(y_test, y_pred)# 真反例:实际类别是反例,模型预测也是反例。
# 精准率:指该类别被正确预测的样本数(真正例)与所有被预测为该类别的样本数(假正例)。 真正例/(真正例+假正例)
# 召回率:指该类别被正确预测的样本数(真正例)与所有实际属于该类别的样本数(假反例)。  真正例(真正例+假反例)
# f1值:精准率与召回率的调和平均数 : 2 * pre * recall / (pre + recall)
# 支持度:指每个类别在真实标签中出现的样本数量
# 宏平均:对各个类别指标(pre、recall、f1)的简单平均
# 加权平均:根据每个类别的支持度对每个类别指标进行加权平均
class_report = classification_report(y_test, y_pred)print(f'Accuracy: {accuracy}')
print(f'Confusion Matrix: \n{conf_matrix}')
print(f'Classfication Report: \n{class_report}')

3.7、可视化

        使用t-SNE对SVM模型的决策函数结果进行降维,创建散点图进行可视 化,以便更直观地理解模型在二维空间中的预测结果。

from matplotlib import pyplot as plt
from sklearn.manifold import TSNE
from sklearn.preprocessing import LabelEncoder
# 数据可视化,降维  使用t-sne算法进行降维操作,将特征讲到2维,方便可视化
tsne = TSNE(n_components=2)
x_tsne = tsne.fit_transform(X_test_scaler)# 将字符串标签转换为数值标签,方便画图
label_encoder = LabelEncoder()
y_test_numeric = label_encoder.fit_transform(y_pred)# 绘制图像
plt.figure(figsize=(8, 6))
scatter = plt.scatter(x_tsne[:, 0], x_tsne[:, 1], c=y_test_numeric, cmap='viridis')
plt.title('t-SNE Visualization of naive_bayes Predictions')
plt.legend(*scatter.legend_elements(), title='Classes')
plt.show()

四、完整代码

import pandas as pd  
from matplotlib import pyplot as plt  
from sklearn.manifold import TSNE  
from sklearn.preprocessing import LabelEncoder  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  
from sklearn.naive_bayes import GaussianNB  
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report  # 加载鸢尾花数据集,并为列指定名称  
df = pd.read_csv('./dataset/iris.data', names=['萼片长度', '萼片宽度', '花瓣长度', '花瓣宽度', '类'])  
print(df.head())  # 显示数据集的前几行以便检查  # 划分特征(X)和标签(y)  
X = df.drop(columns='类')  # 特征:除了'类'以外的所有列  
y = df['类']               # 标签:'类'列  # 将数据集分为训练集和测试集,训练集占75%  
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.75, random_state=42)  # 对特征进行标准化,去除均值并缩放到单位方差  
scaler = StandardScaler()  
X_train_scaler = scaler.fit_transform(X_train)  # 拟合训练数据并转换  
X_test_scaler = scaler.transform(X_test)        # 转换测试数据  # 初始化并训练高斯朴素贝叶斯分类器  
gb = GaussianNB()  
gb.fit(X_train, y_train)  # 用训练数据拟合模型  
y_pred = gb.predict(X_test)  # 对测试集进行预测  # 准确率:计算分类模型的准确率,也可以计算准确个数  
accuracy = accuracy_score(y_test, y_pred)  # 计算模型准确率  # 混淆矩阵:可以直观展示分类模型在各个类别的预测情况  
# 返回二维数组(混淆矩阵),行表示真实类别,列表示预测类别  
conf_matrix = confusion_matrix(y_test, y_pred)  # 计算混淆矩阵  # 真反例:实际类别是反例,模型预测也是反例  
# 精准率:该类别正确预测的样本数(真正例)与所有被预测为该类别的样本数(假正例)之比  
# 召回率:该类别正确预测的样本数(真正例)与所有实际属于该类别的样本数(假反例)之比  
# f1值:精准率与召回率的调和平均数:2 * (pre * recall) / (pre + recall)  
# 支持度:每个类别在真实标签中出现的样本数量  
# 宏平均:对各类别指标(pre、recall、f1)的简单平均  
# 加权平均:根据每个类别的支持度对每个类别指标进行加权平均  
class_report = classification_report(y_test, y_pred)  # 生成分类报告  print(f'准确率: {accuracy}')  # 打印模型的准确率  
print(f'混淆矩阵: \n{conf_matrix}')  # 打印混淆矩阵  
print(f'分类报告: \n{class_report}')  # 打印分类报告  # 数据可视化,降维,使用t-SNE算法进行降维处理,将特征转为二维,方便可视化  
tsne = TSNE(n_components=2)  # 初始化t-SNE,用于2D可视化  
x_tsne = tsne.fit_transform(X_test_scaler)  # 拟合并转换测试集  # 将字符串标签转换为数值标签,方便绘图  
label_encoder = LabelEncoder()  
y_test_numeric = label_encoder.fit_transform(y_pred)  # 将预测标签转换为数值型以便绘图  # 绘制图像  
plt.figure(figsize=(8, 6))  # 创建绘图的画布  
scatter = plt.scatter(x_tsne[:, 0], x_tsne[:, 1], c=y_test_numeric, cmap='viridis')  # 绘制t-SNE结果的散点图  
plt.title('t-SNE可视化朴素贝叶斯预测结果')  # 设置图表标题  
plt.legend(*scatter.legend_elements(), title='类别')  # 添加类别图例  
plt.show()  # 显示图表  

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词