Анализ временных рядов с использованием Facebook Prophet

Опубликовано: 30 Ноября, 2021

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

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

Сезонность:
Сезонность - это колебания, которые происходят в течение короткого периода времени и недостаточно заметны, чтобы их можно было назвать «трендом».

Понимание модели Пророка
Общая идея модели аналогична обобщенной аддитивной модели. «Уравнение пророка» подходит, как упоминалось выше, для тренда, сезонности и праздников. Это дается

y (t) = g (t) + s (t) + h (t) + e (t)

где,

  • g (t) относится к тренду (изменения в течение длительного периода времени)
  • s (t) относится к сезонности (периодические или краткосрочные изменения)
  • h (t) относится к влиянию праздников на прогноз
  • e (t) относится к безусловным изменениям, характерным для бизнеса, лица или обстоятельств. Его также называют термином ошибки.
  • y (t) - прогноз.

Это кажется достаточно простым, так зачем нам нужен такой инструмент, как Prophet, чтобы делать прогнозы?
Нам это нужно, потому что, хотя базовая разложимая аддитивная модель выглядит простой, вычисление членов в ней является в высшей степени математическим и, если вы не знаете, что делаете, может привести к ошибочным прогнозам, которые могут иметь серьезные последствия в реальном мире. . Итак, чтобы автоматизировать этот процесс, мы будем использовать Prophet.

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

Модель логистического роста соответствует следующему статистическому уравнению:

(1)

где,

  • C - грузоподъемность
  • k - скорость роста
  • m - параметр смещения

Кусочно-линейная модель аппроксимируется с использованием следующих статистических уравнений:

(2)

где c - точка смены тренда (определяет изменение тренда). ? является параметром тренда и может быть настроен в соответствии с требованиями для прогнозирования.

Загрузите набор данных:
Теперь давайте воспользуемся этими знаниями на реальном примере. Учитывайте набор данных авиапассажиров (перейдите по ссылке ниже и сохраните файл .csv)
https://raw.githubusercontent.com/rahulhegde99/Time-Series-Analysis-and-Forecasting-of-Air-Passengers/master/airpassengers.csv

Приведенный выше набор данных содержит количество авиапассажиров в США с января 1949 года по декабрь 1960 года. Периодичность данных - 1 месяц. Теперь давайте попробуем построить модель, которая будет прогнозировать количество пассажиров на следующие пять лет, используя анализ временных рядов.

Установки

Установите Pandas для обработки данных и для структуры данных фрейма данных.

 pip install pandas

Установите Prophet для анализа и прогнозирования временных рядов.

 pip install fbprophet

Примечание. Если вы не хотите устанавливать модули локально, используйте Jupyter Notebooks или Google Colab.
Выполнение:
Код: Импортируйте все необходимые модули

import pandas as pd
from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot

Код: прочтите файл .csv, загруженный ранее, и отобразите его.

Выход:

Facebook Prophet предсказывает данные только в том случае, если они представлены в определенном формате. Фрейм данных с данными должен иметь столбец, сохраненный как ds для данных временного ряда и y для данных, которые нужно спрогнозировать. Здесь временной ряд - это столбец Месяц, а данные для прогноза - это столбец # Пассажиры . Итак, давайте создадим новый фрейм данных с новыми именами столбцов и теми же данными. Кроме того, ds должен быть в формате datetime.

Код:

df = pd.DataFrame()
df[ 'ds' ] = pd.to_datetime(data[ 'Month' ])
df[ 'y' ] = data[ '#Passengers' ]
df.head()

Код: инициализировать модель и подогнать под нее наш фрейм данных df.

m = Prophet()
m.fit(df)

Мы хотим, чтобы наша модель предсказывала следующие 5 лет, то есть до 1965 года. Частота наших данных составляет 1 месяц, и, таким образом, для 5 лет это 12 * 5 = 60 месяцев. Поэтому нам нужно добавить 60 или больше строк ежемесячных данных в фрейм данных.
Код:

future = m.make_future_dataframe(periods = 12 * 5 , freq = 'M' )

Теперь в будущем фрейме данных у нас есть только значения ds, и мы должны предсказать значения y.
Код:

forecast = m.predict(future)
forecast[[ 'ds' , 'yhat' , 'yhat_lower' , 'yhat_upper' , 'trend' , 'trend_lower' , 'trend_upper' ]].tail()



В таблице ds , как известно, находятся данные временного ряда. yhat - прогноз, yhat_lower и yhat_upper - уровни неопределенности (в основном это означает, что прогноз и фактические значения могут варьироваться в пределах уровней неопределенности). Далее у нас есть тренд, который показывает долгосрочный рост, сокращение или застой данных, trend_lower и trend_upper - уровни неопределенности.

Код: Постройте прогнозируемые данные.

fig1 = m.plot(forecast)

На изображении ниже показан основной прогноз. Голубым цветом обозначен уровень неопределенности (yhat_upper и yhat_lower ), синим цветом - прогноз ( yhat ), а черными точками - исходные данные. Мы видим, что предсказанные данные очень близки к фактическим данным. За последние пять лет «фактических» данных нет, но, глядя на эффективность нашей модели в те годы, когда данные доступны, можно с уверенностью сказать, что прогнозы близки к точным.

fig2 = m.plot_components(forecast)

На изображениях ниже показаны тенденции и сезонность (за год) данных временных рядов. Мы видим, что есть тенденция к увеличению, а это означает, что количество авиапассажиров со временем увеличивалось. Если мы посмотрим на график сезонности, мы увидим, что июнь и июль - это время с наибольшим количеством пассажиров в данном году.

fig = m.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), m, forecast)

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


Сноски:
Таким образом, мы увидели, как с помощью Facebook Prophet можно разработать модель прогнозирования, используя всего несколько строк кода, что было бы очень сложно реализовать, используя только традиционные алгоритмы машинного обучения и математические и статистические концепции.

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.