多标签分类的不平衡数据集

A. *_*iro 6 multilabel-classification deep-learning tensorflow

因此,我在我创建的多标签数据集(约20000个样本)上训练了一个深度神经网络。我将softmax切换为S形并尝试最小化(使用Adam优化器):

tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y_, logits=y_pred)
Run Code Online (Sandbox Code Playgroud)

最后,我得到了这个预测之王(相当“恒定”):

Prediction for Im1 : [ 0.59275776  0.08751075  0.37567005  0.1636796   0.42361438  0.08701646 0.38991812  0.54468459  0.34593087  0.82790571]

Prediction for Im2 : [ 0.52609032  0.07885984  0.45780018  0.04995904  0.32828355  0.07349177 0.35400775  0.36479294  0.30002621  0.84438241]

Prediction for Im3 : [ 0.58714485  0.03258472  0.3349618   0.03199361  0.54665488  0.02271551 0.43719986  0.54638696  0.20344526  0.88144571]
Run Code Online (Sandbox Code Playgroud)

起初,我以为自己只是想为每个班级找到一个阈值。

但是我注意到,例如,在我的20000个样本中,第一类出现的次数约为10800,因此比率为0.54,并且该值始终是我的预测的值。因此,我认为我需要找到一种解决突尼斯“不平衡的数据集”问题的方法。

我考虑过将数据集(Underampling)减少为每个类别都具有相同的出现次数,但只有26个样本对应于我的一个类别...这会使我失去很多样本...

我读到了有关过度采样或对更多类(虽然很少见但并未真正理解其工作原理)进行惩罚的文章。

有人可以分享一些有关这些方法的解释吗?

实际上,在Tensorflow上,是否有有助于实现此目的的函数?

还有其他建议吗?

谢谢 :)

PS:用于不平衡的多类别多标签分类的神经网络这篇文章提出了同样的问题,但没有答案!

Phi*_*ock 4

好吧,一个类别有 10000 个样本,而一个稀有类别只有 26 个样本确实是一个问题。

然而,对我来说,你所经历的似乎更像是“输出甚至看不到输入”,因此网络只是学习你的输出分布。

为了调试这个,我会创建一个缩减集(仅用于此调试目的),每个类有 26 个样本,然后尝试严重过度拟合。如果你得到正确的预测,我的想法是错误的。但是,如果网络甚至无法检测到那些采样不足的过拟合样本,那么这确实是一个架构/实现问题,而不是由于分布分布(然后您需要修复它。但它不会像您当前的结果那么糟糕)。

  • 好吧,你肯定是对的..对我来说不幸的是!但是,正如我之前所说,完全相同的架构用于在 MNIST 数据集和我创建的数据集(多类单标签)上学习和执行得非常好!唯一改变的是我用 Sigmoid 替换了 Softmax .. (2认同)