MJo*_*eph 27 machine-learning perceptron neural-network deep-learning tensorflow
情况:
当我的训练数据在2个标签之间的标签分布不平衡时,我想知道如何最佳地使用TensorFlow.例如,假设MNIST教程被简化为仅区分1和0,其中我们可用的所有图像都是1或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)
Run Code Online (Sandbox Code Playgroud)
我听说这可能是通过加大小标签类的错误分类的成本来实现的,但我不确定如何做到这一点.
(1)可以使用你的策略.我也在处理不平衡数据,我首先尝试使用下采样和上采样方法,使训练集均匀分布.或者使用ensemble方法训练具有均匀分布子集的每个分类器.
(2)我没有看到任何方法来最大化AUROC.我的想法是AUROC基于真正的正率和误报率,这并不能说明它在每个实例上的效果如何.因此,它可能不一定最大化分离类的能力.
(3)关于通过类实例的比例来加权成本,它类似于Tensor流中的类不平衡二元分类器的损失函数 和答案.
小智 5
对于不平衡的数据集,想到的前两种方法是(增加正样本,进行采样以实现平衡的批次分布)。
增正阳性样本 这是指在对阳性样本少得多的数据集进行训练时,增加分类错误的阳性样本的损失。这激励了ML算法学习对阳性样本更好的参数。对于二进制分类,在tensorflow中有一个简单的API可以实现这一目标。参见下面引用的(weighted_cross_entropy)
批量采样 这涉及对数据集进行采样,以使每批训练数据具有从正样本到负样本的均匀分布。这可以使用tensorflow提供的拒绝采样API来完成。