深度学习与不平衡数据集

5

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

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构建深度前馈神经网络。我获得了90多的准确性和80多的AUC分数。当然,数据集严重不平衡,所以这些指标是没有用的。我的重点是获得一个良好的召回值,并且我不想过采样1类。我已经尝试了模型的复杂性,但都无济于事,最好的模型只能正确预测25%的正类。
我的问题是,考虑到这些数据集的分布,构建模型而不获取更多的数据(我不能获取更多的数据)是否是徒劳之举,或者有一种方法可以解决处理这么不平衡的数据。
谢谢!
2个回答

3

问题

我能否使用tensorflow来进行30:1的不平衡分类学习

回答

可以,而且我已经使用过了。Tensorflow提供了输入权重矩阵的功能,请查看tf.losses.sigmoid_cross_entropy函数,其中有一个weights参数。您可以提供与Y形状匹配的矩阵,并为每个Y的值提供相对权重,以指定训练示例应该具有的权重。

一种找到正确权重的方法是尝试不同的平衡并运行训练,然后查看混淆矩阵和每个类的精确率vs准确率的情况。一旦两个类的精度与准确率比大约相等,它们就会平衡。

示例实现

这里是一个示例实现,将一个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

most参数表示要考虑的最大分数差异。 0.9相当于.1:.9 = 1:9,而.5相当于1:1。 小于.5的值无效。


2
您可能会对这个问题及其答案感兴趣。它的范围比您的先验更加受限,因为它专门涉及分类权重,但它似乎与您的情况非常相关。
此外,AUC绝对不是无关紧要的:实际上,它与您的数据不平衡是独立的。

请翻译以下有关编程的内容:返回只翻译文本:不要重复回答,而是将其标记为重复。 - Salvador Dali
是的 - 在这种情况下,尽管我会指向同样的解决方案,但我认为问题更广泛。 - P-Gn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接