BP神经网络实战:从零构建鸢尾花分类模型

1次阅读
没有评论

共计 1907 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景与痛点

鸢尾花分类是机器学习入门的经典案例,但很多初学者在实践 BP 神经网络时会遇到几个典型问题:

BP 神经网络实战:从零构建鸢尾花分类模型

  • 不知道如何设计网络结构(层数、神经元数量)
  • 遇到梯度消失导致训练停滞
  • 模型在训练集表现良好但测试集差(过拟合)
  • 参数调整缺乏方法论(学习率、batch_size 等)

BP 神经网络特别适合这类特征明确的中小型数据集,通过反向传播自动学习特征组合,比传统算法(如 SVM)有更强的非线性分类能力。

技术方案选择

对比不同网络结构后发现:

  1. 单隐层网络 :在鸢尾花数据集(150 个样本,4 个特征)上已经足够,增加层数反而容易过拟合
  2. 激活函数 :隐藏层使用 ReLU 解决梯度消失问题,输出层用 Softmax 处理多分类
  3. 优化器 :Adam 自适应调整学习率,比 SGD 更稳定

完整实现步骤

环境准备

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.regularizers import l2

数据预处理

  1. 加载数据集并划分:

    iris = load_iris()
    X, y = iris.data, iris.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

  2. 数据标准化(关键!):

    scaler = StandardScaler()
    X_train = scaler.fit_transform(X_train)
    X_test = scaler.transform(X_test)  # 注意用相同的 scaler

模型构建

model = Sequential([
    # 输入层(4 个特征)和第一个隐藏层
    Dense(16, activation='relu', 
          kernel_regularizer=l2(0.01),
          input_shape=(4,)),
    Dropout(0.2),  # 随机丢弃 20% 神经元防过拟合

    # 输出层(3 个类别)Dense(3, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

训练配置

history = model.fit(
    X_train, y_train,
    epochs=200,
    batch_size=16,
    validation_split=0.2,
    verbose=0  # 不输出进度条
)

模型评估

  1. 绘制学习曲线:

    import matplotlib.pyplot as plt
    
    plt.plot(history.history['accuracy'], label='训练集')
    plt.plot(history.history['val_accuracy'], label='验证集')
    plt.title('模型准确率变化')
    plt.legend()
    plt.show()

  2. 测试集最终评估:

    loss, acc = model.evaluate(X_test, y_test)
    print(f'测试集准确率: {acc:.2%}')

典型输出:

 测试集准确率: 96.67%

避坑指南

  • 数据标准化必须做 :鸢尾花的花瓣长度等特征量纲差异大,不标准化会导致梯度更新震荡
  • 过拟合应对策略 :
  • 添加 Dropout 层(如 0.2 概率随机失活)
  • 使用 L2 正则化(代码中的 kernel_regularizer)
  • 早停法(监控 val_loss 停止训练)
  • 学习率调整 :
  • 初始用 Adam 默认值(0.001)
  • 如果训练波动大,尝试减小 10 倍

延伸思考

  1. 扩展到其他分类任务:
  2. 修改 input_shape 匹配新特征数量
  3. 调整输出层神经元数量等于类别数
  4. 对于二分类问题改用 sigmoid 激活

  5. 实验建议:

  6. 尝试增加隐藏层观察是否提升效果
  7. 将 Dropout 率调整为 0.5 看对过拟合的影响
  8. 用不同的随机种子测试模型稳定性

  9. 生产环境优化方向:

  10. 添加模型保存 / 加载功能
  11. 实现实时预测 API
  12. 使用混淆矩阵分析错误样本

通过这个项目,你会发现神经网络并不神秘。关键是通过实践理解参数间的相互影响,建议反复调整超参数观察模型行为,这是掌握神经网络最有效的方式。

正文完
 0
评论(没有评论)