共计 2153 个字符,预计需要花费 6 分钟才能阅读完成。
问题背景
鸢尾花分类是机器学习的经典案例,但实际应用时仍面临几个挑战:

- 特征非线性可分 :花瓣 / 萼片的长度和宽度之间存在复杂非线性关系
- 样本量有限 :原始数据集仅 150 条样本,容易导致模型过拟合
- 类别不平衡 :三个品种的样本分布为 50-50-50,但实际场景可能不同
对比传统方法:
- 逻辑回归:适合线性可分场景,但对非线性特征需要复杂特征工程
- SVM:通过核函数处理非线性问题,但调参复杂且不易解释
- BP 神经网络:自动学习特征组合,端到端训练更适合复杂模式识别
技术实现
数据预处理
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split
# 加载数据
df = pd.read_csv('iris.csv')
X = df.drop('species', axis=1)
y = df['species']
# 标签编码
le = LabelEncoder()
y_encoded = le.fit_transform(y)
# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_encoded, test_size=0.2, random_state=42)
网络构建
使用 Keras 构建含 1 个隐藏层的 BP 网络:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping
model = Sequential([Dense(6, activation='relu', input_shape=(4,)), # 隐藏层
Dense(3, activation='softmax') # 输出层
])
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 早停法防止过拟合
es = EarlyStopping(monitor='val_loss', patience=5)
history = model.fit(
X_train, y_train,
validation_split=0.2,
epochs=200,
batch_size=16,
callbacks=[es])
选择 ReLU 激活函数的优势:
- 缓解梯度消失问题
- 计算效率高于 sigmoid/tanh
- 产生稀疏激活更有利于特征选择
优化策略
超参数调优
使用网格搜索寻找最优参数组合:
param_grid = {'batch_size': [8, 16, 32],
'learning_rate': [0.01, 0.001, 0.0001]}
# 通过交叉验证评估不同组合
for bs in param_grid['batch_size']:
for lr in param_grid['learning_rate']:
model.optimizer.lr = lr
model.fit(X_train, y_train, batch_size=bs, ...)
训练监控
可视化训练过程:
plt.plot(history.history['accuracy'], label='train')
plt.plot(history.history['val_accuracy'], label='val')
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend()
模型评估
生成混淆矩阵:
from sklearn.metrics import confusion_matrix
y_pred = model.predict(X_test)
y_pred_classes = np.argmax(y_pred, axis=1)
cm = confusion_matrix(y_test, y_pred_classes)
sns.heatmap(cm, annot=True, fmt='d')
生产建议
数据增强
当样本不足时可采用:
- SMOTE 过采样:创建合成样本保持类别平衡
- 添加高斯噪声:对特征值施加微小扰动
- 特征组合:创建新的交互特征
模型部署
边缘设备部署注意事项:
- 使用 TensorFlow Lite 进行模型量化
- 将标准化参数固化到模型输入层
- 限制浮点运算精度以减少资源消耗
安全防御
对抗样本防护方案:
- 输入范围检查(如花瓣长度不可能为负值)
- 对抗训练:在训练集中加入 FGSM 生成的对抗样本
- 模型集成:多个模型投票降低攻击成功率
开放问题
如何改进为多任务学习框架?可考虑:
- 共享底层特征提取层
- 为不同品种设计专属输出头
- 引入辅助任务(如预测花瓣宽长比)
通过本次实践可以看到,BP 神经网络在小型分类任务上也能达到 98% 的准确率。关键要处理好数据标准化、网络深度与早停法的平衡。建议在实际项目中先从小网络开始,逐步增加复杂度。
正文完
