Прогнозирование временных рядов с помощью Prophet от Facebook

Прогнозирование временных рядов — это весьма популярная аналитическая задача. Для прогнозирования временных рядов в Python используют такие подходы, как ARIMA, ARCH и т. д. Но подбор параметров для ARIMA — сложный и трудоемкий процесс. Однако 23-го февраля 2017 года команда Core Data Science из Facebook выпустила новую библиотеку для работы с временными рядами — Prophet. Попробуем применить новую библиотеку и посмотрим на удобство в использовании и качество предсказания.

Будем прогнозировать колебания котировки валюты для пары UAH/USD. Prophet предоставляет API для Python и R, я использую Python. Установку необходимых библиотек произведем с помощью пакетного менеджера Сonda. Для анализа будем использовать данные за период 01.02.2012 / 05.09.2017.

Целевой переменной возьмем цену закрытия (Adj Close). Посмотрим, как выглядят исходные данные:

Подготовка исходных данных

На графике есть ряд «пиков», которые не относятся к сезонным колебаниям. В контексте текущей задачи — это выбросы. В соответствии с документацией, лучшее решение — удалить выбросы. Библиотека автоматически обработает пропущенные значения.

Праздники

Prophet позволяет указать отдельно даты, на которые выпадают праздники. Модель учтет это в предсказании. Также можно регулировать степень влияния праздников — holidays_prior_scale, что очень удобно, если модель переобучилась.

Построение прогноза

Интерфейс библиотеки полностью соответствует популярной библиотеке машинного обучения scikit-learn: создаем модель, обучаем ее с помощью метода .fit(), строим предсказание .predict(). Для обучения нужно передать DataFrame с колонками:

  • ds — время, формат поля должен быть datetime;
  • y — целевая переменная в числовом формате.

Для получения прогноза нужно передать новый DataFrame, содержащий столбец ds. Для этого в библиотеке есть функция make_future_dataframe, которая принимает параметр periods — период, для которого мы хотим получить прогноз и freq — частота временного ряда (значение по умолчанию — день).

Оценка качества модели

Для оценки качества предсказаний отделим период в последние 60 дней. Построим модель, обучим и сделаем прогноз:

m = Prophet(changepoint_prior_scale=0.1, holidays=holidays, holidays_prior_scale=18)
m.fit(train_df);
 
future = m.make_future_dataframe(periods=60)
forecast_test = m.predict(future)

Оценивать будем среднеквадратичную и среднюю абсолютную ошибки:

Mean squared error: 1.0407109491747677
Mean absolute error: 0.9977340371358951

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

m = Prophet(changepoint_prior_scale=0.1, holidays=holidays, holidays_prior_scale=18)
m.fit(predict_df);
 
future = m.make_future_dataframe(periods=120)
forecast = m.predict(future)

Прогноз

В виде прогноза Prophet вернет DataFrame с большим количеством столбцов. Наиболее интересные:

  • ds — временная метка для прогнозируемого значения;
  • yhat— прогнозируемое значение;
  • yhat_lower — нижняя граница прогноза;
  • yhat_upper — высшая граница прогноза.

Визуализация

Библиотека из коробки предоставляет удобные методы визуализации. Первый метод Prophet.plot отображает график прогноза:

Модель неплохо аппроксимирует исторические данные.

Второй метод Prophet.plot_components позволяет визуализировать отдельные компоненты: тренд, праздники, годовую и недельную сезонность:

Наиболее интересным оказался график годовой сезонности. Максимальные пики попадают на февраль и март — наиболее «депрессивные» месяцы. Следующий пик аж в сентябре — школьники и студенты возвращаются с каникул. Следующий пик в начале октября — начало отопительного сезона.

Посмотрим на прогноз более подробно:

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

Выводы

  • Библиотека Prophet — удобный инструмент для прогнозирования временных рядов. Модель работает достаточно хорошо из коробки, при этом есть набор гиперпараметров, которые позволяют улучшить прогноз.
  • Отдельно стоит отметить встроенные возможности визуализации.
  • Из минусов — проект молодой, возможны какие-то неточности в работе. Неполная документация.
  • Задача прогнозировать колебания валюты — сложная. Особенно для украинской валюты в данный период времени.
  • Prophet хорошо аппроксимирует обучающую выборку. Стоит отметить и разумно выделенную годовую сезонность.
  • Полученные предсказания можно использовать как новый признак для других алгоритмов машинного обучения.

Ссылка на полный код — github.com/...​luctuation_currency_quote.

Пишите возможные идеи улучшения прогноза. Было бы интересно послушать отзывы о Prophet тех, кто пытался применить в реальных проектах.

Похожие статьи:
Climbing Kilimanjaro is no easy task. It’s daunting but definitely worth it should you reach the summit. Before you can achieve this feat however, here are some things to lookout for before climbing the great Mt. Kilimanjaro. 10. Route and...
Не можете определиться с направлением в IT, где сможете максимально раскрыть свой потенциал? Ощущаете нехватку базовых знаний...
DOU розпочинає серію коротких Zoom-інтерв’ю з керівниками українських IT-компаній, аби дізнатися, як сьогодні почувається...
Сеть интернет-телефонии SIPNET объявила о начале публичного тестирования технологии WebRTC (Web Real Time Communication).Это стало...
Мене звати Андрій і вже чотири роки я займаюсь перформанс-тестуванням та оптимізацією. Кар’єру починав...
Яндекс.Метрика