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

时间:2016-07-29 17:34:07

标签: neural-network tensorflow random-forest

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

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

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

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

感谢您的帮助! 保罗

更新:

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

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

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

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

5 个答案:

答案 0 :(得分:2)

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

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

  2. 分别重新计算两个班级的成本。你想让主导阶级的损失减轻。例如,这在文章Holistically-Nested Edge Detection

  3. 中使用

答案 1 :(得分:2)

我将对chasep的答案进行一些扩展。 如果您正在使用神经网络,然后使用softmax +交叉熵或铰链丢失,那么您可以提及@ chasep255使网络错误分类显示较少的示例成本更高。
要做到这一点,只需将成本分成两部分,并在具有较少示例的类上加上更多权重 为简单起见,如果你说主导类对softmax标记为负(neg)而另一个标记为正(pos)(对于Hinge你可能完全相同):

Before:
0.0, 1.0
2.0, 5.0
3.0, 8.0
After:
0.0, 1.0
2.0, 5.0
3.0, 4.4

\ alpha大于1。

对于交叉熵的情况,这将转换为张量流,其中正数被标记为[1,0],负数[0,1]被标记为:

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

Whatismore通过挖掘Tensorflow API,你似乎有一个实现它的张量流函数cross_entropy_mean=-tf.reduce_mean(targets*tf.log(y_out)*tf.constant([alpha, 1.])) 没有读取细节,但看起来相当简单。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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