我有两个二进制不平衡数据集,其中标签为以太0或1,预测输出在0和1之间。正数情况下有10000个样本,而负数情况下有90000个样本。我在训练时使用了100个批次。
在计算BinaryCrossEntropyLoss(在pytorch中)时,有可能提供每批元素正则化权重。
我的问题是:
要计算一般类别的体重剂量,更合理的做法是在开始时计算1次(对于阳性病例,则为1 /(10000 /(100000)),并使用此值来缩放每个样品的损失
要么:
首先找到批次类别的不平衡量,以计算批次级别的重量(例如,在批次中,它可能是25个正值和75个负值,因此对于正值情况为1 /(25 /(25 + 75))
我问这个是因为损失是整个批次的平均值
最佳答案
如果您希望以此方式进行操作,则应计算每个批次类的不平衡量。
另一方面,您可能应该确保每个批次都保留标签统计信息(例如,对于批次64
和您的案例,您应该具有6
阳性样品,其余样品为阴性)。这样,一次计算类不平衡并将其逐个批次添加到torch.nn.BCELoss就足够了。
我会建议另一种方法,例如使用PyTorch的Sampler
类进行过采样或欠采样(不要通过复制示例来做到这一点,它完全浪费了空间)。您可以手动实现它,也可以使用为您完成此任务的第三方库,例如torchdata(披露:我是作者)和torchdata.samplers.RandomOverSampler
。
关于python - 在适当的地方进行类不平衡正则化(数据级别或批处理级别),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58233328/