如何获得多标签分类问题的样本权重和类权重?

Sha*_*ngh 8 python scikit-learn keras tensorflow

我正在尝试为多标签分类问题构建神经网络。

情况

在输入图像中可能有多个输出类(并且它们不是相互排斥的)。共有6个班级。

例子

图 1 中包含第 1 类、第 2 类和第 5 类。因此,输出看起来像这样 [1, 1, 0, 0, 1, 0]。

数据不平衡问题

根据出现在该图像类型中的类的组合,我总共有 32 个独特类型的图像。因此,一种类型可以包含所有类(由 [1, 1, 1, 1, 1, 1] 表示),而另一种类型可能没有任何类(由 [0, 0, 0, 0 表示) , 0, 0])。

与其他图像(例如不存在类的图像)相比,某些图像非常罕见(例如包含第 1 类、第 3 类、第 4 类和第 6 类的图像)。从下面给出的数据中应该可以清楚地看出这一点。

Image Type         : No. of samples of that image type

[1, 0, 1, 1, 0, 1] : 1
[1, 0, 1, 0, 1, 1] : 2
[1, 1, 1, 0, 1, 1] : 2
[1, 1, 1, 1, 1, 1] : 2
[1, 0, 1, 1, 1, 1] : 3
[1, 1, 1, 1, 0, 1] : 3
[1, 0, 1, 0, 0, 1] : 3
[1, 1, 1, 0, 0, 1] : 4
[1, 1, 0, 1, 1, 1] : 4
[1, 1, 0, 1, 0, 1] : 7
[1, 1, 0, 0, 1, 1] : 7
[1, 0, 0, 1, 1, 1] : 8
[1, 0, 0, 1, 0, 1] : 16
[1, 1, 0, 0, 0, 1] : 21
[1, 0, 0, 0, 1, 1] : 28
[0, 1, 1, 0, 1, 1] : 53
[0, 1, 1, 1, 1, 1] : 63
[0, 0, 1, 1, 1, 1] : 70
[0, 0, 1, 0, 1, 1] : 78
[1, 0, 0, 0, 0, 1] : 122
[0, 1, 1, 1, 0, 1] : 141
[0, 1, 0, 1, 1, 1] : 159
[0, 1, 0, 0, 1, 1] : 239
[0, 0, 1, 1, 0, 1] : 265
[0, 1, 0, 1, 0, 1] : 283
[0, 0, 0, 1, 1, 1] : 366
[0, 1, 1, 0, 0, 1] : 491
[0, 0, 1, 0, 0, 1] : 712
[0, 1, 0, 0, 0, 1] : 1128
[0, 0, 0, 1, 0, 1] : 1183
[0, 0, 0, 0, 1, 1] : 2319
[0, 0, 0, 0, 0, 0] : 46431

Total no. of samples = 54,214 sample images
Run Code Online (Sandbox Code Playgroud)

另一个问题是类的不平衡表示。因为总共有 54214 个图像样本,每个样本有 6 个类。我们通过将这两个值相乘得到一个总数。54214 * 6 = 325284

下面给出的数据清楚地表明第 1 类(当前)是代表性最少的类。此外,我们可以看到负数(0)比正数(1)更多。

         Absent(0) Present(1) Total(0 + 1)
Class 1  53981     233        54214
Class 2  52321     1893       54214
Class 3  51640     2574       54214
Class 4  51607     2607       54214
Class 5  50811     3403       54214
Class 6  46431     7783       54214

Total :  306791 +  18493   =  325284 
Run Code Online (Sandbox Code Playgroud)

我正在使用Keras,我知道我们可以在训练模型时传递sample_weightclass_weight。我在最后一层使用sigmoid激活和binary_crossentropy loss,因为它是一个多标签分类问题。

问题

  1. 我应该如何计算sample_weight以便我可以更强烈地表示稀有样本(例如 [1, 0, 1, 1, 0, 1] 类型的样本)?

  2. 在这种情况下,我应该如何计算class_weight以便可以解决比正数(1)更多的负数(0)的问题?

  3. [可选/不太重要] 如果我想比其他五个班级更重地惩罚6级(因为6级最重要)我该怎么办?

我知道可以使用诸如 scikit-learn 的compute_sample_weightcompute_class_weight类的东西来计算它。

如果有人可以提供解决方案并以数学方式对其进行解释,那将非常有帮助。另外,如果我理解错误,请纠正我。

小智 0

我相信有很多方法可以解决这个问题,但我的想法如下:

  • 有一个单独的模型来预测图像是否属于任何类别。这应该很简单。
  • 如果图像属于步骤 1 中的任何类,则预测图像属于哪些特定类。

划分问题可能有益的原因是,您可以在第一个模型上训练整个数据集,然后在第二步中进行选择性采样以解决数据不平衡问题。您可以在第一步中避免丢失任何信息,在第二步中通过简化问题和解决数据不平衡来帮助网络。

在第二步中,您可以选择:

  1. 六个独立的二元分类模型代表具有选择性抽样的每个类别。
  2. 一种具有选择性采样的多标签分类模型。

在第一个建议中,您将为每个模型选择样本,以便每个模型中标签 0 和 1 之间的比率为 50/50。例如,对于类别 1,您将拥有该类别的 233 个图像元素和 233 个其他任意选择的图像,而不是该类别的元素。这样就不会出现数据不平衡的情况。如果您的数据不平衡实际上是由于抽样偏差造成的,那么此选项是有意义的。

在第二个建议中,您将仅使用属于任何类元素的数据进行训练。这样你确实会有一些数据不平衡,但仍然比原来少得多。如果需要,您可以通过对特定类别使用数据增强来应用更复杂的选择性采样,以便更频繁地使用该类别的图像进行训练。在这种情况下,数据不平衡将会进一步减少。

但在现实世界中,一些数据不平衡实际上是有代表性的。这就是为什么我个人会同意第二个建议。