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、决策树等)并比较它们的结果。
posted @ 2024-12-18 18:01  七安。  阅读(10)  评论(0编辑  收藏  举报