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

mel*_*ose 8 machine-learning neural-network tensorflow

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

类数:100.输入层,第一隐藏层和第二层(100)与辍学和ReLU完全连接.第二个隐藏层的输出是py_x.

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=py_x, labels=Y))
Run Code Online (Sandbox Code Playgroud)

其中Y是一个热编码的修改版本,其值为1到5,为样本的所有标签设置.最常用标签的值为~1,最稀有标签的值为~5.该值不是离散的,即,在一次热编码中要设置的新值是基于公式的

= 1 + 4*(1-(percentage of label/100))
Run Code Online (Sandbox Code Playgroud)

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

这样,如果模型错误地预测罕见标签,则其错误将是高的,例如:0.0001-5 = -4.9999,与非常频繁的标签的错误标记相比,这将反向传播更重的错误.

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

Ima*_*deh 2

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

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

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

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

欲了解更多信息,您可以参考此链接