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

 

 

posted @   奶油冰激凌  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示