在二元分类中,测试数据集是否应该平衡?

数据挖掘 机器学习 分类 阶级失衡
2021-10-07 00:53:41

在二进制分类练习中,我有一个数据集,其中 4519 个样本标记为“1”,18921 个样本标记为“0”。我很清楚,在分类算法(在本例中为随机森林)的训练阶段,应平衡 0/1 样本的数量,以防止算法偏向多数类。

但是,测试数据集也应该平衡吗?

换句话说,如果用 1000 个“0”类随机样本和 1000 个“1”类随机样本训练我的模型,我是否应该用剩余的 3519 个“1”类样本来测试模型,并随机选择另外 3519 个样本大多数“0”类,还是我可以选择剩余的 17921?

不平衡的测试数据集对精度、召回率和整体准确度指标有何影响

谢谢

4个回答

你的第一个问题的答案:

测试数据集也应该平衡吗?

就像数据科学中的许多答案一样,“这取决于”。

实际上,这取决于模型指标的受众和可解释性,这是您第二个问题的重点:

不平衡的测试数据集对精度、召回率和整体准确度指标有何影响?

就个人而言,如果指标只是被你用来评估模型,我会在每个类中使用sensitivityandspecificity来评估模型,在这种情况下,我不太关心测试数据中类的平衡,只要我两者都有足够的代表性。我可以考虑类的先验概率来评估模型的性能。

另一方面,如果这些指标将用于向非技术受众描述预测能力,比如高层管理人员,我希望能够讨论整体准确性,为此,我需要一个合理平衡的测试集。

也就是说,听起来您的测试集是独立于训练数据绘制的。如果要平衡训练数据集,为什么不从原始数据中提取一个平衡数据集,然后拆分训练和测试数据呢?这将在两个数据集中为您提供非常相似的班级人口,而不必做任何额外的工作。

有几种平衡类的方法。您可以增加少数类的样本数或减少多数类的样本数。一旦你平衡了你的课程,首先你将其中的 80% 作为训练,然后在剩下的 20% 上进行测试。在您的情况下,4519 个样本为 1,18921 个为 0,因此假设您对 4519 进行上采样,现在您有 15,000 个类别 1 的样本。您将采用 (15000+18921) 的 80% 并训练您的模型。在剩余的 20% 上进行测试。

当您要识别数百万的欺诈交易时,召回变得很重要。您将有很少的类别标记为 1(欺诈性)。因此,即使您只是简单地将测试数据中的所有类标记为 0,您的准确率也将超过 99%,但您应该问自己一个问题:“在标签为 1 的所有实际类中,我从训练模型中得到了多少正确” . 这就是回忆给你的。

您的模型在检测“0”或“1”样本时可能具有非常不同的性能,而您不会注意到性能是否不够高。

在训练期间,我将在训练中包含更多样本和子样本“0”(以在每个步骤中保持“0”和“1”的平衡),并使用平衡的测试集评估模型。

一个快速的解决方案:如果你使用 SKLearn 的随机森林,我强烈建议“class_weight”=>“balanced”。

该参数将自动加权与它们的频率成反比的类。