我正在尝试为一个多标签分类问题构建神经网络。
情况
在输入的图像中可能有多个输出类(它们不是相互排斥的)。总共有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_weight和class_weight。
在最后一层中,我使用了sigmoid激活函数和binary_crossentropy损失函数,因为这是一个多标签分类问题。
问题
我应该如何计算sample_weight,以便更强烈地表示罕见样本(例如类型为[1, 0, 1, 1, 0, 1]的样本)?
在这种情况下,我应该如何计算class_weight,以解决负面(0)比正面(1)更多的问题?
[可选/不太重要]如果我想比其他五个类别更严重地惩罚第6类(因为第6类最重要),我该怎么办?
我知道可以使用类似于scikit-learn的compute_sample_weight和compute_class_weight来计算它。
如果有人能提供一个解决方案并用数学方式解释它,那将非常有帮助。如果我理解错了什么,请纠正我。