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

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 个样本时,如何对不平衡的数据集进行分类?

步骤用于高度不平衡的分类步骤。我应该对数据进行上采样和下采样,还是对不平衡的类进行上采样

如何在 sklearn 中对不平衡数据集执行交叉验证

mllib 如何在内部对不平衡数据集的类进行加权?

如何对不平衡的多类数据集进行欠采样? (Python)

如何使用随机森林对不平衡类进行分类以避免过度拟合