使用TensorFlow进行不平衡数据的训练

29

情境:

当我的训练数据在两个标签之间的分布存在不平衡时,我想知道如何最优地使用TensorFlow。例如,假设MNIST教程仅用于区分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处使用50%的Dropout,b)在损失函数中使用L2正则化以及c)删除最突出的90%类并使用均匀分布的10%类进行计算。 - Frank
我从未找到比随机批处理更好的解决方案。为了实用性,我最终放弃了神经网络,转而采用在scikit-learn中实现的基于树的方法。在这里,内置了可以优化AUROC并美观地解决不平衡问题的交叉验证方法。由于我有足够的CPU但没有GPU,它们运行速度也比TensorFlow快得多。 - MJoseph
https://www.tensorflow.org/tutorials/structured_data/imbalanced_data - Peyman habibi
4个回答

8

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

(2)我没有看到任何最大化AUROC的方法。我的想法是,AUROC基于真正和假正率,这并不能说明它在每个实例上的工作效果有多好。因此,它可能无法最大化分离类的能力。

(3)关于按类实例比率加权成本,它类似于Tensor flow中类不平衡二元分类器的损失函数和答案。


5
关于不平衡的数据集,首先想到的两种方法是(加权正样本,采样以实现平衡的批量分布)。 加权正样本 这指的是在训练具有较少正样本的数据集时,增加误分类的正样本的损失。这激励ML算法学习更适合正样本的参数。对于二元分类,在tensorflow中有一个简单的API可以实现此功能。请参见下面引用的(weighted_cross_entropy)。 批量采样 这涉及对数据集进行采样,以使每个训练数据批次具有正样本和负样本的均匀分布。这可以使用tensorflow提供的rejections sampling API完成。

4

我是一个正在努力解决不平衡数据问题的人。我的应对策略如下:

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是对抗不平衡数据的最佳度量之一。


2

1) 是的,这是应对不平衡数据的良好策略。但是只有在使用 SGD 时,这个策略才是有效的神经网络。

另一个平衡训练数据的简单方法是使用加权样例。当遇到不平衡的样例时,只需通过更大/更小的权重来放大每个实例的损失。如果你使用在线梯度下降,可以很简单地在遇到不平衡的样例时使用更大/更小的学习率。

2. 不确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接