如何处理多标签分类中的不平衡数据集
我想知道在处理真正不平衡的数据集时,如何惩罚较少表示的类,而不是处理其他类(在大约20000个样本上有10个类,但这里是每个类的出现次数:[10868 26 4797 26 8320 26 5278 9412 4485 16172])。如何处理多标签分类中的不平衡数据集
我读了关于Tensorflow函数:weighted_cross_entropy_with_logits(https://www.tensorflow.org/api_docs/python/tf/nn/weighted_cross_entropy_with_logits),但我不确定我可以用它来解决多标签问题。
我找到了一个职位,总结完美的问题,我有(Neural Network for Imbalanced Multi-Class Multi-Label Classification),并且提出了一个想法,但没有答案,我认为这个想法可能是好的:)
感谢您的想法和答案!
首先,我的建议是可以修改您的成本函数以多标签方式使用。有code显示如何在Tensorflow中使用Softmax Cross Entropy进行多标记图像任务。
使用该代码,您可以在损失计算的每一行中使用多个权重。下面是如果你有多重标签任务的示例代码:(即,每个图像可有两个标签)
logits_split = tf.split(axis=1, num_or_size_splits=2, value= logits )
labels_split = tf.split(axis=1, num_or_size_splits=2, value= labels )
weights_split = tf.split(axis=1, num_or_size_splits=2, value= weights)
total = 0.0
for i in range (len(logits_split)):
temp = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits_split[i] , labels=labels_split[i]))
total += temp * tf.reshape(weights_split[i],[-1])
我想你可以只使用tf.nn.weighted_cross_entropy_with_logits
用于多类分类。
例如,对于4类,其中的比例与会员人数最多的班级有[0.8, 0.5, 0.6, 1]
,你只要给它一个权重向量以下列方式:
cross_entropy = tf.nn.weighted_cross_entropy_with_logits(
targets=ground_truth_input, logits=logits,
pos_weight = tf.constant([0.8,0.5,0.6,1]))
我不认为'tf.nn.weighted_cross_entropy_with_logits'接受多类问题。 取自[documentation](https://www.tensorflow。org/api_docs/python/tf/nn/weighted_cross_entropy_with_logits): “这就像sigmoid_cross_entropy_with_logits(),不同之处在于pos_weight允许通过向上或向下权衡相对于负值的正误差的成本错误。” – Neergaard
嗯,我已经成功地将它用于3级分类,尽管... – Bow
然而,您确定您的登录是多类的,而不仅仅是单个类(多个标签)的登录?如我所见,多类问题包含几个不独立的类(所以我们使用softmax),而多标签问题可以包含多个独立的类,它们为每个单独的类提示sigmoid。至少,这就是我看到TF源代码的方式。 – Neergaard
所以我不完全相信,根据你写的内容,我明白你的问题。你链接的帖子写了关于多标签和多类的内容,但是对于写在那里的东西并没有什么意义。所以我会把它作为一个多类问题来处理,对于每个样品,您都有一个标签。
为了惩罚这些类,我根据当前批处理中的标签实现了一个权重张量。对于三级问题,你可以例如。将权重定义为类别的反频率,如果分别为1,2和3级别的比例分别为[0.1,0.7,0.2],权重将为[10,1.43,5]。基于当前批次定义权重张量然后是
weight_per_class = tf.constant([10, 1.43, 5]) # shape (, num_classes)
onehot_labels = tf.one_hot(labels, depth=3) # shape (batch_size, num_classes)
weights = tf.reduce_sum(
tf.multiply(onehot_labels, weight_per_class), axis=1) # shape (batch_size, num_classes)
reduction = tf.losses.Reduction.MEAN # this ensures that we get a weighted mean
loss = tf.losses.softmax_cross_entropy(
onehot_labels=onehot_labels, logits=logits, weights=weights, reduction=reduction)
使用softmax确保分类问题不是3个独立分类。
谢谢你的回答,但如果我理解正确,你使用Softmax,所以你要做的是将你的多标签问题分为两个多类单标签问题(一个用于形状,另一个用于对象类别)。这不是我的情况,我有一个“真正”的多标签问题(不可分离),所以我猜你提出的建议不适合我的问题。但是,谢谢你的回答,以后可能对我有用:) –
所以也许在你的情况'tf.nn.sigmoid_cross_entropy_with_logits'可以是有用的。祝你好运。 –
是的,这就是我目前正在做的!但是,真的不知道如何解决我的不平衡数据集:) –