Данные временных рядов — это набор данных, которые связаны друг с другом, где каждое значение основано на предыдущих значениях. При построении модели машинного обучения предсказание следующего шага в будущем на основе более поздних шагов в истории обычно будет точным. Чтобы улучшить обучение в моделях временных рядов, необходимо обрабатывать данные в пакетах последовательностей.
Риск утечки данных, поскольку модель должна предсказывать будущее, если мы случайным образом перемешиваем данные и разделяем их на обучающий и тестовый наборы данных; тогда мы можем слить некоторые будущие ответы модели на этапе обучения. Это приведет к неожиданным результатам во время тестирования.
На приведенной ниже диаграмме показан временной ряд с одним входом и одним выходом. Если мы смешаем разделение на обучение и тестирование, мы фактически предоставим модели доступ к некоторым тестовым данным, имея будущие временные ряды 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)
Заключение
Подготовка данных временных рядов требует немного дополнительной работы, поскольку каждый элемент фактически будет вводом для следующего элемента. Перетасовка и разделение без обработки данных приведет к утечке некоторых ответов модели во время обучения. Требуется выучить последовательности. Сначала мы создаем оконный набор данных и пакетно объединяем его элементы. Затем в каждом наборе данных мы объединяем входные данные и выходные данные вместе. В послесловии мы перетасовываем набор данных, не перетасовывая содержимое пакетов.
Полный процесс можно представить на рисунке ниже:
Я надеюсь, что вы узнали для этого, пожалуйста, оставьте свой отзыв!
Полный код