实验五:BP神经网络算法实现与测试

一、实验目的

深入理解BP神经网络的算法原理,能够使用Python语言实现BP神经网络的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);

(2)使用训练集训练BP神经网络分类算法;

(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;

(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验五的部分。

三、算法步骤、代码、及结果

  1. 算法伪代码

加载数据集

划分训练集和测试集

创建 BP 神经网络模型

在训练集上训练模型 - 使用训练集 (X_train, y_train) 训练 BP 神经网络模型

使用五折交叉验证评估模型

输出交叉验证的结果- 输出平均准确率、精度、召回率和 F1 分数

在测试集上评估模型

输出测试集的结果 - 输出测试集的准确率、精度、召回率和 F1 分数

  1. 算法主要代码

完整源代码\调用库方法(函数参数说明)

(1)源代码

from sklearn import datasets

from sklearn.model_selection import train_test_split, cross_val_score, cross_validate

from sklearn.neural_network import MLPClassifier

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

from sklearn.model_selection import StratifiedKFold

import numpy as np

 

iris = datasets.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)

 

mlp = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000)

mlp.fit(X_train, y_train)

 

cv = StratifiedKFold(n_splits=5)

cv_results = cross_validate(mlp, X, y, cv=cv, scoring=['accuracy', 'precision_macro', 'recall_macro', 'f1_macro'])

 

mean_accuracy = np.mean(cv_results['test_accuracy'])

mean_precision = np.mean(cv_results['test_precision_macro'])

mean_recall = np.mean(cv_results['test_recall_macro'])

mean_f1 = np.mean(cv_results['test_f1_macro'])

 

print(f"\n交叉验证结果:")

print(f"准确率: {mean_accuracy:.4f}")

print(f"精度: {mean_precision:.4f}")

print(f"召回率: {mean_recall:.4f}")

print(f"F1: {mean_f1:.4f}")

 

y_pred = mlp.predict(X_test)

 

test_accuracy = accuracy_score(y_test, y_pred)

test_precision = precision_score(y_test, y_pred, average='macro')

test_recall = recall_score(y_test, y_pred, average='macro')

test_f1 = f1_score(y_test, y_pred, average='macro')

 

print(f"\n测试集结果:")

print(f"准确率: {test_accuracy:.4f}")

print(f"精度: {test_precision:.4f}")

print(f"召回率: {test_recall:.4f}")

print(f"F1: {test_f1:.4f}")

(2)参数说明

  1. datasets.load_iris()

功能:加载 iris 数据集(一个经典的多分类数据集,包含 150 个样本,每个样本有 4 个特征,标签有 3 类)。

返回值:返回一个包含数据和目标值的字典结构(包含属性 data 和 target)。

data:一个 150x4 的矩阵,包含每个样本的 4 个特征值。

target:一个包含 150 个样本类别的数组,标签值为 0, 1 或 2。

  1. train_test_split()

功能:将数据集分割为训练集和测试集。

参数:

X:特征数据

y:标签数据

test_size:测试集占总数据的比例

stratify:确保训练集和测试集中的标签分布一致,防止标签不均匀(y)。

random_state:用于控制数据划分的随机性,确保结果可重现。

返回值:返回四个值:训练集特征(X_train)、测试集特征(X_test)、训练集标签(y_train)、测试集标签(y_test)

  1. MLPClassifier()

功能:多层感知器(MLP)分类器,用于训练 BP 神经网络模型。

参数:

hidden_layer_sizes:指定隐藏层的结构

max_iter:最大迭代次数,用于训练过程中的最大迭代次数,防止无限迭代。

random_state:控制随机初始化,确保结果可重现。

返回值:返回一个 MLP 分类器对象。

  1. fit()

功能:训练模型。

参数:

X_train:训练集的特征数据。

y_train:训练集的标签数据。

返回值:无,直接训练模型。

  1. StratifiedKFold()

功能:交叉验证的分层划分方法,保证每一折的数据中各类别的比例与整体数据一致。

参数:

n_splits:交叉验证的折数

shuffle:是否打乱数据,默认为 False,设置为 True 时会打乱数据顺序。

random_state:控制随机性,确保数据划分的可重现性。

返回值:返回一个交叉验证的生成器对象,用于划分数据。

  1. cross_validate()

功能:交叉验证,返回训练和测试过程中指定指标的评分。

参数:

estimator:要使用的模型

X:特征数据。

y:标签数据。

cv:交叉验证方法,通常是 StratifiedKFold。

scoring:评分指标,传入一个列表以计算多个指标,例如 ['accuracy', 'precision_macro', 'recall_macro', 'f1_macro']。

返回值:返回一个包含交叉验证评分的字典,键值对应不同的评分指标,例如 test_accuracy、test_precision_macro、test_recall_macro、test_f1_macro 等。

  1. np.mean()

功能:计算数组或列表的均值。

参数:

a:输入数组或列表。

返回值:返回数组的均值。

  1. predict()

功能:使用训练好的模型进行预测。

参数:

X_test:测试集的特征数据。

返回值:返回预测结果,即每个测试样本的预测标签。

  1. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

四、实验结果分析

  1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
  2. 对比分析

1.测试集的准确率为 0.9800,意味着在所有测试样本中,约 98% 的样本被正确分类。这个准确率非常高,表明模型在大多数情况下能够做出正确的预测。

2.精度为 0.9804,表示在所有被模型预测为正类的样本中,有 98% 的样本确实是正类。精度的高值表明模型在避免将负类样本误分类为正类方面表现良好。

3.召回率为 0.9804,意味着在所有实际为正类的样本中,约 98% 被正确识别为正类。高召回率说明模型几乎没有漏掉任何正类样本,表现出很强的对正类的敏感度。

4.F1 分数为 0.9798,表明模型在精度和召回率之间找到了一个平衡。F1 分数接近 1,表明该模型在精度和召回率上没有明显的偏差,是一个综合性能良好的模型。

总体来看,测试集的结果非常理想。四个指标都接近于1,表明该模型的分类性能非常出色,能够在大部分情况下做出准确且精确的预测。这些结果表明 BP 神经网络模型在解决 iris 数据集的分类任务时,表现出了良好的泛化能力和较低的误分类率。

posted on 2024-12-10 09:16  leapss  阅读(17)  评论(0)    收藏  举报