Анализ временных рядов с использованием Facebook Prophet
Prophet - это инструмент с открытым исходным кодом от Facebook, используемый для прогнозирования данных временных рядов, который помогает предприятиям понять и, возможно, предсказать рынок. Он основан на разложимой аддитивной модели, в которой нелинейные тренды соответствуют сезонности, а также учитывает влияние праздников. Прежде чем мы перейдем непосредственно к кодированию, давайте изучим определенные термины, которые необходимы для понимания этого.
Тенденция:
Тенденция показывает тенденцию к увеличению или уменьшению данных в течение длительного периода времени и отфильтровывает сезонные колебания.
Сезонность:
Сезонность - это колебания, которые происходят в течение короткого периода времени и недостаточно заметны, чтобы их можно было назвать «трендом».
Понимание модели Пророка
Общая идея модели аналогична обобщенной аддитивной модели. «Уравнение пророка» подходит, как упоминалось выше, для тренда, сезонности и праздников. Это дается
где,
- 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, загруженный ранее, и отобразите его.
data = pd.read_csv( ' https://raw.githubusercontent.com/rahulhegde99/Time-Series-Analysis-and-Forecasting-of-Air-Passengers/master/airpassengers.csv ' ) data.head() |
Выход:
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. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.