Прогнозирование временных рядов с помощью Prophet от Facebook
Прогнозирование временных рядов — это весьма популярная аналитическая задача. Для прогнозирования временных рядов в Python используют такие подходы, как ARIMA, ARCH и т. д. Но подбор параметров для ARIMA — сложный и трудоемкий процесс. Однако
Будем прогнозировать колебания котировки валюты для пары 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 тех, кто пытался применить в реальных проектах.