一、实验目的
深入理解朴素贝叶斯的算法原理,能够使用Python语言实现朴素贝叶斯的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练朴素贝叶斯分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验六的部分。
三、算法步骤、代码、及结果
- 算法伪代码
- 导入所需库
- 加载数据集
- 划分数据集
- 训练模型
- 五折交叉验证
- 在测试集上评估模型
- 算法主要代码
完整源代码\调用库方法(函数参数说明)
完整代码:
import numpy as np
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, stratify=y)
model = GaussianNB()
model.fit(X_train, y_train)
kf = KFold(n_splits=5)
accuracy = cross_val_score(model, X, y, cv=kf, scoring='accuracy').mean()
precision = cross_val_score(model, X, y, cv=kf, scoring='precision_weighted').mean()
recall = cross_val_score(model, X, y, cv=kf, scoring='recall_weighted').mean()
f1 = cross_val_score(model, X, y, cv=kf, scoring='f1_weighted').mean()
print(f"\n使用五折交叉验证结果:")
print(f"准确率: {accuracy:.4f}")
print(f"精度: {precision:.4f}")
print(f"召回率: {recall:.4f}")
print(f"F1 值: {f1:.4f}")
y_pred = model.predict(X_test)
test_accuracy = accuracy_score(y_test, y_pred)
test_precision = precision_score(y_test, y_pred, average='weighted')
test_recall = recall_score(y_test, y_pred, average='weighted')
test_f1 = f1_score(y_test, y_pred, average='weighted')
print(f"\n使用测试集评估模型性能:")
print(f"准确率: {test_accuracy:.4f}")
print(f"精度: {test_precision:.4f}")
print(f"召回率: {test_recall:.4f}")
print(f"F1 值: {test_f1:.4f}")
参数说明:
(1) train_test_split
X:特征数据(输入变量),为一个二维数组(n_samples, n_features)。
y:目标数据(标签),为一个一维数组(n_samples,)。
test_size:测试集所占比例,默认为 None,即根据 train_size 自动计算。此处设置为 0.33,表示 1/3 的数据用于测试,2/3 用于训练。
random_state:控制数据分割的随机种子,设置为一个固定的数值(如 42),使得每次运行结果相同。
stratify:用于确保训练集和测试集中的类分布与原始数据一致。设置为 y,表示根据目标变量 y 来进行分层抽样。
(2) cross_val_score
model:模型实例,表示要评估的模型,此处是 GaussianNB()。
X:特征数据,与 train_test_split 中的 X 相同。
y:目标数据,与 train_test_split 中的 y 相同。
cv:交叉验证策略,可以传入整数(表示折数)、或者 KFold 实例,此处为 KFold(n_splits=5),表示五折交叉验证。
scoring:评估指标,可以是:
'accuracy':准确率
'precision_weighted':精度,按类别加权平均
'recall_weighted':召回率,按类别加权平均
'f1_weighted':F1 值,按类别加权平均
(3) accuracy_score、precision_score、recall_score 和 f1_score
accuracy_score(y_true, y_pred)
precision_score(y_true, y_pred, average='weighted')
recall_score(y_true, y_pred, average='weighted')
f1_score(y_true, y_pred, average='weighted')
y_true:真实标签值(测试集的目标变量 y_test)。
y_pred:模型预测的标签值(通过 model.predict 得到的预测结果)。
average:仅在多类分类问题中需要使用,表示如何计算加权平均:
'weighted':每个类别的分数按其在数据集中的样本数量进行加权。
'micro':全局计算的精度/召回率。
'macro':对各类别进行平均,未考虑类别不平衡。
- 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
- 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
- 对比分析
(1)五折交叉验证结果:
1.准确率:0.9600:表示模型在所有交叉验证折中的平均准确率为 94.67%,说明模型在训练集上的表现较好,能够准确分类大多数样本。
2.精度:0.9639:精度较高,意味着在模型预测为正类的样本中,大部分是真正的正类。该值很高,表明模型不会过多地将负类误分类为正类。
3.召回率:0.9600:召回率较高,意味着模型能够识别出大部分的正类样本。与准确率相当,说明模型没有忽略任何类别。
4.F1 值:0.9599:F1 值综合考虑了精度和召回率,显示了较好的均衡,值接近 1 表明模型的综合表现优秀。
(2)测试集结果:
1.准确率:0.9200:测试集上的准确率略低于训练集的交叉验证准确率,减少的幅度较小,说明模型在测试集上的表现仍然较好。
2.精度:0.9236:精度略微下降,但依然高于 90%,说明模型在预测为正类时仍然有较高的可靠性。
3.召回率:0.9200:召回率略有下降,接近训练集的结果,表示模型在识别正类样本时没有太大差距。
4.F1 值:0.9197:F1 值稍有下降,但仍接近 1,说明精度与召回率之间保持了较好的平衡。
(3)分析:
1.五折交叉验证结果较好:交叉验证过程中模型表现非常稳定,准确率接近 95%,精度和召回率接近 1,表明模型在训练集上表现优异,能够有效分类各类样本。
2.测试集性能略下降:尽管交叉验证表现良好,但测试集上的准确率、精度、召回率和F1 值略有下降,说明模型可能有一定的过拟合,尤其是在精度和召回率上的差距稍微增大。这种差距通常是由于训练集与测试集之间存在差异或数据的不可预测性所导致的。
3.F1 值较为稳定:F1 值在训练集和测试集之间的变化较小,说明模型在保持较好平衡的同时,能够在测试集上也表现出较强的鲁棒性。
浙公网安备 33010602011771号