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

标签 tensorflow deep-learning multilabel-classification

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

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

我最终得到了这个预测之王(非常“恒定”):
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]

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

但是我注意到,例如,在我的 20000 个样本中,第 1 类出现大约 10800,因此比率为 0.54,它是我每次预测的值。所以我想我需要找到一种方法来解决 tuis“不平衡数据集”问题。

我想过减少我的数据集(欠采样)以使每个类的出现次数大致相同,但只有 26 个样本对应于我的一个类......这会让我失去很多样本......

我读到过采样或更多惩罚那些罕见但并不真正理解它是如何工作的类。

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

实际上,在 Tensorflow 上,是否有有助于做到这一点的函数?

还有其他建议吗?

谢谢 :)

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

最佳答案

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

但是,在我看来,您的体验更像是“输出甚至看不到输入”,因此网络只会学习您的输出分布。

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

关于tensorflow - 多标签分类的不平衡数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44285537/

相关文章:

python-3.x - Pytorch autograd.grad 如何写多个输出的参数?

python - 如何创建深度 Q 学习神经网络来解决像贪吃蛇这样的简单游戏?

python - 计算keras LSTM中向量之间的距离和角度

python - 大数据集的多标签分类方法

machine-learning - Keras多标签分类 'to_categorical'错误

python - 在 Tensorboard 上显示图像(通过 Keras)

python - “顺序”对象没有属性 '_in_multi_worker_mode'

python - ValueError : Layer leaky_re_lu_1 was called with an input that isn't a symbolic tensor. 接收类型:<class 'keras.layers.convolutional.Conv3D' >

python - TensorFlow 精简版 : toco_convert for arbitrary sized input tensor

matlab - 在 Matlab 中使用 fitcsvm() 函数存储 ClassificationSVM 的数组/矩阵给我一个错误,我该如何解决它?