11.11
实验六:朴素贝叶斯算法实现与测试
一、实验目的
深入理解朴素贝叶斯的算法原理,能够使用 Python 语言实现朴素贝叶斯的训练与测试,
并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练朴素贝叶斯分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验六的部分。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 导入所需库
- 导入 numpy
- 导入 sklearn 中的相关模块(datasets, model_selection, metrics, naive_bayes)
2. 加载 iris 数据集
- iris = load_iris()
- X = iris.data # 特征数据
- y = iris.target # 目标数据
3. 划分数据集
- 使用 train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)
- X_train, X_test, y_train, y_test = 划分后的数据
4. 初始化朴素贝叶斯分类器
- nb_classifier = GaussianNB() # 或者使用 MultinomialNB() 根据数据的特性选择
5. 训练模型
- nb_classifier.fit(X_train, y_train)
6. 进行五折交叉验证
- 使用 cross_val_score(nb_classifier, X_train, y_train, cv=5, scoring='accuracy')
- 计算平均准确度
- 计算其他指标(精度、召回率、F1 值)使用 cross_val_predict
7. 使用测试集评估模型性能
- y_pred_test = nb_classifier.predict(X_test)
- 计算准确度: accuracy = accuracy_score(y_test, y_pred_test)
- 计算精度: precision = precision_score(y_test, y_pred_test, average='macro')
- 计算召回率: recall = recall_score(y_test, y_pred_test, average='macro')
- 计算 F1 值: f1 = f1_score(y_test, y_pred_test, average='macro')
8. 输出评估结果
- 打印五折交叉验证的平均准确度
- 打印训练集的各项指标
- 打印测试集的各项指标
9. 分析测试结果
- 如果准确度高于某个阈值,输出模型性能良好的信息
- 否则,建议调整模型参数或数据集
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))
调用库方法
1. load_iris
加载 Iris 数据集。
from sklearn.datasets import load_iris
参数:
return_X_y: 如果为 True,返回特征和目标。如果为 False,返回一个包含数据的对象(默认值为 False)
。
返回值:
返回一个包含特征和目标的对象,通常通过 iris.data 和 iris.target 获取。
2. train_test_split
将数据随机划分为训练集和测试集。
from sklearn.model_selection import train_test_split
参数:
test_size: 测试集占比(0-1之间的小数,或具体数目)。
random_state: 随机种子(确保划分可重现)。
stratify: 按类别比例划分(确保训练集和测试集类别分布一致)。
返回值:
返回划分后的训练数据和测试数据。
3. fit
用法: clf.fit(X_train, y_train)
作用: 训练模型。
4. cross_val_score
用法: cross_val_score(estimator, X, y, cv, scoring)
参数:
estimator: 需要评估的模型。
X: 特征数据。
y: 类别标签。
cv: 交叉验证的折数。
scoring: 评估指标(如准确率、精确率)。
- GaussianNB()
朴素贝叶斯分类器
用法:GaussianNB()
返回值: 创建一个高斯朴素贝叶斯分类器的实例。
6. accuracy_score
计算模型在给定数据上的准确度。
from sklearn.metrics import accuracy_score
参数:
y_true: 真实标签。
y_pred: 预测标签。
返回值:
返回预测准确率(在 0 到 1 之间的小数)。
7. classification_report
生成分类绩效的详细报告。
from sklearn.metrics import classification_report
参数:
y_true: 真实标签。
y_pred: 预测标签。
target_names: 可选,类标签名称的列表,以便于输出可读性。
返回值:
返回一个字符串,包含每个类的精确率、召回率和 F1 值。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
- 对比分析
模型在 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 类别时仍有提升空间。可以通过调整模型参数或进行特征工程来进一步改善这两个类别的预测性能。
五、心得体会
通过本次实验,我深入理解了朴素贝叶斯的算法原理,包括其基于特征条件独立假设的简化计算方式,以及高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯等不同实现方式的应用场景。
在实验过程中,我使用了 scikit-learn 库中的 GaussianNB 类来训练高斯朴素贝叶斯分类器,并通过五折交叉验证对模型性能进行了全面评估。实验结果表明,朴素贝叶斯分类器在 iris 数据集上表现良好,具有较高的准确度和 F1 值。
同时,我也注意到朴素贝叶斯的性能受到特征条件独立假设的限制,在实际应用中可能无法完全满足这一假设。因此,在选择分类算法时,需要根据数据集的特点和实际需求进行权衡。
总的来说,这次实验不仅提高了我的编程能力,还加深了我对朴素贝叶斯算法的理解和应用能力。我认识到,在实际应用中,除了算法本身外,数据预处理、特征选择和模型评估等方面也同样重要。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架