Prophet — это простая в использовании библиотека для прогнозирования данных временных рядов.

Обзор:

Prophet — это библиотека Python, разработанная Facebook для упрощения прогнозирования одномерных данных временных рядов. Он был создан для внутреннего использования в компании для прогнозирования продаж, вычислений и т. д., а затем стал открытым исходным кодом.

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

Изучение набора данных:

В этой статье мы проанализируем набор данных Air Passengers и спрогнозируем будущие данные с помощью пророка. Сначала загрузите набор данных здесь. Набор данных содержит ежемесячные данные о пассажирах самолетов в США с 1949 по 1960 год.

Установите необходимые пакеты и загрузите CSV-файл с вашего пути.

from pandas import read_csv
from matplotlib import pyplot
path = '/content/drive/My Drive/Facebook Prop/AirPassengers.csv'
df = read_csv(path)
df.head()

Выполните следующую функцию, чтобы получить сведения о CSV-файле. Мы видим, что в нем 144 строки и два столбца — Месяц и #Пассажиры.

df.info()

Давайте построим данные, чтобы понять это.

df.plot()
pyplot.show()

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

Подгонка модели:

Наша модель будет определена как экземпляр Prophet() и будет соответствовать набору данных с помощьюфункцииfit().

Prophet() принимает аргументы для учета типа роста, типа сезонности и т. д., но даже если аргументы не заданы, в основном все вычисляется автоматически.

Функция fit() принимает кадр данных как объект, но в определенном формате. Первый столбец должен называться «ds» и содержать дату и время. Второй столбец должен называться «y» и содержать значения.

Поэтому мы соответствующим образом переименовываем столбцы и преобразуем значения первого столбца в объекты даты и времени.

from pandas import to_datetime
df.columns = ['ds', 'y']
df['ds']= to_datetime(df['ds'])

Подгонка нашей модели к набору данных:

from fbprophet import Prophet
model = Prophet()
model.fit(df)

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

model.plot_components(model.predict(df))

Приведенные выше цифры показывают, что количество перевезенных пассажиров в целом увеличивается и достигает своего пика примерно в июле каждого года.

Прогноз по данным в выборке:

Прогноз в выборке дает хорошее представление о том, как модель работала на обучающих данных. Это достигается путем подгонки функции predict() к нашим данным за последние 12 месяцев (используя срезы фрейма данных).

forecast = model.predict(df[132:])
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head())

Теперь мы построим наш прогноз вместе с данными обучения, чтобы увидеть, близки ли наши прогнозы к фактическим значениям.

model.plot(forecast)
pyplot.show()

На приведенном выше графике черные точки относятся к данным обучения, а синяя линия — к нашему прогнозу за последние 12 месяцев. Синяя заштрихованная область — верхняя и нижняя границы. Можно сделать вывод, что наши прогнозы за последние 12 месяцев близки к фактическим значениям в наборе данных.

Прогноз по данным вне выборки:

В этом разделе мы спрогнозируем авиаперевозки на следующие пять лет.

future = model.make_future_dataframe(periods=12 * 5, freq='M')
forecast = model.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper', 'trend', 'trend_lower', 'trend_upper']].tail()

Рисуем то же самое:

model.plot(forecast)
pyplot.show()

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

Средняя абсолютная ошибка:

Мы оцениваем нашу модель вручную, вычисляя среднюю абсолютную ошибку (MAE). Это можно сделать, удерживая данные за последние несколько месяцев во время обучения и прогнозируя на ту же продолжительность, используя нашу модель. Поскольку значения за последние 12 месяцев нам уже известны, мы можем рассчитать ошибку между прогнозами и фактическими значениями.

model = Prophet()
model.fit(df[:132]) #excluding last 12 rows
forecast = model.predict(df[132:])
y_true = df['y'][132:].values
y_pred = forecast['yhat'].values

from sklearn.metrics import mean_absolute_error
mae = mean_absolute_error(y_true, y_pred)
print('MAE: %.2f' % mae)
pyplot.plot(y_true, label='Actual')
pyplot.plot(y_pred, label='Predicted')
pyplot.legend()
pyplot.show()

Очевидно, что наша модель достаточно хороша, чтобы уловить тенденцию в наборе данных. МАЭ также находится в допустимых пределах.

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

Блокнот Colab можно найти здесь.