基于BP神经网络的鸢尾花分类预测实战:从数据预处理到模型调优

1次阅读
没有评论

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

image.webp

问题背景

鸢尾花分类是机器学习的经典案例,但实际应用时仍面临几个挑战:

基于 BP 神经网络的鸢尾花分类预测实战:从数据预处理到模型调优

  1. 特征非线性可分 :花瓣 / 萼片的长度和宽度之间存在复杂非线性关系
  2. 样本量有限 :原始数据集仅 150 条样本,容易导致模型过拟合
  3. 类别不平衡 :三个品种的样本分布为 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 激活函数的优势:

  1. 缓解梯度消失问题
  2. 计算效率高于 sigmoid/tanh
  3. 产生稀疏激活更有利于特征选择

优化策略

超参数调优

使用网格搜索寻找最优参数组合:

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')

生产建议

数据增强

当样本不足时可采用:

  1. SMOTE 过采样:创建合成样本保持类别平衡
  2. 添加高斯噪声:对特征值施加微小扰动
  3. 特征组合:创建新的交互特征

模型部署

边缘设备部署注意事项:

  1. 使用 TensorFlow Lite 进行模型量化
  2. 将标准化参数固化到模型输入层
  3. 限制浮点运算精度以减少资源消耗

安全防御

对抗样本防护方案:

  1. 输入范围检查(如花瓣长度不可能为负值)
  2. 对抗训练:在训练集中加入 FGSM 生成的对抗样本
  3. 模型集成:多个模型投票降低攻击成功率

开放问题

如何改进为多任务学习框架?可考虑:

  1. 共享底层特征提取层
  2. 为不同品种设计专属输出头
  3. 引入辅助任务(如预测花瓣宽长比)

通过本次实践可以看到,BP 神经网络在小型分类任务上也能达到 98% 的准确率。关键要处理好数据标准化、网络深度与早停法的平衡。建议在实际项目中先从小网络开始,逐步增加复杂度。

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