我在分类问题上遇到了麻烦。
我有两个标签训练数据中有近40万个向量,我想训练MLP将数据分为两类。 但是,数据集是如此不平衡。 95%的人有标签1,其他人有标签0.准确性随着训练的进展而增加,并在达到95%后停止。我想这是因为网络预测所有向量的标签为1。
到目前为止,我尝试删除0.5个概率的图层。但是,结果是一样的。有没有办法提高准确度?
答案 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的比例。
你也可能以某种方式对小班级进行过度抽样,并对另一班级进行抽样。
您也可以简单地对课程进行加权。
还要考虑适当的指标。你注意到你输出的输出只能预测一个标签,这很好。但是,使用准确性并不容易。
关于不平衡数据集的一些好主意:
请记住不要更改测试集。
答案 2 :(得分:0)
这是一种常见情况:网络学习常数并且无法摆脱这种局部最小值。
当数据非常不平衡时(如您的情况),一种可能的解决方案是weighted cross entropy损失函数。例如,在tensorflow中,应用内置的tf.nn.weighted_cross_entropy_with_logits
函数。在this post中也对这个想法进行了很好的讨论。
但我应该说,获得更多数据以平衡两个班级(如果可能的话)将始终有所帮助。