【问题标题】:How to deal with Imbalanced Dataset for Multi Label Classification如何处理多标签分类的不平衡数据集
【发布时间】:2017-11-03 23:03:23
【问题描述】:

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

感谢您的想法和回答!

【问题讨论】:

    标签: tensorflow deep-learning multilabel-classification


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,但如果我理解正确,您使用 Softmax,因此您所做的就是将您的多标签问题分为两个多类单标签问题(一个用于形状,一个用于对象类别)。那不是我的情况,我有一个“真正的”多标签问题(不可分离),所以我猜你的建议不适合我的问题。但是感谢您的回答,这可能对我以后有用:)
    • 所以在你的情况下tf.nn.sigmoid_cross_entropy_with_logits 可能有用。祝你好运。
    • 是的,这就是我目前正在做的事情!但是还没有真正弄清楚如何用这个来解决我的不平衡数据集:)
    【解决方案2】:

    我认为您可以只使用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:“这类似于 sigmoid_cross_entropy_with_logits(),只是 pos_weight 允许人们通过对正错误相对于负错误的成本进行上调或下调来权衡召回率和精度。”
    • 您确定您的 logits 是多类的,而不仅仅是单个类(多个标签)的 logits?如我所见,多类问题包含几个不独立的类(所以我们使用softmax),而多标签问题可以包含多个独立的类,这会提示每个单独类的sigmoid。至少,我是这么看TF源码的。
    【解决方案3】:

    因此,鉴于您所写的内容,我不完全确定我是否理解您的问题。您链接到的帖子是关于多标签和多类的,但考虑到那里写的内容,这也没有任何意义。所以我将把它当作一个多类问题来处理,对于每个样本,你都有一个标签。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2013-12-26
      • 2020-10-23
      • 2020-09-04
      • 2020-06-27
      • 2018-11-19
      • 2017-04-19
      相关资源
      最近更新 更多