【问题标题】:Neural Network - Working with a imbalanced dataset神经网络 - 使用不平衡的数据集
【发布时间】:2016-12-04 12:08:12
【问题描述】:

我正在处理具有 2 个标签的分类问题:0 和 1。我的训练数据集是一个非常不平衡的数据集(考虑到我的问题,测试集也是如此)。

不平衡数据集的比例为 1000:4,标签“0”出现的次数是标签“1”的 250 倍。但是,我有很多训练样本:大约 2300 万。所以我应该为标签“1”获得大约 100 000 个样本。

考虑到我有大量的训练样本,我没有考虑 SVM。我还阅读了关于随机森林的 SMOTE。但是,我想知道 NN 是否可以有效地处理这种带有大型数据集的不平衡数据集?

另外,由于我使用 Tensorflow 来设计模型,我应该/可以调整哪些特征来处理这种不平衡的情况?

感谢您的帮助! 保罗


更新:

考虑到答案的数量,并且它们非常相似,我将在这里全部回答,作为一个共同的答案。

1) 我在这个周末尝试了第一个选项,增加了正面标签的成本。实际上,不平衡的比例较少(如 1/10,在另一个数据集上),这似乎有助于获得更好的结果,或者至少“偏向”精度/召回分数比例。 但是,就我的情况而言, 它似乎对字母数字非常敏感。 alpha = 250,这是不平衡数据集的比例,我有 0.006 的精度和 0.83 的召回分数,但是模型预测的 1 太多了,它应该是 - 大约 0.50 标签'1' .. . 当 alpha = 100 时,模型仅预测“0”。我想我必须为这个 alpha 参数做一些“调整”:/ 我也将看看 TF 中的这个函数,因为我现在是手动完成的:tf.nn.weighted_cross_entropy_with_logitsthat

2) 我会尝试去平衡数据集,但我担心这样做会丢失很多信息,因为我有数百万个样本,但只有大约 10 万个正样本。

3) 使用较小的批量大小似乎确实是个好主意。我会试试看 !

【问题讨论】:

  • 您是否期望网络在拟合网络后应用时会更频繁地遇到“0”标签输入数据?如果是这样,您可能对不平衡感兴趣,因为这会促使网络最好地学习这些输入模式
  • 感谢您的评论!标签“0”和“1”的比例在训练集中和我必须预测的集中是相同的。但是,我不太明白您信息的第二部分:“如果是这样,您可能对不平衡感兴趣,因为这会促使网络最好地学习这些输入模式”?

标签: neural-network tensorflow random-forest


【解决方案1】:

我建议采用稍微不同的方法。在图像数据方面,深度学习社区已经提出了一些增强数据的方法。与图像增强类似,您可以尝试生成假数据来“平衡”您的数据集。我尝试的方法是使用变分自动编码器,然后从底层分布中采样,为你想要的类生成假数据。我试过了,结果看起来很酷:https://lschmiddey.github.io/fastpages_/2021/03/17/data-augmentation-tabular-data.html

【讨论】:

    【解决方案2】:

    是的 - 神经网络可以帮助您解决问题。这种问题至少有两种方法:

    1. 保持你的集合不变,但减少批次的大小和 epoch 的数量。显然,这可能比保持大批量更好。根据我的经验 - 一开始网络正在调整其权重以将最可能的类分配给每个示例,但经过许多时期后,它将开始自我调整以提高所有数据集的性能。使用交叉熵将为您提供有关将 1 分配给给定示例的概率的更多信息(假设您的网络有足够的容量)。
    2. 在评估阶段使用贝叶斯规则平衡您的数据集并调整您的分数:score_of_class_k ~ score_from_model_for_class_k / original_percentage_of_class_k
    3. 您可以在成本函数中重新加权您的类(如答案之一所述)。那么重要的事情是在你的最终答案中重新衡量你的分数。

    【讨论】:

    • 为什么要使用较小的批量?我想你会想要一个更大的,因为它会包含更多稀有样本并提供更准确的梯度表示。
    • 因为一旦你的网络知道你的大部分数据属于一个类,一个全 0 的批次就不会影响你的网络。如果批次较小,那么如果您在其中至少获得一个 1 的示例,它将比大批次对您的网络产生更大的影响。
    • 感谢您的回答! “那么重要的事情是在最终答案中重新加权你的分数”是什么意思。 ?
    • 这意味着如果原始班级百分比是 p1,但在您的训练集中您有 p2(由于数据集平衡,您可能会假设该值是 0.5),那么您需要使用 rule 调整分数:得分 * p1 / p2。
    【解决方案3】:

    我将稍微扩展一下大通的答案。 如果您使用的是神经网络,然后是 softmax+cross-entropy 或 Hinge Loss,您可以像 @chasep255 提到的那样,使网络对出现较少的示例进行错误分类的成本更高。
    要做到这一点,只需将成本分成两部分,并对示例较少的类赋予更多权重。
    为简单起见,如果你说占主导地位的类对于 softmax 被标记为负(neg),而另一个被标记为正(pos)(对于 Hinge,你可以完全相同):

     L=L_{neg}+L_{pos} =>L=L_{neg}+\alpha*L_{pos} 
    

    \alpha 大于 1。

    对于交叉熵的情况,这将在张量流中转化为正标记为 [1, 0] 和负标记 [0,1] 的类似内容:

    cross_entropy_mean=-tf.reduce_mean(targets*tf.log(y_out)*tf.constant([alpha, 1.]))
    

    更重要的是,通过深入研究 Tensorflow API,您似乎有一个 tensorflow 函数 tf.nn.weighted_cross_entropy_with_logits 实现它没有阅读细节但看起来相当简单。

    如果您使用 mini-batch SGD 训练您的算法,另一种方法是制作具有固定比例正数的批次。 我会选择第一个选项,因为它使用 TF 稍微容易一些。

    【讨论】:

    • 该死的 ppwwyyxx 刚刚发布了完全相同的内容,如果需要,将删除我的答案!
    • 您的答案是对 ppzzyyxx 答案的补充,因为您提供了 TF 方法名称。
    【解决方案4】:

    不平衡数据集通常有两种常见的方式:

    1. 如上所述的在线采样。在每次迭代中,您从训练集中抽取一个类别平衡的批次。

    2. 分别重新加权两个类的成本。你想给占主导地位的阶级的损失一个较小的权重。例如这在论文Holistically-Nested Edge Detection

    3. 中使用

    【讨论】:

      【解决方案5】:

      我可能会尝试的一件事是在计算成本时对样本进行不同的加权。例如,如果预期结果为 0,则可以将成本除以 250,如果预期结果为 1,则不理会它。这样,更稀有的样本会产生更大的影响。您也可以简单地尝试在不进行任何更改的情况下对其进行训练,看看 nnet 是否恰好可以工作。不过,我会确保使用大批量,以便您始终在每批中至少获得一个稀有样本。

      【讨论】:

        猜你喜欢
        • 2019-03-26
        • 2017-11-14
        • 1970-01-01
        • 2012-05-15
        • 2019-02-08
        • 1970-01-01
        • 1970-01-01
        • 2017-08-26
        • 1970-01-01
        相关资源
        最近更新 更多