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

1次阅读
没有评论

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

image.webp

背景介绍

Iris 数据集是机器学习领域的经典数据集,包含 150 个样本,每个样本有 4 个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和 1 个类别标签(Setosa、Versicolor、Virginica)。BP 神经网络是一种多层前馈神经网络,通过误差反向传播算法调整权重和偏置,适用于解决分类和回归问题。

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

痛点分析

初学者在使用 BP 神经网络进行 Iris 分类时,常遇到以下问题:

  • 数据未标准化,导致模型收敛困难
  • 隐藏层设计不合理,模型性能不佳
  • 学习率设置不当,训练过程不稳定
  • 未使用早停法,导致过拟合
  • 评估指标选择不当,无法全面衡量模型性能

完整实现

数据加载与预处理

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

网络结构设计

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([Dense(8, activation='relu', input_shape=(4,)),  # 输入层和隐藏层
    Dense(3, activation='softmax')  # 输出层
])

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

模型调优

学习率调整

from tensorflow.keras.optimizers import Adam

optimizer = Adam(learning_rate=0.01)
model.compile(optimizer=optimizer,
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

批量大小影响

history = model.fit(X_train, y_train, 
                    batch_size=16, 
                    epochs=100, 
                    validation_split=0.2)

早停法实现

from tensorflow.keras.callbacks import EarlyStopping

early_stopping = EarlyStopping(monitor='val_loss', patience=5)
history = model.fit(X_train, y_train, 
                    batch_size=16, 
                    epochs=100, 
                    validation_split=0.2,
                    callbacks=[early_stopping])

避坑指南

数据泄露预防

  • 标准化前划分训练集和测试集
  • 仅使用训练集计算标准化参数

过拟合处理

  • 添加 Dropout 层
  • 使用 L2 正则化
  • 早停法

分类指标选择

  • 准确率适用于类别平衡的数据
  • 混淆矩阵更能反映模型在各类别上的表现

性能评估

import matplotlib.pyplot as plt

# 绘制训练和验证的准确率曲线
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper left')
plt.show()

# 评估模型
loss, accuracy = model.evaluate(X_test, y_test)
print(f'Test accuracy: {accuracy:.2f}')

延伸思考

  1. 如何将此模型应用到其他分类问题?
  2. 除了准确率,还有哪些指标可以评估分类模型性能?
  3. 如何处理类别不平衡问题?
  4. 如何优化网络结构以提高模型性能?
  5. 有哪些其他神经网络结构可以用于分类问题?
正文完
 0
评论(没有评论)