用于不平衡多类多标签分类的神经网络

Posted

技术标签:

【中文标题】用于不平衡多类多标签分类的神经网络【英文标题】:Neural Network for Imbalanced Multi-Class Multi-Label Classification 【发布时间】:2017-08-26 10:22:54 【问题描述】:

如何处理训练神经网络时结果不平衡的多标签分类?我遇到的解决方案之一是惩罚稀有标记类的错误。这是我设计网络的方式:

类数:100。输入层、第 1 隐藏层和第 2 层 (100) 使用 drop-outs 和 ReLU 完全连接。第二个隐藏层的输出是py_x。

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=py_x, labels=Y))

其中 Y 是 one-hot-encoding 的修改版本,为样本的所有标签设置了 1 到 5 之间的值。对于最常见的标签,该值约为 1,对于最稀有的标签,该值约为 5。该值不是离散的,即在 one-hot-encoding 中为标签设置的新值基于公式

= 1 + 4*(1-(percentage of label/100))

例如: 将被转换为 之类的东西。注意:只有原始向量中的 1 值被更改。

这样,如果模型错误地预测了一个稀有标签,它的误差会很高,例如:0.0001 - 5 = -4.9999,与非常频繁的标签的错误标签相比,这将反向传播更大的误差。

这是正确的惩罚方式吗?有没有更好的方法来处理这个问题?

【问题讨论】:

【参考方案1】:

让我们以一般形式回答您的问题。您面临的是班级不平衡问题,有很多方法可以解决这个问题。常见的方式有:

    数据集重采样:通过更改数据集大小使类平衡。 例如,如果您有 5 个目标类(A 类到 E 类),A、B、C 和 D 类各有 1000 个示例,E 类有 10 个示例,您可以简单地从 E 类中添加 990 个示例(只需复制它或复制和一些噪音)。 成本敏感建模:更改不同类别的重要性(权重)。 这是您在代码中使用的方法,您将类的重要性(权重)最多增加了 5 倍。

回到您的问题,第一个解决方案与您的模型无关。您只需要检查您是否能够更改数据集(将更多样本添加到样本较少的类中,或者从具有大量样本的类中删除样本)。对于第二种解决方案,由于您使用的是神经网络,因此您必须更改损失函数公式。您可以定义多个超参数(类权重或重要性)并训练您的模型并查看哪一组参数效果更好。

所以要回答您的问题,是的,这是一种正确的惩罚方法,但也许您可以通过尝试不同的权重(而不是示例中的 5)来获得更好的准确性。此外,您可能想尝试数据集重采样。

更多信息可以参考this link。

【讨论】:

以上是关于用于不平衡多类多标签分类的神经网络的主要内容,如果未能解决你的问题,请参考以下文章

错误:分类指标无法处理多类多输出和多标签指标目标的混合

24二分类多分类与多标签问题的区别

我应该使用这种多类多标签(?)问题的哪种损失函数?

Python scikit 学习多类多标签性能指标?

在sklearn python中处理逻辑回归分类器中的极端不平衡多类

分类家族:二分类多分类多标签分类多输出分类