深度学习不平衡数据集

时间:2017-06-16 19:45:35

标签: machine-learning tensorflow deep-learning

我有两个看起来像这样的数据集:

DATASET 1
Training (Class 0: 8982, Class 1: 380)
Testing (Class 0: 574, Class 1: 12)

DATASET 2
Training (Class 0: 8982, Class 1: 380)
Testing (Class 0: 574, Class 1: 8)

我正在尝试在Tensorflow中构建一个深度的前馈神经网络。我在80年代获得了准确度,在80年代获得了AUC分数。当然,数据集严重失衡,因此这些指标毫无用处。我的重点是获得良好的召回价值,我不想对第1类进行过度抽样。我玩弄模型的复杂性无济于事,最好的模型只能正确预测正面类别的25%。

我的问题是,考虑到这些数据集的分布,在没有获取更多数据(我无法获得更多数据)的情况下构建模型是徒劳的,或者在使用这些数据集方面数据非常不平衡。

谢谢!

2 个答案:

答案 0 :(得分:3)

问题

我可以使用tensorflow来学习不平衡分类,比率约为30:1

答案

是的,我有。特别是Tensorflow提供了输入权重矩阵的能力。看看tf.losses.sigmoid_cross_entropy,有一个权重参数。您可以输入与 Y 形状匹配的矩阵,并且 Y 的每个值都提供训练示例应具有的相对权重。

找到正确权重的一种方法是启动不同的平衡并运行训练,然后查看您的混淆矩阵以及每个班级的精确度与准确度之间的差异。一旦你让两个类具有相同的精度与准确度,那么它们就是平衡的。

实施示例

以下是一个示例实现,它将 Y 转换为对我来说效果非常好的权重矩阵

def weightMatrix( matrix , most=0.9 ) :
    b = np.maximum( np.minimum( most , matrix.mean(0) ) , 1. - most )
    a = 1./( b * 2. )
    weights = a * ( matrix + ( 1 - matrix ) * b / ( 1 - b ) )
    return weights

最多参数表示要考虑的最大小数差异。 0.9 等于.1:.9 = 1:9,其中.5等于1:1。低于.5的值不起作用。

答案 1 :(得分:2)

您可能有兴趣查看this question及其答案。它的范围是先验的,比你的更受限制,因为它解决了分类的特定权重,但它似乎与你的情况非常相关。

此外,AUC肯定无关紧要:它实际上与您的数据不平衡无关。