11.4
实验五:BP神经网络算法实现与测试
一、实验目的
深入理解 BP 神经网络的算法原理,能够使用 Python 语言实现 BP 神经网络的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练 BP 神经网络分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验五的推荐参考书:[1] 范淼, 李超. Python 机器学习及实践, 清华大学出版社.
[2] Peter Harrington. 机器学习实战, 人民邮电出版社。
部分。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 初始化
- 随机初始化神经网络的权重和偏置,权重通常很小,偏置可以初始化为零或小值。
- 设定学习率 η,最大迭代次数 max_iter,目标误差 tolerance(如果有)。
2. 对每一轮迭代 (epoch)
- 1. 对每个训练样本 (x, y)
- 前向传播:
1. 对于每一层 l 从输入层到输出层:
- 计算加权输入: z^l = W^l * a^(l-1) + b^l
- 计算激活输出: a^l = activation(z^l)(通常使用 Sigmoid 或 ReLU 激活函数)
2. 得到输出层的预测值: a^L(输出层的激活值)
- 计算损失(误差):
- L = loss_function(y, a^L) // 计算实际输出与预测输出的误差(如 MSE 或交叉熵)
- 反向传播:
1. 从输出层开始反向传播误差:
- 计算输出层的误差: δ^L = (a^L - y) * activation_derivative(z^L)
2. 对每一层 l 从 L-1 到 1:
- 计算当前层的误差: δ^l = (W^(l+1))^T * δ^(l+1) * activation_derivative(z^l)
3. 更新权重和偏置:
- 对每一层 l:
- W^l = W^l - η * δ^l * (a^(l-1))^T
- b^l = b^l - η * δ^l
- 2. 计算当前迭代的损失
- 如果损失小于预设的 tolerance 或达到最大迭代次数 max_iter,停止训练。
3. 返回训练好的权重和偏置。
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
import numpy as np from sklearn.model_selection import train_test_split, KFold, cross_val_score from sklearn.preprocessing import StandardScaler from sklearn.neural_network import MLPClassifier from sklearn.datasets import load_iris from sklearn.metrics import classification_report # 加载 iris 数据集 iris = load_iris() X = iris.data y = iris.target # 留出法,将数据集划分为 2/3 训练集和 1/3 测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y) # 标准化特征值 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 创建 BP 神经网络分类器 model = MLPClassifier( hidden_layer_sizes=(50, 50), # 增加隐藏层数量 max_iter=2000, # 增加最大迭代次数 learning_rate_init=0.001, # 设置学习率 solver='adam', # 使用 adam 优化器 tol=1e-6, # 设置收敛容忍度 random_state=42, early_stopping=True, # 启用提前停止 validation_fraction=0.1, # 设置验证集比例 n_iter_no_change=10 # 训练过程中,验证集精度不变时停止训练 ) # 训练模型 model.fit(X_train, y_train) # 查看训练后的模型准确度 train_accuracy = model.score(X_train, y_train) print(f"训练集准确度: {train_accuracy:.4f}") # 使用五折交叉验证进行评估 kf = KFold(n_splits=5, shuffle=True, random_state=42) cross_val_results = cross_val_score(model, X, y, cv=kf, scoring='accuracy') print(f"五折交叉验证平均准确度: {cross_val_results.mean():.4f}") # 使用测试集评估模型 y_pred = model.predict(X_test) # 输出分类报告 report = classification_report(y_test, y_pred) print("分类报告:\n", report)
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!