多标签分类的不平衡数据集
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 问题,而不是由于计划分布(然后你需要修复它。但它不会像你当前的结果那么糟糕) .
所以我在我创建的多标签数据集(大约 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 问题,而不是由于计划分布(然后你需要修复它。但它不会像你当前的结果那么糟糕) .