对于不平衡类,我是否必须在我的验证/测试数据集上使用欠采样?

数据挖掘 机器学习 数据集 采样
2021-09-23 01:18:06

我是机器学习的初学者,我正面临一种情况。我正在使用 IPinYou 数据集解决实时出价问题,并且正在尝试进行点击预测。

问题是,您可能知道,数据集非常不平衡:大约 1300 个负例(非点击)对应 1 个正例(点击)。

这就是我所做的:

  1. 加载数据
  2. 将数据集分成 3 个数据集:A = 训练 (60%) B = 验证 (20%) C = 测试 (20%)
  3. 对于每个数据集(A、B、C),对每个负类进行欠采样,以使比率为 5(5 个负例对应 1 个正例)。这给了我 3 个更平衡的新数据集:A' B' C'

然后我用数据集 A' 和逻辑回归训练我的模型。

我的问题是:

  1. 我必须使用哪个数据集进行验证?B 还是 B'?

  2. 我必须使用哪个数据集进行测试?C 或 C'

  3. 哪些指标与评估我的模型最相关?F1Score 似乎是一个很好用的指标。但是这里由于不平衡类(如果我使用数据集 B 和 C),精度很低(低于 0.20),并且 F1Score 受低召回率/精度的影响很大。使用 aucPR 或 aucROC 会更准确吗?

  4. 如果我想绘制学习曲线,我应该使用哪些指标?(如果我使用 B' 数据集进行验证,则知道 %error 不相关)

在此先感谢您的时间 !

问候。

3个回答

好问题...以下是对您编号的问题的一些具体答案:

1)您应该在 B 而不是 B` 上交叉验证。否则,您将不知道您的班级平衡工作的效果如何。对 BB` 进行交叉验证不会有什么坏处,并且根据下面 4 的答案将很有用。

2) 您应该根据下面的 4 对 C 和 C` 进行测试。

3)我会坚持使用 F1,使用 ROC-AUC 可能很有用,这提供了一个很好的健全性检查。两者都倾向于对不平衡的类有用。

4)这变得非常棘手。这样做的问题是,最好的方法要求您重新解释学习曲线应该是什么样子,或者同时使用重新采样的数据集和原始数据集。

学习曲线的经典解释是:

  • 过拟合- 线条并没有完全融合在一起;
  • 欠拟合- 线条融合在一起,但 F1 分数过低;
  • 恰到好处- 线条与合理的 F1 分数结合在一起。

现在,如果您在 A` 上进行训练并在 C 上进行测试,那么这些线将永远不会完全融合在一起。如果您在 A` 上进行训练并在 C` 上进行测试,则结果在原始问题的上下文中将没有意义。所以你会怎么做?

答案是在 A` 上进行训练并在 B` 上进行测试,还要在 B 上进行测试。获得 B` 的 F1 分数,然后检查 B 的 F1 分数。然后进行测试并生成学习曲线对于 C。曲线永远不会走到一起,但你会感觉到可接受的偏差......它是 F1(B) 和 F1(B`) 之间的差异。

现在,您的学习曲线的新解释是:

  • 过拟合- 线不会聚集在一起并且比 F1(B`)-F1(B) 更远;
  • 欠拟合- 线条不在一起但差异小于 F1(B`)-F1(B) 且 F1(C) 分数低于 F1(B);
  • 恰到好处- 线条不在一起,但差异小于 F1(B`)-F1(B),F1(C) 分数类似于 F1(B)。

一般:我强烈建议对于不平衡的类,您首先尝试在学习算法中调整您的类权重,而不是过度/欠采样,因为它避免了我们上面概述的所有严格的道德。它在 scikit-learn 之类的库中非常容易,并且在使用 sigmoid 函数或多数投票的任何东西中都非常容易编写代码。

希望这可以帮助!

对于1)2),你想要

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

因此,对于这些数据集,您不需要平衡类。

您也可以尝试使用类权重而不是欠/过采样,因为这会为您处理这个决定。

因为3)您可能希望使用您将获得评分的任何指标进行优化(如果是比赛)。但如果这不是一个考虑因素,那么所有这些模型都是不错的选择。F1 可能会受到低精度的影响,但您希望将其捕获。正是当幼稚模型(例如猜测多数类)可以通过某些指标获得良好的分数时,F1 等分数才是相关的。

至于4)显示您最终优化的任何指标都没有错。

您应该在表示使用它的原因的数据集上测试您的分类器。最好的通常是未修改的分布。

在学习期间,以对您有帮助的方式修改数据集。

有关详细信息,请参阅我应该选择“平衡”数据集还是“代表性”数据集?