首页 > 解决方案 > 如何将可迭代数据集拆分为训练和测试数据集?

问题描述

我有一个包含所有数据文件的可迭代数据集对象。如何将其拆分为训练集和验证集。我见过一些自定义数据集的解决方案,但 iterable 不支持len()运算符。 torch.utils.random_sample()并且torch.utils.SubsetRandomSample()不工作。

def __init__(self):
    bla bla
def __iter__(self):
    bla bla
    yield batch

标签: pythonpytorch

解决方案


从技术上讲,您可以设置一个目标比率,然后开始使用该比率将项目随机收集到两个列表中。结果不会是完美的,但它会渐近地保持该比率。

示例是 JavaScript,因为它可以在此处运行:

{
  let a = [],
      b = [];
  function addsample(x) {
    if (Math.random() < 0.2) // aims for 20%-80% split
      a.push(x);
    else
      b.push(x);
    return {a, b};
  }
}

for(let i=0;i<20;i++)
  console.log(JSON.stringify(addsample(i)));

如果您运行该片段几次,您会看到输出变化很大,但即使样本量如此之小,它也很明显,通常总是有一个合适的分割可用,a实际上只有大约 1/4的大小b。有时它甚至可以精确地结束 4:16,但很多时候它会是别的东西。a当元素多于b结尾时,也可能会出现“不走运”的运行。


推荐阅读