机器学习:2:1类别不平衡数据如何不做上下采样训练模型
无需上采样/下采样的类别不平衡训练方案
首先梳理当前数据集与训练结果的基础信息:
- 二分类数据集类别分布:0类共169072条样本,1类共84944条样本,类别比例2:1,属于轻度不平衡场景
- 当前基线模型分类结果存在明显的多数类偏向:1类召回率为0,模型几乎将所有样本判定为多数类(0类),仅靠预测多数类拿到68%的虚高准确率,没有学到少数类的有效特征
precision recall f1-score support 0.0 0.68 1.00 0.81 51683 1.0 1.00 0.00 0.00 24522 accuracy 0.68 76205 macro avg 0.84 0.50 0.40 76205 weighted avg 0.78 0.68 0.55 76205
不需要改动原始数据集(不丢失真实数据、不生成假数据)的可行训练方案如下:
- 调整类权重
这是成本最低、见效最快的方案,所有主流机器学习、深度学习框架都原生支持该功能。核心逻辑是在损失计算阶段给少数类样本分配更高权重,让模型参数更新时更重视少数类的预测错误。针对2:1的类别比例,可以手动设置权重为{0.0:1, 1.0:2},也可以直接调用框架内置的balanced权重模式自动按样本量计算权重,不需要额外做数据处理。当前基线模型就是默认等权重训练,才会出现“全判0类损失最低”的错误倾向,调整权重后该问题会直接改善。 - 调整分类阈值+更换评估指标
不要把准确率作为核心评估指标,当前68%的准确率完全不代表模型效果,优先关注少数类F1值、AUC-PR(比AUC-ROC更适配不平衡场景)。模型输出的是分类概率,不需要死守0.5的分类判定阈值:当前1类召回率为0,说明判定为1类的阈值设置过高,可以在验证集上遍历测试不同阈值,找到让两类F1达到业务要求平衡的最优阈值即可,全程不需要改动训练数据。 - 更换适配不平衡场景的损失函数
保持原始数据集不变,将普通交叉熵损失替换为Focal Loss等不平衡友好的损失函数即可。这类损失会自动降低易分样本(即占大多数的、特征非常明显的0类样本)的损失权重,让模型把训练注意力放在难分样本和少数类样本上,对2:1这种轻度不平衡场景适配性很好。 - 使用集成模型内置的平衡参数
如果使用XGBoost、LightGBM、随机森林这类树集成模型,直接调用内置的scale_pos_weight参数即可,本质是框架内置的类权重调整,效果稳定,不会带来数据损失或假数据问题。针对当前2:1的类别比例,直接把该参数设为2就能看到明显效果。
注:2:1的类别比例属于非常轻度的不平衡,完全不需要上来就做下采样丢数据、或者上采样生成假数据,很多场景下盲目用SMOTE、随机下采样反而会引入噪声、丢失有效特征,先把上述几个无数据改动的方案调好,基本就能解决当前少数类召回为0的问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

