Использование сетей LSTM для прогнозирования временных рядов и интерпретации результатов

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

В этом посте мы демонстрируем, как использовать несколько исторических временных рядов в сочетании с рекуррентными нейронными сетями (RNN), в частности, сетями с долговременной кратковременной памятью (LSTM) [1], чтобы делать прогнозы на будущее. Кроме того, для интерпретации результатов мы используем метод, основанный на DeepLIFT [4][5].

Мы выбираем этот подход к моделированию, потому что он обеспечивает самую современную производительность в условиях, когда традиционные методы не подходят. В частности, когда данные временных рядов сложны, а это означает, что тенденции и сезонные закономерности меняются со временем, методы глубокого обучения, такие как сети LSTM, являются жизнеспособной альтернативой более традиционным методам, таким как ARMA (авторегрессивное скользящее среднее) [2]. Первоначально разработанные для задач обработки естественного языка (NLP), модели LSTM проникли в область прогнозирования временных рядов, потому что, как и в случае с текстом, данные временных рядов появляются последовательно, а временные отношения между различными частями последовательности имеют значение для определения результата прогнозирования. .

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

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

Исследование и подготовка данных

Набор данных состоит из дневных цен, включая цены открытия, максимума, минимума, закрытия (все котируются в долларах США), а также объема (дневной объем торгов в долларах США) с июля 2016 года по июль 2021 года.

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

Стационарность временных рядов

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

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

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

Генерация и подготовка функций

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

Учитывая, что наши данные финансовых временных рядов относительно чисты и структурированы, нам не нужно тратить много времени на очистку и подготовку данных. Этапы подготовки включают в себя разделение нашего набора данных на обучающие и тестовые наборы, а также масштабирование всех функций до общей шкалы от 0 до 1, что помогает предотвратить переобучение модели, когда функции находятся в разных масштабах. Обычно мы сохраняем набор данных для оценки модели в конце анализа, но в нашем случае достаточно наблюдения за производительностью модели на тестовом наборе данных.

Многомерное прогнозирование временных рядов

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

Цель

Прежде чем мы углубимся в аспект моделирования, важно определить функцию цели (или стоимости), которая соответствует бизнес-цели, чтобы убедиться, что модель действительно может помочь достичь желаемого бизнес-результата. Цель состоит в том, чтобы создать модель прогнозирования, которая максимально точно предсказывает цену, отдавая приоритет более постоянным ценовым движениям (например, недельным тенденциям) по сравнению с более мелкими и более изменчивыми внутринедельными движениями.

Мы исходим из следующих соображений:

  • Мы выбираем среднеквадратичную ошибку (MSE) в качестве нашей основной функции стоимости, учитывая, что наш набор данных имеет высокое качество, т. е. нет никаких выбросов в результате ошибок данных, которые в противном случае могли бы привести к переобучению модели с использованием этой метрики ошибки.
  • На самом деле мы выбираем Root-MSE (RMSE), см. рис. 3, вместо MSE по простой причине лучшей интерпретируемости, поскольку RMSE имеет ту же единицу, что и прогнозируемая переменная.
  • В других сценариях, таких как прогнозирование продаж, данные потенциально могут быть ошибочными, например. если праздничные дни не учитываются. Модель будет ложно предсказывать низкие продажи, а полученная в результате большая ошибка будет неправомерно наказываться во время обучения.
  • Учитывая наличие в наших данных некоторых больших, но редких ценовых колебаний, RMSE потенциально может привести к переобучению модели. Кроме того, нас больше интересует прогнозирование общей тенденции, а не краткосрочных движений временного ряда. Следовательно, мы решили включить среднюю абсолютную ошибку (MAE), см. рис. 4, в качестве дополнительной меры производительности, поскольку она более снисходительна к выбросам, чем RMSE.

Мы стремимся минимизировать RMSE, а также MAE.

Рекуррентные нейронные сети и долговременная кратковременная память

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

RNN — это тип архитектуры нейронной сети, который в основном используется для обнаружения закономерностей в последовательных данных, таких как язык, или, как в нашем случае, числовых временных рядов. Для обнаружения последовательных паттернов в данных информация проходит через сеть циклами, т. е. информация передается обратно в модель [3]. Это позволяет RNN учитывать предыдущие входные данные X(t-1) в дополнение к текущим входным данным X(t). На рис. 5 вы можете видеть, как информация h(t) с одного шага сети передается на следующий.

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

LSTM, особый тип RNN, были разработаны для обработки таких дальних зависимостей намного лучше, чем стандартные RNN [1][3]. Подобно RNN, LSTM имеют цепочечную структуру, но каждый повторяющийся блок, ячейка LSTM, имеет 3 дополнительных полносвязных слоя по сравнению со стандартным RNN (рис. 6). Эти дополнительные слои также называются слоями ворот из-за их различной активации (сигмовидной) по сравнению со стандартным слоем (tanh). Когда информация проходит через каждую ячейку LSTM, состояние ячейки C(t) можно обновлять, добавляя или удаляя информацию через слои ворот. Именно так модель LSTM решает, сохранять или удалять информацию из предыдущих временных шагов.

Для получения более подробной информации и точной структуры LSTM вы можете обратиться к [1].

Обучение и оценка модели

Наша конкретная модель прогнозирования состоит из двух слоев LSTM, за которыми следует один полностью связанный слой для прогнозирования цены следующего дня. Мы используем класс набора данных для создания временных рядов нашего набора функций с длиной последовательности 30 дней и класс загрузчика данных для их пакетной загрузки. Мы обучаем модель с использованием оптимизатора Adam и RMSE, а также MSE в качестве функций потерь (во время отдельных прогонов). Кроме того, мы реализуем раннюю остановку, чтобы задание обучения могло завершиться раньше, если нет значительных улучшений производительности.

Поскольку входные данные были масштабированы до уровней от 0 до 1, мы должны уменьшить (уменьшить масштаб) выходные данные модели до исходного масштаба, чтобы иметь возможность оценивать прогнозы по сравнению с фактическими уровнями цен. Основное внимание уделяется не настройке лучшей модели, поэтому мы тренируемся только с одним набором гиперпараметров и считаем его базовой моделью. После обучения модели в течение примерно 10–15 эпох и уменьшения масштаба ее выходных данных модель достигает RMSE около 10 000 и MAE около 6 500 на тестовом наборе данных.

Давайте посмотрим на прогнозы на тестовых данных (рис. 7). Вы можете видеть, что модель относительно хорошо прогнозирует общее развитие цен, что было нашей целью, для первого квартала тестового набора данных. Примерно в середине (300–450 дней) модель, кажется, постоянно завышает цену и не может предсказать экстремальный рост цены к концу (680 дней и позже), что объясняет большие ошибки, отмеченные выше.

Если мы проверим производительность модели только за первые 30 дней тестового набора данных, она значительно улучшится. И RMSE, и MAE падают примерно до 750, что означает, что прогноз модели не соответствует цене в среднем примерно на 750. На рисунке 7 мы можем видеть, как прогнозы модели ухудшаются по мере того, как проходит больше времени с момента обучения (день 0). При прогнозировании временных рядов важно часто переобучать модель, чтобы она могла учиться на основе последних наблюдений. Обучение модели на более свежих данных позволяет ей изучать и использовать последние закономерности и сигналы.

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

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

Важные особенности

Понимание того, почему модель делает предсказания, которые она делает, может быть затруднено в случае нейронных сетей. Мы используем подход, основанный на алгоритме DeepLIFT [4][5], который аппроксимирует значения SHAP, известные из классической теории игр. По сути, этот подход пытается ответить на вопрос о том, насколько функция способствует прогнозам модели, когда она есть (во входных данных), по сравнению с тем, когда ее нет (не во входных данных), таким образом определяя важность функции. В частности, этот метод разлагает выходной прогноз нейронной сети на конкретный вход путем обратного распространения вклада всех нейронов в сети на каждую функцию входа. Затем он сравнивает активацию каждого нейрона с его эталонной активацией и присваивает оценки вклада (или множители) в соответствии с разницей. Эталонный ввод представляет собой некоторый ввод по умолчанию или нейтральный ввод, который выбирается в зависимости от домена, например, нули или средние значения признаков. После того, как множители были вычислены на основе репрезентативного набора данных (или фонового набора данных), мы можем рассчитать вклад входных функций в выходные данные модели на основе некоторых выборочных входных данных и ранжировать функции в порядке их наибольшего вклада, чтобы получить их важность.

Мы используем 900 образцов обучающих данных в качестве фонового набора данных и 100 образцов тестовых данных, на которых объясняются выходные данные модели. Поскольку важность признаков рассчитывается для каждой входной выборки на каждом временном шаге, мы усредняем их по всем 100 входным выборкам и строим графики важности по признакам, а также по временным шагам (рис. 8). Тремя основными входными параметрами являются объем, цена закрытия и процентное изменение цены максимума-минимума в течение дня. Мы также можем видеть, что более поздние временные шаги, дни от -7 до -1, играют более важную роль в прогнозировании по сравнению с более отдаленными временными шагами, днями от -30 до -8, где день 0 — это время предсказания.

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

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

Заключение

В этом посте мы показали, как построить многомерную модель прогнозирования временных рядов на основе сетей LSTM, которая хорошо работает с нестационарными временными рядами со сложными шаблонами, т. Е. В областях, где не хватает традиционных подходов. После согласования цели прогнозирования с нашей «бизнес-целью» мы обучили и оценили модель с небольшой подготовкой данных. Кроме того, мы выяснили, какие функции (и какие временные шаги) определяют прогнозы модели с помощью метода, основанного на DeepLIFT. Это позволяет нам интерпретировать модель глубокого обучения и принимать на ее основе более эффективные решения.

Код Github, сопровождающий эту запись в блоге, можно найти здесь.

Использованная литература:

[1] Хохрайтер и Шмидхубер. «Долговременная кратковременная память». (1997)

[2] Бокс и Дженкинс. «Анализ временных рядов, прогнозирование и контроль». (1994)

[3] Шмидт. «Рекуррентные нейронные сети (RNN): нежное введение и обзор». (2019)

[4] Шрикумар, Гринсайд и Кундадже. «Изучение важных функций путем распространения различий в активации». (2017)

[5] Лундберг и Ли. «Единый подход к интерпретации модельных прогнозов». (2017)