我正在研究一个带有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)使用较小的批量大小似乎确实是一个好主意。我会试试看 !
答案 0 :(得分:2)
imbanlanced数据集通常有两种常用方法:
如上所述的在线抽样。在每次迭代中,您都会从训练集中对类平衡批次进行采样。
分别重新计算两个班级的成本。你想让主导阶级的损失减轻。例如,这在文章Holistically-Nested Edge Detection
答案 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)
是的 - 神经网络可以帮助你的情况。这种问题至少有两种方法:
score_of_class_k ~ score_from_model_for_class_k / original_percentage_of_class_k
。答案 4 :(得分:0)
我建议采用稍微不同的方法。说到图像数据,深度学习社区已经提出了几种增强数据的方法。与图像增强类似,您可以尝试生成假数据来“平衡”您的数据集。我尝试的方法是使用变分自动编码器,然后从底层分布中采样,为您想要的类生成假数据。我试过了,结果看起来很酷:https://lschmiddey.github.io/fastpages_/2021/03/17/data-augmentation-tabular-data.html