Прогнозирование временных рядов с помощью 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 тех, кто пытался применить в реальных проектах.

Похожие статьи:
Керівник Мінцифри Михайло Федоров написав у своєму Telegram-каналі, що шукає експерта-практика з AI, який уміє швидко й ефективно...
Есть проекты, которые ни шатко ни валко реализуются годами, а есть такие, которые заставляют биться лбом о технологии...
Денис Гайдамака — досвідчений світчер. Раніше він працював у нафтогазовій сфері, був діджеєм і організовував...
Компания Apple все еще крупнейший в мире производитель планшетов, но теперь это сокращающийся рынок. Причем,...
Оператор мобильной связи МТС объявил о снижении стоимости мобильного интернета, звонков и SMS в...
Яндекс.Метрика