使用多层感知器对不平衡数据集进行分类
Posted
技术标签:
【中文标题】使用多层感知器对不平衡数据集进行分类【英文标题】:Classification with imbalanced dataset using Multi Layer Perceptrons 【发布时间】:2018-03-27 08:18:04 【问题描述】:我在分类问题上遇到了麻烦。
我在带有两个标签的训练数据中拥有近 40 万个向量,我想训练 MLP 将数据分为两类。 但是,数据集是如此不平衡。其中 95% 的标签为 1,其他标签为 0。准确率随着训练的进行而增长,达到 95% 后停止。我猜这是因为网络将所有向量的标签预测为 1。
到目前为止,我尝试以 0.5 的概率丢弃层。但是,结果是一样的。有什么方法可以提高准确率?
【问题讨论】:
【参考方案1】:这是一种常见的情况:网络学习一个常数,无法摆脱这个局部最小值。
当数据非常不平衡时,例如您的情况,一种可能的解决方案是weighted cross entropy 损失函数。例如,在 tensorflow 中,应用一个内置的 tf.nn.weighted_cross_entropy_with_logits
函数。在this post 中也对这个想法进行了很好的讨论。
但我应该说,获取更多数据来平衡两个类(如果可能的话)总是有帮助的。
【讨论】:
【参考方案2】:您可以在示例子集上尝试另一个分类器。支持向量机可能适用于小数据,因此您可以仅假设 10k 个示例,类中的比例为 5/1。
您还可以以某种方式对小班进行过度采样,而对另一个班进行过采样。
您也可以简单地加权您的课程。
还要考虑适当的指标。很高兴您注意到您的输出仅预测一个标签。但是,使用精度不容易看出。
这里有一些关于不平衡数据集的好主意:
https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
记住不要改变你的测试集。
【讨论】:
【参考方案3】:我认为处理不平衡数据的最佳方法是为您的班级使用权重。例如,您可以对班级进行加权,使每个班级的权重总和相等。
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
【讨论】:
以上是关于使用多层感知器对不平衡数据集进行分类的主要内容,如果未能解决你的问题,请参考以下文章
当给定特定类的 0 个样本时,如何对不平衡的数据集进行分类?