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

时间:2017-04-01 03:57:06

标签: machine-learning tensorflow neural-network

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

班级数量:100。输入层,第一隐藏层和第二层(100)与辍学者和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。该值不是离散的,即在一次热编码中设置标签的新值是基于公式

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

例如:< 0,0,1,0,1,....>将转换为类似< 0,0,1.034,0,3.667,...> 。注意:仅更改原始矢量中的值1。

这种方式如果模型错误地预测罕见标签,则其误差会很高,例如:0.0001 - 5 = -4.9999,与非常频繁的标签的错误标记相比,这会反向传播更重的错误。

这是惩罚的正确方法吗?有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

  1. 数据集重采样:通过更改数据集大小来平衡类。
    例如,如果您有5个目标类(A至E类),并且A,B,C和D类每个都有1000个示例,而E类有10个示例,则只需从E类中再添加990个示例即可(只需复制它或复制品以及一些噪音)。
  2. 成本敏感的建模:更改不同类别的重要性(权重)。
    这是您在代码中使用的方法,其中将类的重要性(权重)增加了最多5倍。

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

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

有关更多信息,请参阅this link