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

问题描述 投票:28回答:4

情况。

我想知道当我的训练数据在2个标签之间的标签分布不平衡时,如何优化使用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)

我听说可以通过提高小标签类的错误分类的成本权重来实现,但我不确定如何做到这一点。

machine-learning neural-network deep-learning tensorflow perceptron
4个回答
8
投票

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

(2)我没有看到有什么方法可以使AUROC最大化。我的想法是,AUROC是基于真阳率和假阳率的,这并不能说明它在每个实例上的效果如何。因此,它不一定能最大限度地提高分班的能力。

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


5
投票

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

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

批量取样这涉及到对数据集进行采样,使每批训练数据的正样本与负样本均匀分布。这可以使用tensorflow提供的拒绝采样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.orggmane.comp.python.scikit-learn5278。

当我尝试做信用评级模型时,这两种策略都有效。

Logistic回归是处理不平衡数据和二元分类的典型方法,比如预测违约率。AUROC是处理不平衡数据的最佳指标之一。


2
投票

1)是的。这是很好的应对不平衡数据的策略。 但是这个策略只有在你使用SGD的情况下,在神经网络中才是好的。

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

不知道2。

© www.soinside.com 2019 - 2024. All rights reserved.