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