处理回归问题的实际不平衡数据集的最佳方法

数据挖掘 美国有线电视新闻网 图像分类 阶级失衡 离群值
2022-03-13 00:20:05

我有一个数据集,其中每个对象都有一个介于 0-1 之间的标签。标签 = 1 的对象非常常见,但标签 = 0 的对象非常罕见。我有兴趣在看不见的数据中预测标签。

在此处输入图像描述

注意:标签在 0 和 1 之间是连续的,但出于视觉目的而分箱。

这些对象来自一个模拟,该模拟准确地预测了我们在现实中看到的人口数量。(因此是“现实不平衡”的标题)

不幸的是,标签 = 0 的对象表现出看起来随机的运动,因此构建这些对象的方式的数量趋于无穷……而标签 = 1 的对象是高度有序的对象,其结构变化不大,因此具有它们出现的方式有限。

对我来说,这意味着,为了探索这些对象在其域中的所有可能变化,需要一个数据集,其“每个类的数量”将与我们在上图中看到的完全相反。即,您需要观察比 label = 1 个对象成倍增加的 label ~ 0 个对象,以便探索对象的域。

显然这是不可能和不切实际的。我很好奇人们认为解决这个问题的最佳方法是什么?

我曾想过:

  • 使其成为一种对象检测方法,您可以借此区分标签大于或低于阈值(例如 0.8)的对象。(我认为这会很困难,因为标签是连续的,所以你会在边界处弄糊涂)。
  • 加入两个 CNN:一个对描述标签的特征(例如速度数据)进行建模,另一个对将图像中的物理随机性级别与相应标签相关联的属性进行建模。

我已经尝试过使用 CNN 分类器进行上采样,但是标签数量很少 ~ 0 图像,CNN 很快就会过拟合并默认使用更高的标签来预测它们。

2个回答

您说“标签 = 0 的对象表现出随机的运动......而标签 = 1 的对象是高度有序的对象”。如果你能看到,为什么你的模型不能?只是训练它,看看它是否有效。

但是,您的数据集似乎不是很大。如果您的图像/对象不太奇怪,您应该考虑从一些预先训练的模型中进行迁移学习。

没有先验需要处理标签的不平衡,只需确保将您的损失与适当的基线进行比较,例如标签均值。

你说你有额外的特征,在展平卷积层后附加它们。如果附加功能也是 2D 的,只需将它们作为通道添加到您的输入。

如果您使用逻辑回归,您可以尝试以下操作:

通过将 class_weight="auto" 传递给 LogisticRegression 构造函数对少数类进行过采样。您可能还想设置 intercept_scaling=1e3 (或其他一些较大的值)。有关详细信息,请参阅文档字符串。编辑:根据 sklearn 版本 0.17 'class_weight="balanced"'。

改变模型的截距。class_weight 应该确保您获得了 50/50 拆分的截距(对数赔率之前),对于 90/10 拆分,可以将其转换为一个

prior = .9 lr.intercept_ += np.log(prior / (1 - prior)) - np.log((1 - prior) / prior) 这个数学技巧在流行病学中很常见(或者我被告知) ,通常你有一组 n_positive 病例和非常小的疾病先验概率,但是获得一个实际大小先验/(1-先验)* n_positive 的对照组非常昂贵。

通过将先验乘以它们的输出,而不是直接将其折叠到模型中,可以在其他概率模型上发挥类似的技巧。朴素贝叶斯(不是一个好的概率模型,但我还是会提到它)实际上需要一个可选的 class_prior 参数。