11/5
实验六:朴素贝叶斯算法实现与测试
一、实验目的
深入理解朴素贝叶斯的算法原理,能够使用 Python 语言实现朴素贝叶斯的训练与测试, 并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练朴素贝叶斯分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验六的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 导入必要的库
- 导入加载数据集的库
- 导入数据分割的库
- 导入朴素贝叶斯分类器的库
- 导入交叉验证评分的库
- 导入分类报告和性能指标计算的库
2. 加载iris数据集
- 使用load_iris()函数加载数据集
- 将特征存储在X中,将目标存储在y中
3. 数据分割
- 使用train_test_split()函数将数据集分为训练集和测试集,测试集大小为1/3
4. 训练朴素贝叶斯分类器
- 创建GaussianNB对象
- 使用训练集数据训练分类器
5. 交叉验证
- 使用cross_val_score()函数进行五折交叉验证,并计算平均准确率
6. 模型预测和性能评估
- 使用训练好的模型在测试集上进行预测
- 打印分类报告,包括精确度、召回率、F1分数等
7. 计算并打印测试集性能指标
- 计算测试集的准确率、精确度、召回率和F1分数
- 打印这些性能指标
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score, precision_score, recall_score,
f1_score
# 加载iris数据集
iris = load_iris()
X, y = iris.data, iris.target
# 使用留出法留出1/3的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3,
random_state=42)
# 创建并训练朴素贝叶斯分类器
gnb = GaussianNB()
gnb.fit(X_train, y_train)
# 使用五折交叉验证评估模型性能
scores = cross_val_score(gnb, X_train, y_train, cv=5, scoring='accuracy')
print(f"Accuracy: {scores.mean()}")
# 训练模型并预测测试集
gnb.fit(X_train, y_train)
y_pred = gnb.predict(X_test)
# 打印性能指标
print(classification_report(y_test, y_pred))
# 测试模型性能
y_pred_test = gnb.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_score(y_test, y_pred_test, average='macro')
# 打印性能指标
print(f"Test Accuracy: {accuracy}")
print(f"Test Precision: {precision}")
print(f"Test Recall: {recall}")
print(f"Test F1 Score: {f1}")
参数说明:
1. GaussianNB()
- 用途:创建一个高斯朴素贝叶斯分类器。
- 参数:无参数。
- 返回值:返回一个未训练的高斯朴素贝叶斯分类器对象。
2. fit(X_train, y_train)
- 用途:训练朴素贝叶斯分类器。
- 参数:
- X_train:训练集特征。
- y_train:训练集目标。
- 返回值:返回训练好的分类器对象。
3. cross_val_score(gnb, X_train, y_train, cv=5, scoring='accuracy')
- 用途:使用交叉验证评估模型性能。
- 参数:
- gnb:要评估的分类器对象。
- X_train:训练集特征。
- y_train:训练集目标。
- cv:交叉验证的折数,默认为5。
- scoring:评分标准,默认为'accuracy'(准确率)。
- 返回值:返回一个包含每次交叉验证分数的数组。
4. classification_report(y_test, y_pred)
- 用途:生成性能评估报告,包括精确度、召回率、F1分数等。
- 参数:
- y_test:真实的目标值。
- y_pred:预测的目标值。
- 返回值:返回一个字符串,包含性能评估报告。
5. accuracy_score(y_test, y_pred_test)
- 用途:计算准确率。
- 参数:
- y_test:真实的目标值。
- y_pred_test:预测的目标值。
- 返回值:返回准确率的数值。
6. precision_score(y_test, y_pred_test, average='macro')
- 用途:计算精确度。
- 参数:
- y_test:真实的目标值。
- y_pred_test:预测的目标值。
- average:计算方式,默认为'macro',即对所有类别计算平均值。
- 返回值:返回精确度的数值。
7. recall_score(y_test, y_pred_test, average='macro')
- 用途:计算召回率。
- 参数:
- y_test:真实的目标值。
- y_pred_test:预测的目标值。
- average:计算方式,默认为'macro',即对所有类别计算平均值。
- 返回值:返回召回率的数值。
8. f1_score(y_test, y_pred_test, average='macro')
- 用途:计算F1分数。
- 参数:
- y_test:真实的目标值。
- y_pred_test:预测的目标值。
- average:计算方式,默认为'macro',即对所有类别计算平均值。
- 返回值:返回F1分数的数值。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
训练集:
- 类别 0 的性能:
- o 精确度 (Precision): 1.00,表示所有被预测为类别0的样本中,100%是正确的。
- o 召回率 (Recall): 1.00,表示所有实际为类别0的样本中,100%被正确预测。
- o F1分数 (F1-score): 1.00,精确度和召回率的调和平均,也是1.00。
- o 支持 (Support): 19,表示训练集中有19个类别0的样本。
- 类别 1 的性能:
- o 精确度: 0.93
- o 召回率: 0.93
- o F1分数: 0.93
- o 支持: 15
- 类别 2 的性能:
- o 精确度: 0.94
- o 召回率: 0.94
- o F1分数: 0.94
- o 支持: 16
测试结果分析
- 测试准确率 (Test Accuracy): 0.96,这表明模型在测试集上的预测准确率为96%,比训练集的准确率略高,这可能是由于测试集的特定分布或模型的泛化能力。
- 测试精确度 (Test Precision): 0.957,略高于训练集的平均精确度。
- 测试召回率 (Test Recall): 0.957,同样略高于训练集的平均召回率。
- 测试F1分数 (Test F1 Score): 0.957,也略高于训练集的平均F1分数。
模型在测试集上的表现优于训练集,这表明模型具有良好的泛化能力,能够很好地处理新数据。这种性能的提升对于实际应用来说是非常重要的,因为它意味着模型在面对真实世界的数据时,能够提供可靠的预测

浙公网安备 33010602011771号