共计 2057 个字符,预计需要花费 6 分钟才能阅读完成。
在机器学习项目中,数据质量往往决定了模型性能的上限。今天我们就来聊聊如何通过系统化的数据预处理和训练策略优化,让 BP 神经网络真正发挥潜力。以下是我们在金融风控项目中总结的实战方案,同样适用于图像识别等其他场景。

一、数据清洗:给模型喂干净的食物
原始数据就像未经处理的食材,直接下锅肯定影响口味。我们遇到的主要问题包括:
- 15% 的样本存在缺失值
- 约 5% 的样本包含明显异常值(如年龄 =200 岁)
- 文本字段中存在乱码和特殊符号
使用 Pandas 进行数据清洗的典型操作:
import pandas as pd
import numpy as np
# 加载原始数据
df = pd.read_csv('raw_data.csv')
# 处理缺失值
num_cols = ['age', 'income']
cat_cols = ['education', 'job_type']
# 数值列用中位数填充
df[num_cols] = df[num_cols].fillna(df[num_cols].median())
# 类别列用众数填充
for col in cat_cols:
df[col] = df[col].fillna(df[col].mode()[0])
# 移除超出合理范围的异常值
df = df[(df['age'] > 18) & (df['age'] < 100)]
二、特征标准化:统一度量衡
当特征尺度差异较大时(如年龄范围 18-100,而收入范围 0 -100 万),神经网络会难以收敛。我们使用 Sklearn 的 StandardScaler 进行 Z -score 标准化:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df[num_cols])
# 将标准化后的特征合并回 DataFrame
df_scaled = pd.concat([pd.DataFrame(scaled_features, columns=num_cols),
df[cat_cols + ['label']]
], axis=1)
三、解决类别不平衡:SMOTE 过采样
在二分类问题中,当正负样本比例达到 1:10 时,模型会严重偏向多数类。我们使用 imbalanced-learn 库的 SMOTE 方法:
from imblearn.over_sampling import SMOTE
X = df_scaled.drop('label', axis=1)
y = df_scaled['label']
# 使用 SMOTE 生成新样本
sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)
# 查看平衡后的类别分布
print(pd.Series(y_res).value_counts())
四、动态学习率调整
固定学习率要么收敛慢,要么容易震荡。PyTorch 的 ReduceLROnPlateau 策略能根据验证集表现自动调整:
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import ReduceLROnPlateau
# 定义模型和优化器
model = SimpleMLP(input_dim=X_res.shape[1])
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
scheduler = ReduceLROnPlateau(optimizer, 'min', patience=3, factor=0.5)
for epoch in range(100):
train_loss = train_one_epoch(model, train_loader, optimizer)
val_loss = validate(model, val_loader)
# 根据验证损失调整学习率
scheduler.step(val_loss)
# 打印当前学习率
print(f'Epoch {epoch}, LR: {optimizer.param_groups[0]["lr"]:.6f}')
五、避坑指南
- 数据泄漏预防:
- 先划分训练 / 测试集再进行特征工程
-
标准化参数(均值、方差)只能从训练集计算
-
批量大小与学习率:
- 经验公式:新学习率 = 原学习率 × (新批量大小 / 原批量大小)
-
大批量需要更大学习率,但不超过 0.1
-
早停法实现:
- 监控验证集损失而非训练损失
- 典型 patience 设为 5 -10 个 epoch
六、效果对比
| 优化步骤 | 训练时间(秒) | 验证准确率 |
|---|---|---|
| 原始数据 | 183 | 68.2% |
| 清洗 + 标准化 | 162 | 72.5% |
| +SMOTE | 175 | 76.8% |
| + 动态 LR | 158 | 79.3% |
七、下一步探索
- 实践推荐:Kaggle 信用卡欺诈检测数据集
- 思考题:在图像数据中,除了 SMOTE 还有哪些数据增强 (Data Augmentation) 方法能改善类别不平衡?
希望这套方案能帮助你少走弯路。记住:好的数据预处理相当于成功了一半,剩下的一半就交给调参工程师的耐心了。
正文完
