使用TensorFlow训练非平衡数据

情况说明:

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

我使用的一个策略是选择随机批次进行训练,这些批次具有0和1的均匀分布。这种方法确保我仍然可以使用我的所有训练数据,并且产生了不错的结果,准确率低于90%,但分类器更有用。由于在这种情况下准确率对我来说有些无用,我通常选择的指标是接收者操作特征曲线下面积(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)

我听说通过增加对小类别误分类的成本权重可能实现这一点,但我不知道如何操作。


回答:

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

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

(3)关于根据类别实例的比例加权成本,这与TensorFlow中用于类别不平衡二元分类器的损失函数及其答案类似。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注