类别不平衡建模:过采样与欠采样选型及效果异常排查
问题1:过采样方案指标虚高、测试集全量预测为多数类的核心原因
核心是两个问题叠加:
- 最主要原因是数据泄露:从给出的代码逻辑看,是直接对全量数据集执行
SMOTE.fit_resample(),之后才拆分训练集、验证集、测试集。这种操作会让SMOTE生成的合成少数类样本同时出现在训练集和验证集中,相当于验证集的样本模型早就在训练阶段接触过,自然能拿到97%以上的虚高指标。但测试集是完全未参与采样的真实分布数据,模型根本没有学到真实少数类的泛化特征,本质和随机猜测没有区别——测出来过采样方案平衡准确率刚好50%,就是全猜多数类的典型表现。 - 其次是原始SMOTE算法本身的缺陷:SMOTE通过少数类样本间线性插值生成新样本,如果原始少数类存在噪声、或者和多数类的特征边界重叠度高,生成的合成样本很多是无效噪声,不仅不能帮模型学习少数类特征,还会干扰决策边界的判断,在流程错误的基础上进一步放大了过拟合问题。
问题2:两种采样方案的效果对比
当前落地场景下欠采样方案效果显著更优:
过采样方案的97%准确率、F1等指标完全是验证流程错误导致的虚假结果,实际平衡准确率只有50%,完全不具备少数类识别能力,没有落地价值。欠采样方案虽然表面准确率只有85%,但这个结果是在真实分布的测试集上得到的,平衡准确率达84%,对少数类的识别能力是真实有效的;表面准确率低只是因为欠采样丢弃了部分多数类样本,模型对多数类的判断精度略有下降,在不平衡分类任务中,少数类识别能力才是核心目标,因此欠采样方案实际效果远好于流程错误的过采样方案。
问题3:不平衡数据集是否需要用平衡准确率作为评估指标
需要,但不能仅用平衡准确率作为唯一评估标准:
- 普通准确率在不平衡场景下完全没有参考价值:以该数据集为例,即使模型把所有样本都预测为多数类,准确率也能达到45000/(45000+1500)≈96.8%,和过采样得到的97%准确率几乎一致,完全无法体现模型对少数类的识别能力。
- 平衡准确率通过给两个类别赋予相同权重,计算各类别召回率的算术平均值,不会被占比极高的多数类结果带偏,能真实反映模型对两个类别的综合识别能力,是不平衡场景下比普通准确率靠谱得多的基础评估指标。
- 但平衡准确率也有局限性,它无法体现少数类识别的精确率、召回率权衡:如果业务场景漏检少数类代价极高(如欺诈识别、重症诊断),需要优先关注少数类召回率;如果误判少数类代价高(如营销触达),需要优先关注少数类精确率。实际评估时要结合混淆矩阵、少数类F1值、PR-AUC等指标综合判断,不能只看平衡准确率。
问题4:可尝试的其他优化方案
- 第一优先级先修正验证流程:所有数据预处理操作(采样、归一化、特征选择等)必须在数据集拆分之后执行,且只能在训练集上拟合、应用,验证集和测试集必须保持原始真实分布,完全隔离在训练流程之外,从根源上避免数据泄露导致的虚高指标。
- 优化采样策略:过采样不要用原始SMOTE,替换为Borderline-SMOTE、ADASYN等改进版本,仅对边界区域、难分类的少数类样本生成合成样本,减少噪声引入;同时不要强行把少数类采样到和多数类1:1的比例,可以尝试1:3、1:5的采样比,降低合成样本对真实分布的干扰。欠采样不要用随机丢弃多数类的方案,替换为ENN、NearMiss等方法,仅删除多数类中的噪声、边界重叠样本;也可以用EasyEnsemble、BalanceCascade等集成采样方案,把多数类拆分为多个子集分别和少数类组合训练基模型,最后集成结果,避免丢失多数类的有效信息。
- 优先尝试模型层面的不平衡处理,不依赖数据采样:使用树模型、XGBoost、LightGBM等模型时,直接开启
class_weight='balanced'或scale_pos_weight参数,在损失函数层面给少数类样本更高的权重,不用修改原始数据分布,效果比手动采样更稳定,也不容易引入噪声。 - 调整分类决策阈值:模型默认以0.5作为正负类判断阈值,在不平衡场景下完全不适用。可以在验证集上绘制PR曲线,选择让少数类F1值、或者满足业务召回/精确率要求的阈值作为分类判断标准,多数场景下调阈值的收益远高于采样。
- 替换评估指标:不要用ROC-AUC作为核心指标,不平衡场景下ROC-AUC会对多数类的表现过度乐观,优先用PR-AUC、少数类F1、召回率作为核心调参指标。
内容的提问来源于stack exchange,提问作者Tae In Kim
相关产品推荐
相关产品推荐

