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

Это было моей мотивацией для этой статьи и связанного репозитория на GitHub: чтобы ответить на вопросы, которые у меня возникли, когда я исследовал прогнозирование общего назначения, создать простые в использовании модули для многомерного/многоэтапного прогнозирования и ранжировать различные методологии на открытых наборах данных.

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

Глоссарий:

ARIMA и VAR: семейство моделей авторегрессионного интегрированного скользящего среднего, которые исторически использовались статистиками для прогнозирования одномерных временных рядов. Векторная авторегрессия (VAR) или VARIMA — это обобщение ARIMA для многомерных рядов.

Автокорреляция: корреляция между событием во временном ряду и его собственной запаздывающей версией.

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

Одношаговое и многоэтапное прогнозирование: прогнозирование с одним временным шагом в будущем и прогнозирование с несколькими временными шагами в будущем.

Стационарность. Временной ряд является стационарным, если его статистические свойства, такие как среднее значение и дисперсия, остаются постоянными во времени.

Одномерный и многомерный. Одномерный ряд — это изменение во времени для одной переменной, а многомерный ряд — изменение во времени для нескольких переменных.

Введение

Традиционные статистические методы и методы машинного обучения (ML):

На это исследование [1] часто ссылаются, чтобы показать, что традиционное семейство моделей ARIMA может при определенных условиях давать лучшие результаты, чем методы машинного обучения. Традиционные статистические модели часто применяются к одномерным временным рядам для линейного моделирования автокорреляций. Упомянутая статья также является одномерным исследованием.

Однако у этих традиционных схем прогнозирования есть ограничения. Во-первых: как уже упоминалось, ваша модель линейна по прошлым событиям. Во-вторых: вам нужно тщательно исследовать стационарность, порядок лагов, модель и остатки, чтобы убедиться, что все в порядке. В-третьих: по замыслу ваша модель предсказывает одно событие в будущем, и если вы хотите произвести больше, модели обычно делают это рекурсивно и, следовательно, со временем теряют точность.

При наличии многомерного ряда следует использовать статистическую схему VAR(VARIMA), которая имеет все вышеперечисленные ограничения.

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

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

Оформление проблемы как задачи контролируемого обучения:

В общих задачах машинного обучения разделение между зависимыми и независимыми переменными в данных очевидно. То же самое неверно, когда вы сталкиваетесь с данными временных рядов, поскольку вам сначала нужно представить данные как задачу контролируемого обучения. Если вы поищите это в Интернете, вы столкнетесь с двумя основными способами формулировки проблемы:

1- На Kaggle или здесь можно увидеть ленивый подход к отсечке, в котором упорядоченные одномерные данные разбиваются в определенной точке для создания обучающих и тестовых наборов. Затем делаются точечные прогнозы для каждого события временного ряда в качестве целевой переменной с учетом категориальных признаков даты и времени в качестве независимых переменных. В некоторых случаях вы видите, что также использовались запаздывающие целевые переменные.

Проблема начинается, когда вы хотите сделать многошаговые прогнозы на будущее! Либо у вас есть чисто фиктивные переменные даты и времени, либо вы можете использовать только одну конкретную переменную задержки того же размера, что и ваш горизонт прогноза. Это очень ограничивающая стратегия для создания набора данных контролируемого обучения из временных рядов.

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

Более общий и элегантный подход показан в этой статье блога Tensorflow здесь. Они вводят класс генератор окон для прогнозирования временных рядов. Класс позволяет изменять входные, выходные и смещенные размеры для создания трехмерного набора данных Tensorflow, который включает прошлые времена (размерность 2) в нескольких сериях (размерность 3).

В настоящей статье предлагается обобщение класса генератора данных из блога Tensorflow в Numpy, что обеспечивает большую гибкость при выборе входных и выходных переменных.

Множественный прогноз на будущее:

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

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

Прямые и рекурсивные стратегии могут применяться ко всем моделям для получения многошаговых прогнозов. Но существуют модели машинного обучения (ML), которые по своей сути могут создавать векторные выходные данные, которые в некоторых случаях напрямую связаны с концепцией времени (рекуррентные нейронные сети), а в других случаях могут косвенно создавать многошаговые прогнозы.

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

Методы и модели:

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

Модели (описанные ниже) в модуле нейронные сети (nn) могут создавать одно- или многошаговые выходные данные. Режим одиночного вывода моделей можно использовать в рекурсивных или прямых классах для получения многоэтапных выходных данных.

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

Все нейросетевые модели принимают в качестве аргумента окно данных, сгенерированное генератором скользящего окна. Атрибуты окна, такие как ширина ввода, ширина метки и количество элементов ввода и метки, затем используются для создания слоев с гибким размером. Ниже приведены модели в модуле nn:

  • naive_model: базовая модель в этой группе. Производительность других моделей будет сравниваться с наивной моделью, и если другие модели не могут превзойти наивную модель, данные временного ряда могут быть рядом случайных блужданий.
  • dense_model. Многослойный персептрон — это простейшее семейство нейронных сетей, которое можно использовать для прогнозирования временных рядов. Полносвязные слои по своей сути не содержат понятия времени, но они могут легко обучаться нелинейным автокорреляциям. Слой сглаживания в начале позволяет использовать любой размер ввода. Плотный слой с единицами измерения, равными количеству объектов окна, умноженному на ширину метки окна, а затем слой изменения формы в конце обеспечивает вывод ширины метки и количества интересующих объектов.

Сверточные сети: одномерные сверточные слои могут изучать последовательности, применяя к ним несколько фильтров. Выходной размер сверточных слоев зависит от входных данных и размера ядра.

  • conv_model: самая простая архитектура с наименьшим количеством обучаемых параметров с одним одномерным слоем преобразования. мы можем добавить один или два плотных слоя после слоя conv. В зависимости от размера ядра и входной ширины вы можете предсказать различные выходные размеры. Код выдаст ошибку Value, если размер ввода и вывода не совпадают, и подсказку, как изменить ширину ввода.
  • conv_flex_model: более гибкий дизайн за счет количества обучаемых параметров. мы можем иметь сглаживающий слой после сверточного слоя и добавить плотный слой и слой изменения формы, аналогичный модели с несколькими персептронами, чтобы гибко прогнозировать любой выходной размер.
  • conv_model_recursive_training. Эта модель немного сложнее. Он применяет идею рекурсивного прогноза не во время прогноза, а во время обучения. Используя функциональный API tensorflow.keras, были определены общие слои. На каждом временном шаге делается одношаговое предсказание, предсказание будет объединено с обучающими данными, и один временной шаг будет удален из начала обучающих примеров, чтобы сохранить форму данных нетронутой. Поскольку слои являются общими, общие параметры обучения ниже по сравнению с предыдущей сверточной моделью.

Сети LSTM:Сети, представленные до сих пор, не имели врожденного понимания измерения времени. Однако рекуррентные нейронные сети (RNN) и специальная группа долговременной короткой памяти (LSTM) изначально содержат измерение времени и являются гибкими в отношении размера ввода и вывода. Здесь вы можете прочитать больше о LSTM, а здесь вы можете увидеть, насколько разнообразными могут быть их архитектуры.

  • LSTM_model: это простейший дизайн LSTM с одним уровнем LSTM, который возвращает только выходные данные из последней ячейки и не возвращает никакой последовательности. На выходе будет двумерный (выборки, единицы) вектор. Затем мы можем использовать плотный слой с единицами, равными количеству объектов метки, умноженному на ширину метки, и изменить форму слоя, как и раньше, чтобы получить интересующий выходной размер.
  • LSTM_lambda_layer: — это дизайн «последовательность к последовательности». Если у вас есть слой LSTM, который возвращает все последовательности (а не только последнюю ячейку), вы можете использовать распределенный по времени плотный слой, чтобы применить один и тот же плотный слой ко всем временным шагам (в Tensorflow 2.0 простой плотный слой после LSTM с 3d вывод по умолчанию распределяется по времени). Затем выходные данные будут проходить через настраиваемый лямбда-слой, который будет изменен в соответствии с выходным размером наших меток.
  • LSTM_model_encoder_decoder: это еще одна сеть «последовательность к последовательности», в которой мы используем два уровня LSTM: кодировщик с схемой «многие к одному» и декодер со схемой «один ко многим». За первым следует повторяющийся вектор размером с ширину метки, а за вторым — плотный слой с единицами, равными количеству объектов метки.

И наконец:

  • LSTM_model_recursive_train: аналогичен conv_model_recursive train. Общие слои были определены для рекурсивного обучения модели LSTM для всех выходных временных шагов. Общий слой LSTM в этом случае возвращает свое состояние, а также выходные данные, что означает, что ячейки LSTM используют состояние предыдущих ячеек и проходят авторегрессивное обучение.

Классические модели машинного обучения:

Одним из преимуществ генератора окон в Numpy по сравнению с Tensorflow является возможность использовать его для обучения классических моделей машинного обучения (ML). Некоторые модели машинного обучения способны создавать двухмерные векторные выходные данные. Мы можем использовать функцию in_reshape для 3D-данных из генератора окон, чтобы использовать данные в качестве входных данных для моделей ML, а затем функцию out_reshape на выходе, чтобы преобразовать их обратно в 3д.

Модуль репозитория models_classic_ml (cm) содержит эти функции изменения формы, а также слегка измененные прямые и рекурсивные классы из модуля nn, чтобы их можно было использовать с классическими моделями машинного обучения.

Цель состоит в том, чтобы сравнить производительность всех моделей в предсказаниях векторного вывода, а также рекурсивных и прямых предсказаниях. Поэтому модули nn и cm имеют схожие API, облегчающие сравнение и построение графиков.

Использование модулей демонстрируется в блокноте Jupyter Analytics в папке блокнотов репозитория.

Результаты и обсуждение:

Как показано в блокнотах, хорошей практикой перед выбором параметров окна является просмотр графиков автокорреляции (acf/pacf) ряда. вы можете принять более взвешенное решение о размере окна ввода, поскольку вы можете видеть, какие задержки бросаются в глаза, и проверять сезонность данных. Вы можете прочитать здесь [4] и посмотреть здесь, как интерпретировать эти сюжеты.

Здесь я выбираю те же входные и меточные функции, потому что мы хотим использовать рекурсивную схему прогнозирования, а также другие, и, как уже упоминалось для рекурсивной стратегии, это условие. Мы выбираем входную ширину, которая соответствует сезонности некоторых рядов (переменных), представляющих интерес (24 временных шага), и планируем прогнозировать 15 временных шагов. На следующем снимке экрана показаны параметры окна:

В аналитической записной книжке Jupyter вы можете экспериментировать с шириной ввода и меток, размером сдвига окна, перетасовкой данных и включенными функциями, пока не получите наилучшие результаты, как показано в метриках.

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

На рисунке (1) показаны показатели производительности для всех моделей (за исключением простой модели конверсии, поскольку она не соответствовала интересующей ширине входных данных окна) из модуля nn и трех классических моделей машинного обучения, линейной регрессии, регрессор k-ближайших соседей и регрессор дополнительного дерева. Для ясности значения среднеквадратичной ошибки (MSE) и средней абсолютной ошибки (MAE) показаны поверх гистограмм.

Для набора данных (набор данных о погоде) и выбранных параметров окна семейство моделей LSTM, по-видимому, имеет наилучшую производительность. Тот факт, что среди классических моделей линейная модель показала себя неплохо, может означать, что нелинейность в автокорреляциях не так важна для этих данных. Регрессор дополнительного дерева справился с задачей хуже, чем наивная модель, что, возможно, совсем неудивительно, зная, что ансамблевые методы не так хороши в экстраполяции и прогнозировании, читайте здесь.

Аналогичное поведение наблюдается при использовании одних и тех же моделей в наборе данных совместного использования велосипедов в папке данных репозитория.

На рисунке (2) показаны диаграммы потерь для всех обученных моделей из модуля nn. Заголовки графиков показывают название модели вместе с количеством обучаемых параметров. Когда размер данных невелик, следует также обратить внимание на количество изученных параметров, поскольку сложные модели могут перенасыщаться¹ на небольших данных.

На рисунке (3) показаны четыре хорошо работающие модели с рисунка (1), которые были выбраны, и их производительность для прогнозирования столбца «p (мбар)» на последнем примере из набора тестов (вы можете изменить пример на plot в функциях и методах построения графиков модулей nn) с использованием различных стратегий многоэтапного прогнозирования. Один приведенный пример не является репрезентативным для средней производительности модели, для этого в заголовке изображены средние MAE, а скорее тенденция и поведение прогноза.

Это видно в векторном прогнозе вывода (a), помимо средней производительности, модели довольно хорошо предсказали тенденцию временного ряда. Однако рекурсивные прогнозы, как предполагалось, страдают от накопления ошибок по мере увеличения временных шагов в будущем, что видно на рисунке (3b). Прямые прогнозы (с), хотя и имеют хорошую общую метрику, не позволяют увидеть тенденцию будущих событий. Поскольку модели прямого прогноза предсказывают события независимо друг от друга, такое поведение также ожидается.

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

Хотя наборы данных, созданные генератором окон (набор обучения/набор проверки и набор тестов), представляют собой пары входных данных/меток, вы также можете легко использовать модели для создания непредвиденных будущих прогнозов (без меток).

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

Другие наборы данных:

Вы можете запустить Jupyter Analytics и модели как есть в своем собственном наборе данных или изменить модели по своему усмотрению в модуле nn. Здесь вы можете найти многомерные данные временных рядов, чтобы попробовать.

Основное внимание в приведенном выше анализе уделялось более общему многомерному/многоэтапному прогнозированию. Вы можете легко использовать код и аналитику Jupyter для особого случая одномерного и одношагового прогнозирования.

Заключение:

Используя подход гибкого скользящего окна, временные ряды были сформулированы как задачи обучения с учителем. Затем параметры окна использовались при разработке моделей произвольного размера входных и выходных данных. Помимо встроенных многошаговых прогнозов, были реализованы и протестированы рекурсивная и прямая стратегии.

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

Ножные примечания и ссылки:

¹ Для набора данных о погоде, используемого здесь, данные велики по сравнению с размером сетей, и переобучение не является значительным. Также на момент написания этой статьи Tensorflow 2.4 на Apple M1 все еще глючил и иногда выдавал «внутреннюю ошибку» при регуляризации плотных слоев, поэтому я закомментировал регуляризацию плотных и сверточных слоев в nnmodule, но не стесняйтесь добавлять его обратно.

[1] - Макридакис С., Спилиотис Э., Ассимакопулос В. (2018) Методы прогнозирования статистики и машинного обучения: проблемы и пути продвижения вперед. https://doi.org/ 10.1371/journal.pone.0194889

[2] - Бен Тайеба С., Бонтемпия Г., Атияк А., Сорджамаа А. (2012) Обзор и сравнение стратегий прогнозирования временных рядов на несколько шагов вперед на основе конкурса прогнозов NN5. https://doi.org/10.1016/j.eswa.2012.01.039

[3] - Бен Тайеба С., Бонтемпия Г., Ла Борн И. (2013) Стратегии машинного обучения для прогнозирования временных рядов. DOI: 10.1007/978–3–642–36318–4_3

[4] - Публикации Sage, Узнайте о временных рядах ACF и PACF в SPSS с данными из базы данных фуражного зерна Министерства сельского хозяйства США (1876–2015). https://dx.doi.org/10.4135/9781473995581