imbalanced-learn 项目中的常见陷阱与最佳实践指南
前言
在机器学习项目中处理类别不平衡数据时,imbalanced-learn 是一个强大的工具库。然而,如果不正确使用其重采样技术,可能会导致严重的数据泄露问题,使模型评估结果过于乐观。本文将深入探讨这一常见陷阱,并提供专业的最佳实践建议。
数据泄露问题详解
什么是数据泄露?
数据泄露是指模型在训练过程中接触到了预测时不应获得的信息,导致评估指标虚高。在类别不平衡处理的场景下,最常见的泄露形式是在数据集拆分前进行全局重采样。
错误做法的影响
- 不真实的测试环境:全局重采样后,训练集和测试集都可能变得平衡,而实际应用中数据仍是不平衡的
- 信息污染:重采样过程可能利用测试集样本信息生成新样本,导致模型间接"看到"了测试数据
实例演示
数据集准备
我们使用成人收入普查数据集,并人为增加其不平衡程度:
from sklearn.datasets import fetch_openml
from imblearn.datasets import make_imbalance
X, y = fetch_openml(data_id=1119, as_frame=True, return_X_y=True)
X = X.select_dtypes(include="number")
X, y = make_imbalance(X, y, sampling_strategy={">50K": 300}, random_state=1)
原始类别比例约为98.8% vs 1.2%,严重不平衡。
基准模型表现
使用梯度提升树作为基线模型,未处理不平衡问题:
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import cross_validate
model = HistGradientBoostingClassifier(random_state=0)
cv_results = cross_validate(
model, X, y, scoring="balanced_accuracy",
return_train_score=True, return_estimator=True,
n_jobs=-1
)
平衡准确率约为0.609,表现不佳。
错误的重采样方式
错误做法:在拆分前对整个数据集进行欠采样
from imblearn.under_sampling import RandomUnderSampler
sampler = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = sampler.fit_resample(X, y)
model = HistGradientBoostingClassifier(random_state=0)
cv_results = cross_validate(
model, X_resampled, y_resampled, scoring="balanced_accuracy",
return_train_score=True, return_estimator=True,
n_jobs=-1
)
虽然交叉验证显示平衡准确率达到0.724,但在保留测试集上只有0.698,存在明显的评估偏差。
正确实践:使用Pipeline
为什么使用Pipeline?
Pipeline能确保重采样只在训练折叠内进行,完全避免了数据泄露:
from imblearn.pipeline import make_pipeline
model = make_pipeline(
RandomUnderSampler(random_state=0),
HistGradientBoostingClassifier(random_state=0)
)
cv_results = cross_validate(
model, X, y, scoring="balanced_accuracy",
return_train_score=True, return_estimator=True,
n_jobs=-1
)
验证结果
交叉验证结果(0.732)与保留测试集结果(0.727)高度一致,证明了评估的可靠性。
关键要点总结
- 拆分前不重采样:永远不要在数据集拆分前进行任何重采样操作
- 使用Pipeline:将重采样器与模型封装在Pipeline中,确保流程正确
- 验证一致性:通过保留测试集验证交叉验证结果的可靠性
- 保持测试集原始分布:测试集应保持原始不平衡分布,反映真实场景
进阶建议
- 对于严重不平衡数据,考虑结合多种技术(如SMOTE过采样+欠采样)
- 尝试不同的评估指标,如F1-score、AUC-ROC等,全面评估模型性能
- 在超参数调优时,同样需要将重采样步骤包含在交叉验证流程中
正确使用imbalanced-learn的重采样技术,可以显著提升模型在不平衡数据上的表现,但必须遵循正确的流程以避免数据泄露问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考