【发布时间】:2016-05-05 02:44:01
【问题描述】:
情况:
当我的训练数据在 2 个标签之间的标签分布不平衡时,我想知道如何以最佳方式使用 TensorFlow。例如,假设MNIST tutorial 被简化为仅区分 1 和 0,其中我们可用的所有图像都是 1 或 0。当我们有大约 50% 的每种类型的图像要训练和测试时,使用提供的 TensorFlow 教程进行训练很简单。但是,如果我们数据中 90% 的可用图像是 0,而只有 10% 是 1,情况会怎样呢?我观察到,在这种情况下,TensorFlow 会定期将我的整个测试集预测为 0,从而实现了毫无意义的 90% 的准确度。
我曾经成功使用的一个策略是选择随机批次进行训练,这些批次确实具有均匀分布的 0 和 1。这种方法确保我仍然可以使用我的所有训练数据并产生不错的结果,准确率低于 90%,但分类器更有用。由于在这种情况下精度对我来说有点无用,我选择的指标通常是 ROC 曲线下面积 (AUROC),这会产生远高于 0.50 的结果。
问题:
(1) 我所描述的策略是对不平衡数据进行训练的公认或最佳方式,还是有更好的方法?
(2) 由于准确度指标在数据不平衡的情况下没有那么有用,是否有另一个指标可以通过改变成本函数来最大化?我当然可以在训练后计算 AUROC,但是我可以以最大化 AUROC 的方式进行训练吗?
(3) 是否可以对成本函数进行一些其他更改以改善不平衡数据的结果?目前,我正在使用 TensorFlow 教程中给出的默认建议:
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
我听说这可以通过增加对较小标签类别的错误分类成本的加权来实现,但我不确定如何做到这一点。
【问题讨论】:
-
您的问题解决了吗?我有一个类似的问题,我目前正在尝试 a) 在 hidden1 处 Dropout 50%,b) L2 正则化损失和 c) 删除最突出的 90% 类并使用 10% 均匀分布的类进行计算。
-
我从来没有找到比随机批次更好的解决方案。出于实用性考虑,我最终完全放弃了神经网络,转而使用 scikit-learn 中实现的基于树的方法。在这里,有内置的交叉验证方法可以在 AUROC 上进行优化,很好地解决了不平衡问题。它们的运行速度也比 TensorFlow 快得多,因为我有很多 CPU,但没有 GPU。
标签: machine-learning neural-network deep-learning tensorflow perceptron