Machine Learning, Классификация

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

Время прочтения: 3 мин.

Prophet — это библиотека с открытым исходным кодом от компании Facebook. Она предназначена для прогнозирования временных рядов. По словам разработчиков (команды Core Data Science team) данный инструмент хорошо работает с рядами, которые имеют ярко выраженные сезонные эффекты, а также имеют несколько таких периодов. Prophet устойчив к отсутствию данных и достаточно хорошо справляется с выбросами. Библиотека во многом наследует «стиль» sklearn со своими fit и predict. Для примера рассмотрим стандартный для таких задач датасет с продажей австралийского вина с 1980 г. по 1995 г. Для начала установим библиотеку:

pip install fbprophet

Импортируем нужные библиотеки:

import pandas as pd
import fbprophet
import matplotlib.pyplot as plt

Загружаем датасет (данные с периодом в один месяц) и посмотрим информацию о нем, так как данные обычно загружаются в формате строки:

df = pd.read_csv('monthly-australian-wine-sales.csv')
df.info()

Установим формат даты:

df['month'] = pd.to_datetime(df['month'])

Отрисуем данные:

plt.plot(df['month'], df['sales']);

Важно отметить, что библиотека от нас ожидает два столбца с названиями ds (даты) и y (целевые значения), в противном случае может получиться ошибка, поэтому переименуем:

df.rename(columns = {'month':'ds', 'sales':'y'}, inplace = True)

Создаем модель, в наших данных есть явная годовая сезонность и нет дневной, так как данные предоставлены за каждый месяц, обучаем:

model = fbprophet.Prophet(yearly_seasonality = True,     daily_seasonality = False, seasonality_mode = 'multiplicative')
model.fit(df);

Для предсказания возьмем 12 периодов (месяцев):

future = model.make_future_dataframe(periods = 12, freq = 'm')
forecast = model.predict(future);

Также можем посмотреть на трендовую и годовую компоненты в отдельности:

model.plot_components(forecast);

Посмотрим на полученный результат:

model.plot(forecast);

 График достаточно точно описывает тенденцию продаж. Объединим весь код выше в один и построим предсказание на 3 и 5 лет вперед соответственно:

for period in [36, 60]:
    m = fbprophet.Prophet(yearly_seasonality = True, 
daily_seasonality = False, 
seasonality_mode = 'multiplicative')
    m.fit(df)
    future = m.make_future_dataframe(periods = period, freq = 'm')
    forecast = m.predict(future)
    m.plot(forecast);

Для своеобразного решения «из коробки» вполне приличные результаты. Данная библиотеке имеет возможность строить интерактивные графики с помощью plotly для более подробного анализа временного ряда (особенно полезно для анализа больших временных рядов). У графиков можно менять масштаб, сохранять отдельные участки графика, при наведении на точку можем видеть дополнительную информацию.

from fbprophet.plot import plot_plotly
plot_plotly(m, forecast)

В конце стоит отметить, что для рядов с явной годовой сезонностью библиотека показывает хорошие результаты, а в связке с plotly представляет отличный инструмент для анализа временных рядов.

Советуем почитать