machine-learning - 在 PyTorch DataLoader 中对批次进行强制定量
问题描述
我遇到了一个数据严重不平衡的二元分类任务。(我看的是80:1)
通过欠采样,数据比现在是20:1。\
现在,欠采样/处理的数据被加载到数据加载器中,如下所示。(这是一个 nlp 任务)
train_inputs = torch.tensor(input_ids)
train_labels = torch.tensor(labels)
train_masks = torch.tensor(attention_masks)
train_data = TensorDataset(train_inputs, train_masks, train_labels)
if is_distributed:
train_sampler = torch.utils.data.distributed.DistributedSampler(dataset)
else:
train_sampler = RandomSampler(train_data)
train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=batch_size)
对于每个批次,我想确保/强制每个批次在每个分类方面的比例为 20:1。是否有一个 pytorch 内置方法可以让我强制执行这些条件?
解决方案
您可以使用WeightedRandomSampler并将替换设置为 true。只需将正例的权重乘以 20 即可使比率偏向 20:1。(假设正面是负面的 20 倍)
# labels is a numpy array of shape n,1 containing 1 and 0 for each datapoint
weights = np.ones(labels.shape)
weights[labels==1] *= 20
# now the samples will be drawn with a 20:1 ratio
sampler = WeightedRandomSampler(weights=weights, num_samples=len(labels), replacement=True)
请注意,将替换设置为 True 是强制使用比率对每个批次进行采样的必要条件,但您可能会在训练期间看到两次示例。但是,如果该比率在您的数据集中自然发生,您可以将其保留为 False。
恕我直言:随机抽样不能确保每个批次的比率为 20:1,而仅适用于比率的预期值(平均而言,批次(样本)的比率将倾向于数据集(总体)的比率),因此它应该在训练期间也不会影响平均梯度(理论上)。但我知道在实践中您可能希望拥有更多控制权。
推荐阅读
- c# - 尝试删除 Azure Functions 中的 blob,但缺少 DeleteIfExists 方法
- c - 带/不带选项的 getopt 用法
- python - 从两个离散函数中获得最大值的最短 Python 代码是什么?
- visual-studio - 无法更新工作项 - 原因:TF237124:工作项尚未准备好保存
- json - JSON API 资源是否可以具有作为关系简写的属性?
- django - 无法找到 403 Forbidden 错误的原因:Nginx Daphne Django
- bluetooth - 有没有办法在不查看规格表的情况下找到蓝牙版本?
- javascript - Firebase auth() 子函数无法识别
- c++ - 在代码块中使用图形但没有输出
- javascript - foreach 中的 if /else 条件