【问题标题】:Classification with imbalanced dataset using Multi Layer Perceptrons使用多层感知器对不平衡数据集进行分类
【发布时间】:2018-03-27 08:18:04
【问题描述】:

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

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

到目前为止,我尝试以 0.5 的概率丢弃层。但是,结果是一样的。有什么方法可以提高准确率?

【问题讨论】:

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


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2021-07-25
          • 2013-12-11
          • 2021-07-31
          • 2020-09-25
          • 2017-07-08
          • 2016-08-23
          • 1970-01-01
          • 2015-01-28
          • 2023-03-03
          相关资源
          最近更新 更多