不平衡数据集分类的训练、测试拆分

数据挖掘 Python 分类 训练
2021-10-10 01:04:42

我有一个进行二元分类的模型。

我的数据集高度不平衡,所以我认为我应该在训练模型之前通过欠采样来平衡它。所以平衡数据集,然后随机拆分。这是正确的方法吗?还是我应该平衡测试和训练数据集?

我尝试只平衡整个数据集,我得到了 80% 的训练准确率,但在测试集上我有 30% 的准确率。这似乎不对?

但我也不认为我应该平衡测试集,因为它可能被视为偏见。

这样做的正确方法是什么?

谢谢

更新:我有 400 000 个样本,10% 是 1,90% 是 0。我无法获得更多数据。我试图保留整个数据集,但我不知道如何将其拆分为训练集和测试集。我在训练和测试数据集中需要相同的分布吗?

4个回答

如果可以的话,最好的方法是收集更多数据。

采样应始终在训练数据集上进行。如果你使用 python,scikit-learn 有一些非常酷的包可以帮助你。随机抽样是一个非常糟糕的分裂选择。尝试分层抽样这会在训练集和测试集之间按比例划分您的班级。

在训练集上运行过采样、欠采样或混合技术。同样,如果您使用 scikit-learn 和逻辑回归,则有一个名为class-weight的参数。将此设置为平衡

评价指标的选择在模型选择中也起着非常重要的作用。准确性对不平衡的数据集没有帮助。根据您的需要,尝试 ROC 下的区域或精度和召回率。你想给假阳性率或假阴性率更多的权重吗?

你的问题很常见,许多数据科学家都在努力解决这类问题。

在这篇文中,作者很好地解释了该怎么做。这些是主要注释:

1. 你能收集更多数据吗?

2.尝试改变你的绩效指标:

使用不平衡数据集时,准确性不是要使用的指标。我们已经看到它具有误导性。

在处理不平衡类时,有些指标旨在告诉您一个更真实的故事。

精度:分类器准确性的度量。召回率:衡量分类器完整性的指标 F1 分数(或 F 分数):准确率和召回率的加权平均值。

3. 重新采样你的数据集

您可以更改用于构建预测模型的数据集,以获得更平衡的数据。

此更改称为对数据集进行采样,您可以使用两种主要方法来平衡类:

  • 您可以从代表性不足的类中添加实例的副本,称为过采样(或更正式的带替换采样),或者

  • 您可以从过度表示的类中删除实例,称为欠采样。

4. 生成合成样品

生成合成样本的简单方法是从少数类的实例中随机抽取属性。

5. 尝试不同的算法

与往常一样,我强烈建议您不要在每个问题上都使用您最喜欢的算法。您至少应该针对给定问题抽查各种不同类型的算法。

这一切都取决于你的目标是什么。你的目标是精确度还是召回率?

你是对的,你的训练数据的分布(总是取决于模型和超参数)将使你的模型相应地偏向它。提供一个大部分实例(即 90%)被标记为0's 的训练集,可能会在测试集中将大部分实例标记为0's。因此,如果一个人想检测1's 应该偏向样本以便拥有更多这些。除了改变你的训练分布之外,有很多方法可以做到这一点。首先,过采样、欠采样甚至更好,使用集成模型,其中每个模型可能具有所有1s 和一些0s。其次,可以根据选择的分类器调整负责约束多数类接管的各种超参数。

正如大多数答案中提到的那样,有多种方法可以处理倾斜的数据。我想强调一下,SMOTE是克服这种偏差的推荐方法之一。