我有两个二进制不平衡数据集,其中标签为以太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/

10-12 18:01