Статья подготовлена для студентов курса «Machine learning» в образовательном проекте OTUS.
В июне 2019 года компания Amazon выложила в открытый доступ замечательный инструмент — GluonTS, позволяющий максимально быстро и эффективно строить, оценивать и использовать модели временных рядов, основанные на глубоком обучении и вероятностном подходе.
До этого момента одним из самых известных релизов открытой библиотеки для работы с временными рядами был Facebook Prophet, выпущенный в феврале 2017 года. В отличие от GluonTS, Facebook использовал более простой метод — аддитивную нелинейную модель временного ряда. Эта модель давала вполне адекватные результаты при минимуме затраченных усилий, однако не очень хорошо справлялась с данными, где отсутствовала ярко выраженная сезонность.
Что внутри GluonTS?
Amazon пошёл дальше и использовал рекуррентные нейронные сети (в частности, LSTM), а также свёртки и механизмы внимания, обернув всё это в крайне удобную верхнеуровневую библиотеку. В частности, GluonTS содержит:
— инструменты, необходимые для построения и обучения наиболее распространённых архитектур нейронных сетей, а также компоненты для моделирования и трансформации вероятностных распределений;
— механизмы для загрузки и предварительной обработки данных, в том числе автоматической генерации признаков из временных рядов;
— несколько готовых к использованию state-of-the-art прогнозных моделей;
— инструменты для оценки и сравнения различных моделей.
Если не вдаваться в подробности, GluonTS позволяет быстро и практически из коробки получить качественную модель временного ряда, на выходе из которой вместо точечной оценки прогнозных значений мы получаем целое смоделированное вероятностное распределение. Таким образом, мы можем с лёгкостью оперировать доверительными интервалами прогноза и с любой удобной нам вероятностью получать диапазон наиболее вероятных будущих значений ряда.
Пример на реальных данных
В оригинальной статье авторы использовали временной ряд с ценами акций компании Amazon. Ярко выраженных паттернов, за исключением восходящих/нисходящих трендов в финансовых временных рядах обычно не бывает, поэтому прогнозы в статье выглядят больше как некоторый шум, колеблющийся вокруг спрогнозированной линии тренда.
Для нашего примера возьмём чуть более богатый на события временной ряд — исторические траты внутриигровой валюты, взятые из одной мобильной игры.
Во временном ряду хорошо видна 30-дневная цикличность, связанная с определёнными внунтриигровыми событиями, а также ярко выраженная недельная сезонность — по выходным игроки больше тратят валюту, а по будням активность спадает.
Попробуем построить модель. GluonTS предоставляет верхнеуровневую абстрацию Dataset, которая переводит разнородные форматы данных в один, удобный для последующей работы моделей. В частности, ListDataset переводит данные в список словарей, где отдельно записаны значения ряда и таймстэмпы. Для создания такого датасета мы передаём наш исходный временной ряд, указываем его частоту (в данном случае у нас дневные данные, поэтому частота "D"), а также точку, до которой наш ряд будет отнесён к тренировочной выборке:
Посмотрим, в какой формат преобразовались данные:
Имея такой датасет, можно переходить к построению модели. Внутри библиотеки есть огромное количество всевозможных гиперпараметров, начиная от самой архитектуры модели, и заканчивая настройкой первичной подготовки признаков для моделирования.
В этой статье подробно разбирать настройку мы не будем, а вместо этого посмотрим, что может получиться, если воспользоваться решением из коробки.
В качестве модели возьмём рекомендованную архитектуру, основанную на глубокой авторегрессионной модели (DeepAR). Как и при создании датасета, нужно не забыть указать частоту данных, на которой предстоит тренироваться. Также зададим число эпох, равное 20, а горизонт прогноза (т. е. на сколько шагов вперед модель должна уметь прогнозировать) — равным 30 дням.
После непродолжительной тренировки модель готова и можно смотреть на прогноз. Снова создадим ListDataset, на сей раз для отложенной выборки, и воспользуемся удобной утилитой to_pandas, чтобы перевести результаты прогноза в удобный для визуализации формат:
В результате мы получили очень правдоподобный прогноз, который учитывает и недельную сезонность и 30-дневную цикличность. Хорошо видно, что доверительные интервалы прогноза расширяются в момент пика, где исторические значения были наименее стабильными, и сужаются в обычные дни, где дисперсия исторических данных была не такой большой.
Вывод
GluonTS — очень удобный инструмент, который позволяет максимально быстро и на верхнем уровне получить вероятностную модель временного ряда, используя глубокое обучение «под капотом». Помимо хороших результатов, которые получаются прямо из коробки, GluonTS можно тонко настраивать под любые нужды.
Подробнее о настройке гиперпараметров и сравнении качества GluonTS с другими методами прогнозирования временных рядов вы сможете узнать на занятии «Анализ временных рядов» курса «Machine Learning».