一、实验目的
深入理解BP神经网络的算法原理,能够使用Python语言实现BP神经网络的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练BP神经网络分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验五的部分。
三、算法步骤、代码、及结果
- 算法伪代码
加载数据集
划分训练集和测试集
创建 BP 神经网络模型
在训练集上训练模型 - 使用训练集 (X_train, y_train) 训练 BP 神经网络模型
使用五折交叉验证评估模型
输出交叉验证的结果- 输出平均准确率、精度、召回率和 F1 分数
在测试集上评估模型
输出测试集的结果 - 输出测试集的准确率、精度、召回率和 F1 分数
- 算法主要代码
完整源代码\调用库方法(函数参数说明)
(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)参数说明
- datasets.load_iris()
功能:加载 iris 数据集(一个经典的多分类数据集,包含 150 个样本,每个样本有 4 个特征,标签有 3 类)。
返回值:返回一个包含数据和目标值的字典结构(包含属性 data 和 target)。
data:一个 150x4 的矩阵,包含每个样本的 4 个特征值。
target:一个包含 150 个样本类别的数组,标签值为 0, 1 或 2。
- train_test_split()
功能:将数据集分割为训练集和测试集。
参数:
X:特征数据
y:标签数据
test_size:测试集占总数据的比例
stratify:确保训练集和测试集中的标签分布一致,防止标签不均匀(y)。
random_state:用于控制数据划分的随机性,确保结果可重现。
返回值:返回四个值:训练集特征(X_train)、测试集特征(X_test)、训练集标签(y_train)、测试集标签(y_test)
- MLPClassifier()
功能:多层感知器(MLP)分类器,用于训练 BP 神经网络模型。
参数:
hidden_layer_sizes:指定隐藏层的结构
max_iter:最大迭代次数,用于训练过程中的最大迭代次数,防止无限迭代。
random_state:控制随机初始化,确保结果可重现。
返回值:返回一个 MLP 分类器对象。
- fit()
功能:训练模型。
参数:
X_train:训练集的特征数据。
y_train:训练集的标签数据。
返回值:无,直接训练模型。
- StratifiedKFold()
功能:交叉验证的分层划分方法,保证每一折的数据中各类别的比例与整体数据一致。
参数:
n_splits:交叉验证的折数
shuffle:是否打乱数据,默认为 False,设置为 True 时会打乱数据顺序。
random_state:控制随机性,确保数据划分的可重现性。
返回值:返回一个交叉验证的生成器对象,用于划分数据。
- 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 等。
- np.mean()
功能:计算数组或列表的均值。
参数:
a:输入数组或列表。
返回值:返回数组的均值。
- predict()
功能:使用训练好的模型进行预测。
参数:
X_test:测试集的特征数据。
返回值:返回预测结果,即每个测试样本的预测标签。
- 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
- 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
- 对比分析
1.测试集的准确率为 0.9800,意味着在所有测试样本中,约 98% 的样本被正确分类。这个准确率非常高,表明模型在大多数情况下能够做出正确的预测。
2.精度为 0.9804,表示在所有被模型预测为正类的样本中,有 98% 的样本确实是正类。精度的高值表明模型在避免将负类样本误分类为正类方面表现良好。
3.召回率为 0.9804,意味着在所有实际为正类的样本中,约 98% 被正确识别为正类。高召回率说明模型几乎没有漏掉任何正类样本,表现出很强的对正类的敏感度。
4.F1 分数为 0.9798,表明模型在精度和召回率之间找到了一个平衡。F1 分数接近 1,表明该模型在精度和召回率上没有明显的偏差,是一个综合性能良好的模型。
总体来看,测试集的结果非常理想。四个指标都接近于1,表明该模型的分类性能非常出色,能够在大部分情况下做出准确且精确的预测。这些结果表明 BP 神经网络模型在解决 iris 数据集的分类任务时,表现出了良好的泛化能力和较低的误分类率。
浙公网安备 33010602011771号