2017-06-02 65 views
0

我想知道在处理真正不平衡的数据集时,如何惩罚较少表示的类,而不是处理其他类(在大约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),并且提出了一个想法,但没有答案,我认为这个想法可能是好的:)

感谢您的想法和答案!

回答

0

首先,我的建议是可以修改您的成本函数以多标签方式使用。有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]) 
+0

谢谢你的回答,但如果我理解正确,你使用Softmax,所以你要做的是将你的多标签问题分为两个多类单标签问题(一个用于形状,另一个用于对象类别)。这不是我的情况,我有一个“真正”的多标签问题(不可分离),所以我猜你提出的建议不适合我的问题。但是,谢谢你的回答,以后可能对我有用:) –

+0

所以也许在你的情况'tf.nn.sigmoid_cross_entropy_with_logits'可以是有用的。祝你好运。 –

+0

是的,这就是我目前正在做的!但是,真的不知道如何解决我的不平衡数据集:) –

0

我想你可以只使用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])) 
+0

我不认为'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

+0

嗯,我已经成功地将它用于3级分类,尽管... – Bow

+0

然而,您确定您的登录是多类的,而不仅仅是单个类(多个标签)的登录?如我所见,多类问题包含几个不独立的类(所以我们使用softmax),而多标签问题可以包含多个独立的类,它们为每个单独的类提示sigmoid。至少,这就是我看到TF源代码的方式。 – Neergaard

0

所以我不完全相信,根据你写的内容,我明白你的问题。你链接的帖子写了关于多标签和多类的内容,但是对于写在那里的东西并没有什么意义。所以我会把它作为一个多类问题来处理,对于每个样品,您都有一个标签。

为了惩罚这些类,我根据当前批处理中的标签实现了一个权重张量。对于三级问题,你可以例如。将权重定义为类别的反频率,如果分别为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个独立分类。

相关问题