如何为多标签分类问题获取样本权重和类别权重?

11

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

情况

在输入的图像中可能有多个输出类(它们不是相互排斥的)。总共有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

另一个问题是类别的不平衡表示。由于总共有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 

我正在使用Keras,我知道在训练模型时可以传递sample_weightclass_weight

在最后一层中,我使用了sigmoid激活函数和binary_crossentropy损失函数,因为这是一个多标签分类问题。

问题

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

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

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

我知道可以使用类似于scikit-learn的compute_sample_weightcompute_class_weight来计算它。

如果有人能提供一个解决方案并用数学方式解释它,那将非常有帮助。如果我理解错了什么,请纠正我。


1
我遇到了同样的问题,你已经解决了吗? - Tuong Nguyen Minh
1个回答

0

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

  • 建立一个单独的模型,预测图像是否属于任何类别。这应该是比较简单的。
  • 如果图像属于第一步中的任何类别,则预测图像属于哪些具体类别。

将问题分成两步的好处在于,您可以在第一步上对整个数据集进行训练,然后在第二步中进行选择性采样以解决数据不平衡的问题。您既不会失去第一步中的任何信息,又可以通过简化问题并在第二步中解决数据不平衡来帮助网络。

在第二步中,您可以选择以下方法之一:

  1. 六个代表每个类别的单独二元分类模型,并进行选择性采样。
  2. 一个多标签分类模型,并进行选择性采样。
在第一个建议中,您将为每个模型选择样本,使得每个模型中标签0和1之间的比率为50/50。例如,对于类1,您将拥有233个该类别的图像元素和233个其他任意选择的不属于该类别的图像。这样,您就没有数据不平衡问题了。如果您的数据不平衡实际上是由于抽样偏差造成的,那么这个选项是有意义的。
在第二个建议中,您将仅使用属于任何类别的数据进行训练。这样,您确实会有一些数据不平衡问题,但仍然比原来少得多。如果您愿意,您可以通过使用特定类别的数据增强来进行更复杂的选择性采样,以更经常地训练该类别的图像。在这种情况下,数据不平衡问题将进一步减少。
然而,在现实世界中,一些数据不平衡实际上是代表性的。这就是为什么我个人会选择第二个建议的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接