Данные временных рядов — это набор данных, которые связаны друг с другом, где каждое значение основано на предыдущих значениях. При построении модели машинного обучения предсказание следующего шага в будущем на основе более поздних шагов в истории обычно будет точным. Чтобы улучшить обучение в моделях временных рядов, необходимо обрабатывать данные в пакетах последовательностей.

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

На приведенной ниже диаграмме показан временной ряд с одним входом и одним выходом. Если мы смешаем разделение на обучение и тестирование, мы фактически предоставим модели доступ к некоторым тестовым данным, имея будущие временные ряды 8 и 10.

Как обработать набор данных временных рядов?

Предположим, у нас есть ряд 0,1,2,..100, и нам нужно:

  • Используйте ряд 1,2,3,4,5, чтобы предсказать 6

  • Идем вперед до ряда 95,96,97,98,99, чтобы предсказать 100

Создать фиктивный массив numpy от 0 до 100

sequence = np.array(list(range(100)))
print(sequence)

Затем создайте тензор с размером [100, 1]:

seq_expanded = tf.expand_dims(sequence,-1)
print(tf.shape(seq_expanded))

Давайте создадим функцию для печати наборов данных, которую мы можем использовать на протяжении всей работы, по умолчанию функция печатает первые 5 тензоров набора данных.

def printDs(ds,take = 5):
    for ex in ds.take(take):
        print(ex)

Создайте простой набор данных TensorFlow на основе массива numpy и распечатайте его:

dataset = tf.data.Dataset.from_tensor_slices(seq_expanded)
printDs(dataset)

Окно набора данных

Затем примените «.window», чтобы создать список окон в наборе данных. Каждое окно содержит подмножество элементов входного набора данных.

dataset = dataset.window(seq_expanded,shift=1,drop_remainder=True)
printDs(dataset)

Затем набор данных преобразуется в тип «WindowDataset», обратите внимание на две вещи:

1- Последние 6 элементов не использовались, так как элементы окна не завершены. В результате он сбрасывается.

2- Набор данных состоит из окон, мы должны объединить элементы окон вместе.

dataset = dataset.flat_map(lambda b: b.batch(windowSize))
printDs(dataset)

Теперь у нас есть каждое окно с его элементами в пакетном режиме, мы должны разделить входные данные и выходные данные, используя функцию сопоставления для каждого окна, последние элементы являются выходными, а первые 5 элементов являются входными:

dataset = dataset.map(lambda x: (x[:-1],x[-1]))
printDs(dataset)

Теперь мы можем безопасно перемешивать последовательности, не влияя на процесс обучения:

dataset = dataset.shuffle(100)
printDs(dataset)

В этом случае каждый пакет будет перетасовываться сам по себе без перетасовки элементов пакета.

Также мы можем повысить производительность обучения модели, объединив входные данные вместе:

dataset = dataset.batch(3)
printDs(dataset)

Заключение

Подготовка данных временных рядов требует немного дополнительной работы, поскольку каждый элемент фактически будет вводом для следующего элемента. Перетасовка и разделение без обработки данных приведет к утечке некоторых ответов модели во время обучения. Требуется выучить последовательности. Сначала мы создаем оконный набор данных и пакетно объединяем его элементы. Затем в каждом наборе данных мы объединяем входные данные и выходные данные вместе. В послесловии мы перетасовываем набор данных, не перетасовывая содержимое пакетов.

Полный процесс можно представить на рисунке ниже:

Я надеюсь, что вы узнали для этого, пожалуйста, оставьте свой отзыв!

Полный код