在适当的地方进行类不平衡正则化(数据级别或批处理级别)

时间:2019-10-04 09:12:23

标签: python machine-learning pytorch

我有两个二进制不平衡数据集,其中标签为以太0或1,预测输出在0和1之间。正例有10000个样本,而负例有90000个样本。训练时我使用了100个批次。

在计算BinaryCrossEntropyLoss(在pytorch中)时,有可能提供每批元素正则化权重。

我的问题是: 要计算一般类别的体重剂量,更合理的做法是在开始时进行1次计算(对于阳性病例,则为1 /(10000 /(100000)),并使用该值缩放每个样品的损失

或:

首先找到批次类的不平衡量,以计算批次级别的重量(例如,在批次中,它可能是25个阳性和75个阴性,因此阳性情况为1 /(25 /(25 + 75))

我问这个是因为损失是批次中的平均损失

1 个答案:

答案 0 :(得分:1)

如果您希望以此方式进行操作,则应计算每个批次类的不平衡量。

另一方面,您可能应该确保每个批次都保留标签统计信息(例如,对于批次64和案例,您应该有6个阳性样品,其余为阴性)。这样,只计算一次类不平衡并将其逐批添加到torch.nn.BCELoss中就足够了。

我会建议另一种方法,例如使用PyTorch的{​​{1}}类进行过采样或欠采样(不要通过复制示例来做到这一点,它完全浪费了空间)。您可以手动实现它,也可以使用为您完成任务的第三方库,例如torchdata(公开:我是作者)和torchdata.samplers.RandomOverSampler