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


13

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

事实是,您可能知道,数据集非常不平衡:大约1300个否定示例(非点击)中有1个肯定示例(点击)。

这是我的工作:

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

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

我的问题是:

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

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

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

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

在此先感谢您的时间 !

问候。

Answers:


9

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

1)您应该在B而非B`上交叉验证。否则,您将不知道您的类平衡效果如何。在B B` 上进行交叉验证不会有什么坏处,根据下面对4的回答,它将很有用。

2) 您应该基于以下4在C和C`上进行测试。

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

4)这真的很棘手。问题在于,最好的方法要求您重新解释学习曲线的外观,或者同时使用重新采样的数据集和原始数据集。

学习曲线的经典解释是:

  • 过度拟合 -线条不太融合;
  • 欠佳 -线路齐聚,但F1得分太低;
  • 恰到好处 -线条搭配合理的F1得分。

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

答案是在A`上进行训练,然后在B`上进行测试,同时也在B上进行测试。获得B`的F1分数,然后检查B的F1分数。然后进行测试并生成学习曲线曲线永远不会融合在一起,但是您会感觉到可以接受的偏差……它是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这样的库中它非常容易,并且在使用S形函数或多数表决的任何事情中都非常容易处理代码。

希望这可以帮助!


非常感谢@ AN605。你真好!我有几个问题:对于4)-当您说“在A'上训练并在B'上测试”时,您的意思是验证吗?-“为C生成学习曲线”和“ F1(C)分数低于/类似于F1(B)”。尽管如此,对于学习曲线,我们只需要绘制训练集(此处为A或A')的误差度量和验证集(B或B')的误差度量。您不是在这里“验证” C吗?
jmvllt 2015年

关于使用“类权重”,如果我错了(我对此有个简单的了解),请纠正我,但是,这个技巧涉及通过在变量前面添加系数/权重“ k”来“修改”成本函数。班级不平衡吧?:􏲏Cost(h(x),y​​)= -y * k * log(h(x))-(1-y)* log((h(x))像这样,该算法应考虑错误分类肯定类是更重要的。但是问题是我“必须”使用Apache Spark和MLlib来构建我的所有模型。而且我不确定我是否可以轻松地使用spark修改成本函数。无论如何,感谢您时间!
jmvllt 2015年

5

对于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)显示最终优化的任何指标都没有错。


嗨@jamesmf,谢谢您的出色回答。对于F1Score,我遇到的问题是,我可能想更加关注消除误报而不是误报。在精度和召回率的计算中为FP和FN添加不同的“权重”是否正确?
jmvllt

这对我来说很有意义。另外,您对类加权的描述是正确的,并且我看不到它在MLib中实现,但是它可能值得一个功能请求
jamesmf

好的,谢谢詹姆斯!我目前正在尝试通过扩展LogisticGradient类并重写计算方法来自己完成此操作。如果这能给我带来良好的效果,我会告诉您。祝你有美好的一天。
jmvllt 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.