一、问题现象与诊断
当使用SMOTEENN(组合SMOTE过采样与Edited Nearest Neighbours欠采样)处理极端不平衡数据集时(如1:100的类别比例),常见出现以下症状:
- 少数类样本被过拟合生成大量噪声样本
- 多数类样本被过度清洗导致信息丢失
- 最终采样后的决策边界扭曲变形
- 分类器AUC-ROC指标不升反降
二、根本原因分析
通过class_distribution可视化可发现,原始数据的偏斜分布导致两个阶段出现问题:
- SMOTE阶段:当少数样本少于k_neighbors默认值(5)时,算法会重复生成线性组合样本
- ENN阶段:近邻规则在高度不平衡场景下会误删边界样本
# 诊断代码示例
from collections import Counter
print("原始分布:", Counter(y_train))
sm = SMOTEENN()
X_res, y_res = sm.fit_resample(X_train, y_train)
print("采样后分布:", Counter(y_res))
三、7种优化解决方案
| 方法 | 实现代码 | 适用场景 |
|---|---|---|
| 调整采样比例 | sampling_strategy={0:1000,1:500} |
已知目标分布时 |
| 分层数据分割 | StratifiedKFold(n_splits=5) |
交叉验证场景 |
3.1 动态k值优化
通过网格搜索寻找最优k_neighbors值:
from sklearn.model_selection import GridSearchCV
params = {'smote__k_neighbors': [3,5,7]}
gs = GridSearchCV(SMOTEENN(), params)
gs.fit(X, y)
四、进阶技巧
结合集成学习提升效果:
- 使用BalancedRandomForest替代单一分类器
- 采用Stacking集成多个采样结果