You need to enable JavaScript to run this app. 垃圾邮件分类类不平衡数据集重采样操作与效果疑问
优惠活动
大模型
产品
解决方案
定价
更多

垃圾邮件分类类不平衡数据集重采样操作与效果疑问

流程校验与问题定位

核心认知误区澄清

你观测到的类1 support=400的数值和过采样操作没有任何逻辑关联:

  • 分类报告里的support,是指当前评估所用的数据集里,每个类别的真实样本总数量,这个数值在完成训练集/测试集拆分的瞬间就已经固定,后续对训练集做任何过采样、欠采样、特征工程操作,都不会改动评估集的样本构成,自然不会带来support数值的升高。
  • 把重采样操作放在拆分完训练集之后、模型训练之前的位置,是完全符合机器学习流程规范的——绝对不要在整个数据集拆分之前就做过采样,否则会把扩增的重复样本泄漏到测试集,导致评估结果虚高,目前的操作不存在位置错误。

实际流程存在的疏漏

1. 评估环节的样本范围混淆

按照设定的test_size=0.25参数,拆分完成后:

  • 全量测试集总样本为5000*0.25=1250条,按照原始9:1的类不平衡比例,测试集内类0(非垃圾邮件)应为1125条、类1(垃圾邮件)应为125条。
  • 但给出的评估报告里类0 support=3600、类1 support=400,两个类加起来的总样本数是4000条,刚好对应test_size=0.2时的训练集规模(训练集总样本4000条,类0 3600条、类1 400条)。这说明训练完成后,没有用独立拆分出来的测试集做评估,反而拿拆分出来的**原始训练集(未做过采样的那份训练数据)**跑了评估,才会出现support数值和测试集预期完全对不上的问题。

2. 过采样实现的细节偏差

按照描述的过采样逻辑:

  • 分离训练集里的类1样本,调用resample方法设置replace=True,把类1样本扩增到和训练集内类0样本一致的规模,再和原始类0样本合并得到平衡训练集,这个逻辑本身是对的。但要注意扩增完成后必须二次校验训练集的类别分布:确认类1的最终样本数和类0完全相等,不要遗漏原始类1样本、或者重复拼接导致样本数不匹配。

关于模型类1效果偏差的说明

观测到的类1precision=0.76、recall=0.52的指标,如果是在独立测试集上得到的,和过采样操作本身没有关系:

  • 垃圾邮件分类的核心区分信息大部分来自文本语义,目前的特征集合只有三个简单的规则特征(是否首字母大写、是否全大写、是否包含数字),没有对Text字段做基础的文本特征提取(比如TF-IDF、词袋转换),模型本身能捕捉到的垃圾邮件特征非常有限,自然会出现类1召回率偏低的情况。
  • 过采样的作用只是修正模型训练过程中的类别权重倾斜,让模型不要把所有样本都预测成多数类,没法凭空给模型增加它学不到的特征信息。

正确的流程校验清单

  • 数据集拆分完成后,先打印训练集、测试集的类别分布,确认两个集合的类比例和原始数据集保持一致,没有出现样本错分、数据泄漏的问题;
  • 训练集内部完成过采样后,再次打印平衡训练集的类别分布,确认类1样本数已经和类0样本数完全一致;
  • 用全程未参与训练、未参与过采样的独立测试集做模型评估,此时的support数值就是测试集的真实样本规模,不会因为训练集的采样操作发生变化,这是正常现象;
  • 如果要提升类1的分类效果,可以在过采样的基础上搭配类权重设置(比如scikit-learn里的class_weight='balanced'),同时补充文本特征提取步骤,不要只依赖三个简单规则特征训练模型。

内容的提问来源于stack exchange,提问作者LdM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 20:24:03