12.6
实验六:朴素贝叶斯算法实现与测试
一、实验目的
深入理解朴素贝叶斯的算法原理,能够使用 Python 语言实现朴素贝叶斯的训练与测试,
并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练朴素贝叶斯分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验六的部分。
三、算法步骤、代码、及结果
1. 算法伪代码
BEGIN
导入必要的库
加载数据集
划分数据为训练集和测试集(保持类别比例)
初始化朴素贝叶斯分类器
定义性能评估指标
使用五折交叉验证进行模型评估
对每次折叠计算准确率、精度、召回率、F1值
记录每次折叠的平均结果和标准差
输出交叉验证的评估结果
在整个训练集上训练最终模型
使用测试集评估最终模型性能
计算并输出准确率、精度、召回率、F1值
END
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_validate
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score
# 加载 iris 数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分数据集为训练集和测试集(70% 训练,30% 测试),注意同分布取样
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)
# 初始化朴素贝叶斯分类器
gnb = GaussianNB()
# 定义评分方法
scoring = {
'accuracy': make_scorer(accuracy_score),
'precision_macro': make_scorer(precision_score, average='macro'),
'recall_macro': make_scorer(recall_score, average='macro'),
'f1_macro': make_scorer(f1_score, average='macro')
}
# 使用五折交叉验证评估模型性能
cv_results = cross_validate(gnb, X_train, y_train, cv=5, scoring=scoring, return_train_score=True)
# 输出交叉验证的结果
print("Cross-validation results:")
print("Train Accuracy: %0.2f (+/- %0.2f)" % (cv_results['train_accuracy'].mean(), cv_results['train_accuracy'].std() * 2))
print("Test Accuracy: %0.2f (+/- %0.2f)" % (cv_results['test_accuracy'].mean(), cv_results['test_accuracy'].std() * 2))
print("Precision: %0.2f (+/- %0.2f)" % (cv_results['test_precision_macro'].mean(), cv_results['test_precision_macro'].std() * 2))
print("Recall: %0.2f (+/- %0.2f)" % (cv_results['test_recall_macro'].mean(), cv_results['test_recall_macro'].std() * 2))
print("F1 score: %0.2f (+/- %0.2f)" % (cv_results['test_f1_macro'].mean(), cv_results['test_f1_macro'].std() * 2))
# 训练最终模型
gnb.fit(X_train, y_train)
# 使用测试集评估最终模型性能
y_pred = gnb.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# 输出测试集上的性能指标
print("\nTest set performance:")
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 Score:", f1)
函数参数解释
- load_iris: 加载 Iris 数据集。
- train_test_split: 将数据集划分为训练集和测试集。
- stratify=y: 确保训练集和测试集中每个类别的比例与原始数据集中相同。
- GaussianNB: 实例化一个高斯朴素贝叶斯分类器。
- cross_validate: 进行交叉验证,并返回每次折叠的得分。
- return_train_score=True: 包括训练分数。
- make_scorer: 创建评分器对象。
- average='macro': 对于多分类问题,不考虑标签不平衡地平均每个类别的分数。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
- 训练集与测试集的一致性:可以看到交叉验证的测试准确率和最终测试集上的准确率几乎相同(都约为0.96),这说明模型的泛化能力较好,没有明显的过拟合现象。
- 各评估指标的表现:精度、召回率和F1值在交叉验证和测试集上都非常接近且非常高(均为0.96),这表明模型在识别各个类别方面表现均衡,既不会漏掉太多正样本也不会误判太多负样本为正样本。
- 模型选择:朴素贝叶斯在这种情况下表现良好,尤其是考虑到它的简单性和计算效率。然而,为了进一步确认模型的选择是否最优,可以尝试其他类型的分类器(如SVM、决策树等)并比较它们的结果。