首页 文章

神经网络 - 使用不 balancer 的数据集

提问于
浏览
2

我正在研究一个带有2个标签的分类问题:0和1.我的训练数据集是一个非常不 balancer 的数据集(考虑到我的问题,测试集也是如此) .

不 balancer 数据集的比例为1000:4,标签“0”比标签“1”多出250倍 . 但是,我有很多训练样本:大约2300万 . 所以我应该为标签'1'获得大约10万个样本 .

考虑到我有大量的训练样本,我没有考虑SVM . 我还读到了随机森林的SMOTE . 但是,我想知道NN是否能够有效地处理这种具有大型数据集的不 balancer 数据集?

此外,当我使用Tensorflow设计模型时,我应该/可以调整哪些特性以便能够处理这种不 balancer 的情况?

谢谢你的帮助 !保罗


更新:

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

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

2)我会尝试对数据集进行去 balancer ,但我担心我会丢失很多信息,因为我有数百万个样本但只有~100k的正样本 .

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

4 回答

  • 2

    imbanlanced数据集通常有两种常用方法:

    • 如上所述的在线抽样 . 在每次迭代中,您都会从训练集中对类 balancer 批次进行采样 .

    • 分别重新计算两个类的成本 . 你想让主导阶级的损失减轻 . 例如,在论文中使用了这个Holistically-Nested Edge Detection

  • 0

    我将对chasep的答案进行一些扩展 . 如果您正在使用神经网络,然后使用softmax交叉熵或铰链丢失,您可以像@ 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 实现它没有阅读细节,但看起来相当简单 .

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

  • 2

    我可能尝试的一件事是在计算成本时对样本进行不同的加权 . 例如,如果预期结果为0,则可以将成本除以250,如果预期结果为1,则将其分开 . 这样,更罕见的样品会产生更大的影响 . 您也可以简单地尝试对其进行培训而不进行任何更改,并查看nnet是否恰好正常工作 . 我会确保使用大批量的大小,所以你总是得到每批中至少一个罕见的样品 .

  • 0

    是的 - 神经网络可以帮助你的情况 . 这种问题至少有两种方法:

    • 保持您的设置不变,但减少批量和时期数量 . 显然,这可能比保持批量大小更有帮助 . 根据我的经验 - 在一开始网络正在调整其权重,为每个示例分配最可能的类,但在许多时期之后,它将开始调整自身以提高所有数据集的性能 . 使用交叉熵将为您提供有关为给定示例分配1的概率的其他信息(假设您的网络具有足够的容量) .

    • 使用贝叶斯规则 balancer 数据集并在评估阶段调整分数: score_of_class_k ~ score_from_model_for_class_k / original_percentage_of_class_k .

    • 您可以在成本函数中重新加权您的类(如其中一个答案中所述) . 重要的是在最终答案中重新加权你的分数 .

相关问题