11/4
实验五:BP 神经网络算法实现与测试
一、实验目的
深入理解 BP 神经网络的算法原理,能够使用 Python 语言实现 BP 神经网络的训练与测 试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练 BP 神经网络分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验五的
三、算法步骤、代码、及结果
1. 算法伪代码
1. 加载iris数据集
2. 将数据集分割为训练集和测试集
3. 初始化BP神经网络分类器,设置隐藏层大小和最大迭代次数
4. 在训练集上训练BP神经网络
5. 使用五折交叉验证评估训练集上的模型性能
6. 在训练集上计算性能指标(准确度、精度、召回率和F1值)
7. 在测试集上进行预测
8. 计算测试集的性能指标(准确度、精度、召回率和F1值)
9. 打印训练集和测试集的性能指标
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import cross_val_score
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)
# 初始化BP神经网络分类器
bp_clf = MLPClassifier(hidden_layer_sizes=(50,), # 一个隐藏层,50个神经元
max_iter=1000, # 最大迭代次数
random_state=42)
# 训练模型
bp_clf.fit(X_train, y_train)
# 使用五折交叉验证评估模型
scores = cross_val_score(bp_clf, X_train, y_train, cv=5, scoring='accuracy')
# 训练最终模型
bp_clf.fit(X_train, y_train)
# 计算性能指标
y_pred = bp_clf.predict(X_train)
accuracy = accuracy_score(y_train, y_pred)
precision = precision_score(y_train, y_pred, average='macro')
recall = recall_score(y_train, y_pred, average='macro')
f1 = f1_score(y_train, y_pred, average='macro')
print(f"Accuracy: {accuracy:.2f}")
print(f"Precision: {precision:.2f}")
print(f"Recall: {recall:.2f}")
print(f"F1 Score: {f1:.2f}")
# 使用测试集进行预测
y_pred_test = bp_clf.predict(X_test)
# 计算测试集的性能指标
test_accuracy = accuracy_score(y_test, y_pred_test)
test_precision = precision_score(y_test, y_pred_test, average='macro')
test_recall = recall_score(y_test, y_pred_test, average='macro')
test_f1 = f1_score(y_test, y_pred_test, average='macro')
# 打印测试集的性能指标
print(f"Test Accuracy: {test_accuracy:.2f}")
print(f"Test Precision: {test_precision:.2f}")
print(f"Test Recall: {test_recall:.2f}")
print(f"Test F1 Score: {test_f1:.2f}")
参数说明:
MLPClassifier(hidden_layer_sizes=(100,),max_iter=200, random_state=None)
- 功能:初始化多层感知器(MLP)分类器。
- 参数:
- hidden_layer_sizes:隐藏层的大小或层数,默认为(100,)。
- max_iter:最大迭代次数,默认为200。
- random_state:随机数种子,用于初始化权重,默认为None。
- 返回值:MLPClassifier对象。
cross_val_score(estimator, X, y, cv=5, scoring=None)
- 功能:使用交叉验证评估模型性能。
- 参数:
- estimator:估计器(模型)。
- X:特征数据。
- y:目标值。
- cv:交叉验证的折数,默认为5。
- scoring:评分方法,默认为None,需要指定评分方法,如'accuracy'。
- 返回值:包含每次交叉验证的分数数组。
accuracy_score(y_true, y_pred)
- 功能:计算准确度。
- 参数:
- y_true:真实目标值。
- y_pred:预测目标值。
- 返回值:准确度分数。
precision_score(y_true, y_pred, average='binary')
- 功能:计算精度。
- 参数:
- y_true:真实目标值。
- y_pred:预测目标值。
- average:计算多个类别的平均方式,默认为'binary'。
- 返回值:精度分数。
recall_score(y_true, y_pred, average='binary')
- 功能:计算召回率。
- 参数:
- y_true:真实目标值。
- y_pred:预测目标值。
- average:计算多个类别的平均方式,默认为'binary'。
- 返回值:召回率分数。
f1_score(y_true, y_pred, average='binary')
- 功能:计算F1值。
- 参数:
- y_true:真实目标值。
- y_pred:预测目标值。
- average:计算多个类别的平均方式,默认为'binary'。
- 返回值:F1值分数。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
训练集和测试集的性能指标几乎相同,这表明模型在训练数据和新数据上都能保持一致的预测性能。模型在测试集上的表现与训练集相似,说明模型具有很好的泛化能力,能够有效地从训练数据中学习并应用到新的数据。由于训练集和测试集的性能非常接近,这可能意味着模型没有过拟合。模型在不同的数据集上都能保持高准确度,这表明模型是稳定的。