使用多层感知器对不平衡数据集进行分类

时间:2017-10-15 20:28:21

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

我在分类问题上遇到了麻烦。

我有两个标签训练数据中有近40万个向量,我想训练MLP将数据分为两类。 但是,数据集是如此不平衡。 95%的人有标签1,其他人有标签0.准确性随着训练的进展而增加,并在达到95%后停止。我想这是因为网络预测所有向量的标签为1。

到目前为止,我尝试删除0.5个概率的图层。但是,结果是一样的。有没有办法提高准确度?

3 个答案:

答案 0 :(得分:1)

我认为处理不平衡数据的最佳方法是为您的班级使用权重。例如,您可以对类进行加权,使得每个类的权重总和相等。

import pandas as pd

df = pd.DataFrame({'x': range(7),
                   'y': [0] * 2 + [1] * 5})
df['weight'] = df['y'].map(len(df)/2/df['y'].value_counts())

print(df)    
print(df.groupby('y')['weight'].agg({'samples': len, 'weight': sum}))   

输出:

   x  y  weight
0  0  0    1.75
1  1  0    1.75
2  2  1    0.70
3  3  1    0.70
4  4  1    0.70
5  5  1    0.70
6  6  1    0.70

   samples  weight
y                 
0      2.0     3.5
1      5.0     3.5

答案 1 :(得分:1)

您可以在示例子集上尝试其他分类器。 SVM可以很好地处理小数据,所以你可以假设只有10k的例子,在类中有5/1的比例。

你也可能以某种方式对小班级进行过度抽样,并对另一班级进行抽样。

您也可以简单地对课程进行加权。

还要考虑适当的指标。你注意到你输出的输出只能预测一个标签,这很好。但是,使用准确性并不容易。

关于不平衡数据集的一些好主意:

PagedResultDto

请记住不要更改测试集。

答案 2 :(得分:0)

这是一种常见情况:网络学习常数并且无法摆脱这种局部最小值。

当数据非常不平衡时(如您的情况),一种可能的解决方案是weighted cross entropy损失函数。例如,在tensorflow中,应用内置的tf.nn.weighted_cross_entropy_with_logits函数。在this post中也对这个想法进行了很好的讨论。

但我应该说,获得更多数据以平衡两个班级(如果可能的话)将始终有所帮助。

相关问题