12.5
实验五:BP 神经网络算法实现与测试
一、实验目的
深入理解 BP 神经网络的算法原理,能够使用 Python 语言实现 BP 神经网络的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练 BP 神经网络分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验五的部分。
三、算法步骤、代码、及结果
1. 算法伪代码
// 导入所需的库
import numpy, sklearn, sklearn.metrics
// 加载iris数据集并分割为训练集和测试集
load_iris_data()
split_data_into_train_test()
// 创建BP神经网络模型
create_mlp_model()
// 训练模型
train_model_with_training_data()
// 使用五折交叉验证评估模型
evaluate_model_with_cross_validation()
// 使用测试集测试模型性能
test_model_with_test_data()
// 打印性能指标
print_performance_metrics()
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, classification_report
def train_and_evaluate_model(X, y, test_size=1/3, random_state=42):
"""
使用多层感知器(MLP)分类器对鸢尾花数据集进行训练和评估。
参数:
X (array-like): 特征矩阵。
y (array-like): 目标向量。
test_size (float, 可选): 测试集占总数据集的比例,默认为1/3。
random_state (int, 可选): 控制数据集随机划分的随机数种子,默认为42。
返回:
None
"""
# 使用留出法留出1/3的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)
# 创建MLP分类器实例
mlp = MLPClassifier(hidden_layer_sizes=(10), max_iter=1000, alpha=0.01,
solver='sgd', verbose=0, random_state=random_state, learning_rate_init=0.01, power_t=0.5)
# 训练模型
mlp.fit(X_train, y_train)
# 训练结果
y_train_pred = mlp.predict(X_train)
print("训练集准确度:", accuracy_score(y_train, y_train_pred))
print("训练集分类报告:\n", classification_report(y_train, y_train_pred))
# 测试结果
y_test_pred = mlp.predict(X_test)
print("测试集准确度:", accuracy_score(y_test, y_test_pred))
print("测试集分类报告:\n", classification_report(y_test, y_test_pred))
# 加载iris数据集
iris = load_iris()
X, y = iris.data, iris.target
# 调用函数训练并评估模型
train_and_evaluate_model(X, y)
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
训练集分类报告分析:
类别0的精确度(precision)、召回率(recall)和F1分数(f1-score)都达到了1.00,说明模型对这个类别的预测非常准确。
类别1的召回率稍低,为0.94,但精确度和F1分数仍然很高,接近1.00。
类别2的精确度为0.94,召回率为1.00,F1分数为0.97,略低于类别0和1,但仍然表现良好。
测试集分类报告分析:
类别0的表现与训练集一致,精确度、召回率和F1分数都为1.00。
类别1的召回率略有下降至0.93,但精确度和F1分数仍然很高。
类别2的表现与训练集相似,精确度为0.94,召回率为1.00,F1分数为0.97。
总体表现:
模型在两个数据集上的准确度都为0.9,说明整体预测准确率很高。
宏平均(macro avg)和加权平均(weighted avg)的精确度、召回率和F1分数在两个数据集上都非常接近,这表明模型在各个类别上的表现较为均衡。
结论:
模型在训练集和测试集上的表现相似,说明模型具有良好的泛化能力,没有过拟合训练数据。
对于类别1,召回率略低于其他类别,可能需要进一步优化以提高对这一类别的识别能力。
可以考虑使用更多的数据、调整模型参数或尝试不同的模型结构来进一步提升模型性能。