数据STUDIO

数据不平衡?千万不要随意处理!

Image

Image

训练数据中正负样本不平衡是非常常见的问题,典型的如:

  1. 贷款问题中,违约和不违约的样本;
  2. 医疗诊断中,在一些疾病检测中,患病样本(正样本)通常远少于健康样本(负样本)。
  3. 网络安全中,入侵检测系统中,异常访问或攻击(正样本)相较于正常流量(负样本)是极其不平衡的。

在碰到上面的问题中,我们第一时间想到的处理方案往往是:

  1. 重采样方法: 包括过采样少数类(如SMOTE算法)或欠采样多数类。
  2. 调整分类器的阈值: 改变决策阈值以更好地捕捉少数类样本。
  3. 使用加权损失函数: 给少数类分配更高的权重,以平衡类别不平衡对损失的影响。
  4. ...

使用上面的处理方案时,我们一定需要慎重,考虑清楚下面的问题,否则这么做是灾难级别的。

慎重思考下面问题

线下训练/线上实盘偏差

设计好自己线下的评估指标和验证模式(验证模式一定要和线上尽可能一致):这和数据不平衡没有关系。这和数据不平衡没有关系。

  • 采样之后切记避免:线下和线上数据分布不一致;如果你采样之后训练数据集的正例占比是50%,那么你的数据会是完全平衡的,但实际你的线上数据的正例占比只有10%,那么你的模型仍然会受到线下和线上偏差的影响。
Image

关注样本量

  • 你有5个正例和5个负例,你的数据集是完全平衡的,但你没有足够的数据来构建一个机器学习模型。
  • 如果你有100万个正例和10亿个负例,你的数据集虽然严重不平衡,但你拥有的数据量绝对是足够的,直接训练即可。

一个反面教材!

以上面的例子为例,

Image

我们按照某种采样策略使得我们训练集合中正负样本较为平衡得到了数据集合2,这个问题我们的目标是判断某个目标是否为1,所以需要设置某个阈值,

  • 大于该阈值,结果为1;
  • 小于该阈值,结果为0;

我们使用不平衡数据训练得到阈值为7.29

Image

我们使用平衡之后数据训练得到阈值为6.47

Image

使用上面两个训练得到的阈值用于线上的实盘,我们发现下面情况:

Image

我们发现在过采样的数据集上训练的模型在实际使用时,线上数据上表现会比在原始(不平衡)数据集上训练要差。

参考:https://medium.com/towards-data-science/your-dataset-is-imbalanced-do-nothing-abf6a0049813

🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫 等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递ImageImage