Мы стали свидетелями множества прорывов в области обработки естественного языка и компьютерного зрения в области искусственного интеллекта. И мы видели, как они применяются во многих приложениях для решения проблем, связанных с языком и изображениями. Прогнозирование - это общая проблема, имеющая решающее значение для компаний по всему миру. Это может варьироваться от прогнозирования продаж до прогнозирования посещаемости. Возможность оценить, сколько людей посетит парк или сколько банок содовой будет продано, может иметь жизненно важное значение в бизнесе; регулировать количество сотрудников, необходимых в парке для обслуживания X посетителей в день или количество товаров, которые необходимо заказать для производства X банок содовой в месяц.

Прогнозирование может быть ежечасным, ежедневным, еженедельным, ежемесячным или ежегодным, в зависимости от того, как работает бизнес.

Прогнозирование - это обширная область, и это сложно, потому что существует множество вариаций в траекториях продаж разных товаров или посещаемости в разных местах, и сложнее использовать одни и те же параметры для решения другой проблемы. И это усложняет использование ARIMA или LSTM для прогнозирования. Несмотря на то, что для автоматического выбора параметров существует AUTOARIMA, ARIMA плохо работает с неструктурированными данными временных рядов.

В таких случаях FbProphet - ваш спаситель; легко, быстро и дает хорошую производительность. Если вы знаете, как работает FbProphet, вы можете использовать его для соответствия данным временного ряда. Итак, из чего состоит FbProphet:

  • Тенденции
  • Сезонность
  • Регрессоры

Давайте попробуем разобраться в каждом из них немного лучше. Тренд - это общая траектория, по которой следуют данные, или, другими словами, общее направление, в котором что-то развивается или изменяется. Вот пример тенденции появления Пейтона Мэннинга в плей-офф на протяжении многих лет:

Сезонность - это повторяющаяся закономерность, которую усваивает модель. Может быть недельная сезонность; шаблон, который обычно повторяется каждую неделю. Или месячный паттерн, который обычно повторяется в течение года. Годовая и недельная сезонность встроена в FbProphet. Но вы также можете добавить настраиваемую сезонность, например, шаблон, который повторяется только в субботу и воскресенье. В этом случае в столбце сезонности будет указано «Верно» для дат субботы и воскресенья и «Неверно» для остальных дней.

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

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

Вы также можете добавить к прогнозу эффект праздников. Это можно сделать двумя способами.

  • Вы можете указать страну, и FbProphet добавит праздники для этой страны.
  • Если у вас есть другие повторяющиеся события, которые вы хотите смоделировать, вы можете создать для них фрейм данных и передать их модели в качестве праздников, ожидая, что модель изучит и повлияет на прогноз.

Модель будет изучать и моделировать влияние этих праздников на прогноз, как показано ниже:

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

Вы можете настроить гибкость тренда с помощью changepoint_prior_scale. По умолчанию это 0,05. Вы можете увеличить его, чтобы сделать модель более гибкой для изменений (переоснащение), или уменьшить, чтобы сделать ее менее гибкой (недостаточная подгонка). Проще говоря, этот параметр можно использовать для корректировки поведения вашей модели между переобучением и недостаточным подбором.

КОД

Давайте теперь немного погрузимся в код с набором данных о шагах для места отдыха в Великобритании:

import pandas as pd
from fbprophet import Prophet
df = pd.read_csv('./data/footfall.csv')

Мы переименуем столбцы в «ds» и «y» в соответствии с требованиями FbProphet. Мы будем использовать встроенные еженедельные и годовые сезонности, а также добавим настраиваемую месячную сезонность. Период будет 30,5 (в среднем 30 и 31), и мы будем использовать порядок Фурье 5. Мы также добавим загородные праздники.

m = Prophet(weekly_seasonality=True,yearly_seasonality=True)
m.add_seasonality(name='monthly', period=30.5, fourier_order=5)
m.add_country_holidays(country_name='UK')
m.fit(df[['ds', 'y']])

FbProphet будет возвращать прогнозы в виде yhat с верхним и нижним уровнями неопределенности (yhat_upper & yhat_lower).

#predicting for the next 100 days from 2019-04 to 2019-08
future = m.make_future_dataframe(periods=100, include_history=True)
forecast = m.predict(future)

Когда мы сохраняем include_history в качестве True в прогнозировании, модель также подбирается по выборке (также дает прогнозы для обучающего набора данных) . Вы можете использовать это, чтобы лучше оценить, насколько хорошо модель соответствует прошлым и будущим данным.

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

fig1 = m.plot(forecast)

fig2 = m.plot_components(forecast)

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

Для обучения модели FbProphet доступно множество вариантов, от регрессоров до changepoint_prior_scale. Более подробную информацию можно найти здесь".

Ресурсы: