10.17

实验六:朴素贝叶斯算法实现与测试

一、实验目的

 

深入理解朴素贝叶斯的算法原理,能够使用 Python 语言实现朴素贝叶斯的训练与测试, 并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样); (2)使用训练集训练朴素贝叶斯分类算法; (3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择; (4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验六的 部分。

 

三、算法步骤、代码、及结果

   1. 算法伪代码

算法名称:基于朴素贝叶斯的鸢尾花数据集分类及性能评估

输入

 

鸢尾花数据集(包含特征数据以及对应的类别标签)

步骤



  1. 数据准备阶段
    •  sklearn.datasets 库中加载鸢尾花数据集,提取特征数据赋值给变量 X,类别标签赋值给变量 y
    • 使用留出法,按照测试集占总样本的 33%(即 1/3)比例,将数据集划分为训练集(X_trainy_train)和测试集(X_testy_test),设置随机种子为 42 并通过 stratify=y 保证训练集和测试集的类别分布与原始数据集相似,随后分别打印训练集和测试集的大小(形状信息)。
  2. 模型构建阶段
    • 创建高斯朴素贝叶斯分类模型实例 nb_model
    • 使用训练集数据(X_trainy_train)对 nb_model 模型进行训练。
  3. 交叉验证准备阶段
    • 构建一个用于评估模型性能的指标字典 scoring,其中包含准确度精度召回率“F1 四个指标,分别通过 make_scorer 函数结合对应的评估函数(如 accuracy_score 等)来定义,计算精度、召回率、F1 值时采用 'weighted' 平均方式。
  4. 交叉验证阶段
    • 运用五折交叉验证方法,针对 nb_model 模型在训练集(X_trainy_train)上进行性能评估,传入定义好的评估指标字典 scoring,将交叉验证的详细结果存储在 cv_results 变量中。
    • 遍历 scoring 字典中的每个指标名称,打印输出对应指标在交叉验证中的均值(保留四位小数,从 cv_results 中提取 test_ 开头加上指标名称对应的结果求平均得到)。
  5. 测试集性能评估阶段
    • 利用训练好的 nb_model 模型对测试集(X_testy_test)进行预测,得到预测结果 y_pred
    • 打印输出测试集的分类报告,通过 classification_report 函数传入测试集的真实标签 y_test 和预测标签 y_pred,同时显示类别名称(取自鸢尾花数据集的 target_names),以展示详细的分类性能情况。

输出



  1. 训练集和测试集的大小(形状信息)。
  2. 五折交叉验证中准确度精度召回率“F1 四个指标各自的均值(保留四位小数)。
  3. 测试集的分类报告,包含精确率、召回率、F1 值等详细分类性能指标情况以及类别名称。

请描述上述Python代码的主要功能。

朴素贝叶斯算法的优缺点是什么?

基于准确率,选择最佳的机器学习算法的方法是?

   2. 算法主要代码

完整源代码\调用库方法(函数参数说明)

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score, cross_validate
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score, classification_report

# 1. 加载 Iris 数据集
iris = load_iris()
X = iris.data
y = iris.target

# 2. 使用留出法分割数据集,33% 为测试集,保持同分布
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)
print("训练集大小:", X_train.shape)
print("测试集大小:", X_test.shape)

# 3. 训练朴素贝叶斯分类算法
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)

# 4. 使用五折交叉验证评估模型性能
scoring = {
    '准确度': make_scorer(accuracy_score),
    '精度': make_scorer(precision_score, average='weighted'),
    '召回率': make_scorer(recall_score, average='weighted'),
    'F1值': make_scorer(f1_score, average='weighted')
}

cv_results = cross_validate(nb_model, X_train, y_train, cv=5, scoring=scoring)

# 输出每个指标的均值
print("\n交叉验证结果:")
for metric in scoring.keys():
    print(f"{metric}:{np.mean(cv_results['test_' + metric]):.4f}")

# 5. 使用测试集测试模型的性能
y_pred = nb_model.predict(X_test)

# 打印测试集的分类报告
print("\n测试集分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

 

 

   3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

 

四、实验结果分析

1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

 

2. 对比分析

模型在 iris 数据集上的表现非常出色。训练集的交叉验证结果显示,准确度为 0.9700,精度为 0.9712,召回率为 0.9700,F1 值为 0.9699,表明模型能够很好地预测训练数据。

在测试集上,模型的整体准确度为 0.92。具体而言,setosa 类别的预测表现完美(精度和召回率均为 1.00),而对于 versicolor 和 virginica 类别,虽然精度和召回率相对较高,但仍存在一定的误分类和漏判现象。versicolor 的精度为 0.84,召回率为 0.94,virginica 的精度为 0.93,召回率为 0.82。

总体而言,模型在训练集和测试集上表现良好,具备较强的分类能力,但在处理 versicolor 和 virginica 类别时仍有提升空间。可以通过调整模型参数或进行特征工程来进一步改善这两个类别的预测性能。

 

 

 

五、心得体会

 

在实现与测试朴素贝叶斯算法的过程中,深感其简洁高效。算法基于概率理论,实现起来相对容易。通过对数据的处理和模型训练,看到了它在分类任务中的出色表现。同时,也认识到其假设的局限性。测试过程让我学会了如何评估模型性能,为进一步优化提供了方向。这次经历加深了我对机器学习算法的理解,也提升了实践能力。

posted @ 2025-01-02 15:34  jais  阅读(44)  评论(0)    收藏  举报