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

Похожие статьи:
24 серпня ELEKS, постачальник послуг з розробки програмного забезпечення та консалтингу, відкрив свій офіс у Хорватії в місті Спліт....
Старт курса в Киеве: — 4 декабряНабор в группу в Одессе уже начался!!! Приглашаем вас пройти подготовительный курс к сдаче...
Компания Samsung официально представила новейший восьмиядерный процессор Exynos 8 Octa 8890, который до этого был известен только по...
Web-дизайнеры проектируют логическую структуру веб-сайтов, приложений и программного обеспечения, продумывают наиболее...
Oftentimes consumers seek out more affordable rates for their car insurance, home insurance, life insurance, and more. Here are some common questions, “Where is the best place to find better insurance rates? Should you...
Яндекс.Метрика