首页 文章

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

提问于
浏览
1

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

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

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

3 回答

  • 1

    我认为处理不 balancer 数据的最佳方法是为您的 class 使用权重 . 例如,您可以对类进行加权,使每个类的权重总和相等 .

    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

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

    您也可能以某种方式对小类进行过采样,并对另一个进行欠采样 .

    你也可以简单地给你的课增重 .

    还要考虑适当的指标 . 你注意到你输出的预测只有一个标签,这很好 . 然而,使用准确性并不容易看出 .

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

    https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/

    切记不要更改测试集 .

  • 0

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

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

    但我应该说,获得更多数据以 balancer 两个类(如果可能的话)将始终有所帮助 .

相关问题