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分数。

模型在测试集上的表现优于训练集,这表明模型具有良好的泛化能力,能够很好地处理新数据。这种性能的提升对于实际应用来说是非常重要的,因为它意味着模型在面对真实世界的数据时,能够提供可靠的预测

posted @ 2024-11-05 17:44  Hbro  阅读(21)  评论(0)    收藏  举报