Как разделить повторяющийся набор данных на обучающие и тестовые наборы данных?

#python #pytorch

Вопрос:

У меня есть повторяющийся объект набора данных со всеми моими файлами данных. Как я могу разделить его на набор для обучения и проверки. Я видел несколько решений для пользовательских наборов данных, но iterable не поддерживает len() оператор. torch.utils.random_sample() и torch.utils.SubsetRandomSample() не работай.

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

Комментарии:

1. Как бы вы разделили свой набор данных, если бы не знали его длину? Это невозможно, вы должны знать размер базовых данных, иначе вы просто не сможете их разделить.

2. Я открыт для других предложений, я должен использовать iterabledataset. Я хочу убедиться, что ничего не упустил. В противном случае я могу разделить выборки перед прохождением через набор данных и принять несовершенное соотношение, вызвав набор данных отдельно для двух наборов.

Ответ №1:

Технически вы можете просто установить соотношение целей и начать собирать предметы в два списка случайным образом, используя это соотношение. Результат не будет идеальным, но асимптотически он сохранит соотношение.

Примером является 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 в конце.