共计 1907 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
鸢尾花分类是机器学习入门的经典案例,但很多初学者在实践 BP 神经网络时会遇到几个典型问题:

- 不知道如何设计网络结构(层数、神经元数量)
- 遇到梯度消失导致训练停滞
- 模型在训练集表现良好但测试集差(过拟合)
- 参数调整缺乏方法论(学习率、batch_size 等)
BP 神经网络特别适合这类特征明确的中小型数据集,通过反向传播自动学习特征组合,比传统算法(如 SVM)有更强的非线性分类能力。
技术方案选择
对比不同网络结构后发现:
- 单隐层网络 :在鸢尾花数据集(150 个样本,4 个特征)上已经足够,增加层数反而容易过拟合
- 激活函数 :隐藏层使用 ReLU 解决梯度消失问题,输出层用 Softmax 处理多分类
- 优化器 :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
数据预处理
-
加载数据集并划分:
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) -
数据标准化(关键!):
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 # 不输出进度条
)
模型评估
-
绘制学习曲线:
import matplotlib.pyplot as plt plt.plot(history.history['accuracy'], label='训练集') plt.plot(history.history['val_accuracy'], label='验证集') plt.title('模型准确率变化') plt.legend() plt.show() -
测试集最终评估:
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 倍
延伸思考
- 扩展到其他分类任务:
- 修改 input_shape 匹配新特征数量
- 调整输出层神经元数量等于类别数
-
对于二分类问题改用 sigmoid 激活
-
实验建议:
- 尝试增加隐藏层观察是否提升效果
- 将 Dropout 率调整为 0.5 看对过拟合的影响
-
用不同的随机种子测试模型稳定性
-
生产环境优化方向:
- 添加模型保存 / 加载功能
- 实现实时预测 API
- 使用混淆矩阵分析错误样本
通过这个项目,你会发现神经网络并不神秘。关键是通过实践理解参数间的相互影响,建议反复调整超参数观察模型行为,这是掌握神经网络最有效的方式。
正文完
发表至: 未分类
四天前
