【问题标题】:Training on imbalanced data using TensorFlow使用 TensorFlow 对不平衡数据进行训练
【发布时间】: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


【解决方案1】:

(1)可以使用你的策略。我也在处理不平衡的数据,我首先尝试使用下采样和上采样方法来使训练集均匀分布。或者使用 ensemble 方法来训练具有均匀分布子集的每个分类器。

(2)我还没有看到任何最大化 AUROC 的方法。我的想法是 AUROC 是基于真阳性和假阳性率,这并不能说明它在每个实例上的效果如何。因此,它不一定能最大化分离类的能力。

(3)关于按类实例的比例加权成本,类似于Loss function for class imbalanced binary classifier in Tensor flow 和答案。

【讨论】:

    【解决方案2】:

    关于不平衡的数据集,首先想到的两种方法是(增加正样本的权重、采样以实现平衡的批次分布)。

    增加阳性样本的权重 这是指在对正样本少得多的数据集进行训练时,增加误分类正样本的损失。这激励 ML 算法学习更适合正样本的参数。对于二进制分类,tensorflow 中有一个简单的 API 可以实现这一点。请参阅下面引用的 (weighted_cross_entropy)

    批量抽样 这涉及对数据集进行采样,以便每批训练数据具有均匀分布的正样本到负样本。这可以使用 tensorflow 提供的拒绝采样 API 来完成。

    【讨论】:

      【解决方案3】:

      我是一个与不平衡数据作斗争的人。我应对不平衡数据的策略如下。

      1) 使用代价函数同时计算 0 和 1 个标签,如下所示。

      cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(_pred) + (1-y)*tf.log(1-_pred), reduction_indices=1))
      

      2) 使用 SMOTE,过采样方法使 0 和 1 标签的数量相似。参考这里,http://comments.gmane.org/gmane.comp.python.scikit-learn/5278

      当我尝试制作信用评级模型时,这两种策略都奏效了。

      逻辑回归是处理不平衡数据和二元分类(例如预测违约率)的典型方法。 AUROC 是应对不平衡数据的最佳指标之一。

      【讨论】:

        【解决方案4】:

        1) 是的。这是应对不平衡数据的广受欢迎的策略。但这种策略只有在使用 SGD 时才适用于神经网络。

        平衡训练数据的另一种简单方法是使用加权示例。当看到不平衡的示例时,只需将每个实例的损失放大更大/更小。如果您使用在线梯度下降,则在查看不平衡示例时,它可以像使用更大/更小的学习率一样简单。

        不确定 2。

        【讨论】:

          猜你喜欢
          • 2017-11-09
          • 2013-06-11
          • 1970-01-01
          • 2015-03-16
          • 1970-01-01
          • 2020-06-17
          • 1970-01-01
          • 2017-12-08
          • 2018-04-15
          相关资源
          最近更新 更多