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

时间:2016-01-27 22:30:21

标签: machine-learning neural-network deep-learning tensorflow perceptron

情况:

当我的训练数据在2个标签之间的标签分布不平衡时,我想知道如何最佳地使用TensorFlow。例如,假设MNIST tutorial被简化为仅区分1&0和0,其中我们可用的所有图像都是1或0或0。当我们有大约50%的每种类型的图像进行训练和测试时,这很容易使用提供的TensorFlow教程进行训练。但是,我们的数据中有90%的图像是0,而只有10%是1?我观察到,在这种情况下,TensorFlow会定期预测我的整个测试集为0,达到无意义的90%的准确度。

我曾经取得过一些成功的策略是选择随机批次进行训练,这些训练的分布均为0和1。这种方法确保我仍然可以使用我的所有训练数据并产生不错的结果,准确率低于90%,但是更有用的分类器。由于在这种情况下准确性对我来说有些无用,我选择的度量通常是ROC曲线下的面积(AUROC),这会产生相当高于.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)

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

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分: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

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

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

答案 3 :(得分:2)

1)是的。这是一种很好的策略来应对不平衡的数据。但只有在使用SGD时,这种策略在神经网络中才有用。

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

不确定2。