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

Imbalanced Dataset for Multi Label Classification

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

tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y_, logits=y_pred)

最后我得到了这个预测之王(漂亮 "constant"):

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]

起初,我以为我只需要为每个class找到一个阈值。

但我注意到,例如,在我的 20000 个样本中,第一个 class 出现大约 10800,因此比率为 0.54,它是我每次预测的值。所以我想我需要找到一种方法来解决 tuis "imbalanced datset" 问题。

我考虑过减少我的数据集(欠采样),使每个 class 的出现次数大致相同,但只有 26 个样本对应于我的 classes...我丢失了很多样品...

我读到过采样或对 classes 进行更多的惩罚,这些很少见但并不真正理解它是如何工作的。

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

在实践中,在 Tensorflow 上,是否有功能可以帮助做到这一点?

还有其他建议吗?

谢谢:)

PS: Neural Network for Imbalanced Multi-Class Multi-Label Classification 这个 post 提出了同样的问题,但没有答案!

您的问题不是 class 不平衡,而是 缺乏数据 。对于几乎任何真实的机器学习任务,26 个样本被认为是一个非常小的数据集。 class 不平衡可以通过确保每个小批量至少从每个 class 中获得一个样本来轻松处理(这会导致某些样本的使用频率比另一个样本高得多的情况,但谁在乎呢) .

然而,在只有 26 个样本的情况下,这种方法(以及任何其他方法)将很快导致过度拟合。这个问题可以通过某种形式的数据增强来部分解决,但样本仍然太少,无法构建合理的东西。

所以,我的建议是收集更多数据。

好吧,在一个 class 中有 10000 个样本,而在一个罕见的 class 中只有 26 个样本确实是一个问题。

但是,对我来说,您的体验更像是 "outputs don't even see the inputs",因此网络只是了解您的输出分布。

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