我有两个二进制不平衡数据集,其中标签为 0 或 1,预测输出介于 0 和 1 之间。正例有 10000 个样本,而负例有 90000 个样本。我在训练时使用了 100 个批处理。
在计算 BinaryCrossEntropyLoss(在 pytorch 中)时,可以提供每批元素正则化权重。
我的问题是: 要计算一般类(class)体重剂量,更有意义的是在开始时计算 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/