Все, что вам нужно знать, чтобы построить свою первую модель с помощью расширенного инструмента прогнозирования Facebook

Этот пост содержит отрывок из моей новой книги о Facebook Prophet. Книгу можно купить на Амазонке. Полное содержание книги указано в конце этого поста!

Если вы найдете эту статью полезной и хотите использовать Prophet для улучшения своих прогнозов, рассмотрите возможность покупки полной книги по адресу https://amzn.to/373oIcf.

Построение простой модели в Prophet

Самая продолжительная запись прямых измерений CO₂ в атмосфере была начата в марте 1958 года Чарльзом Дэвидом Килингом из Института океанографии Скриппса. Килинг базировался в Ла-Хойе, Калифорния, но получил разрешение от Национального управления океанических и атмосферных исследований (NOAA) на использование своего объекта, расположенного в двух милях над уровнем моря на северном склоне вулкана Мауна-Лоа. на острове Гавайи для сбора проб углекислого газа. На этой высоте измерения Килинга не будут зависеть от местных выбросов CO₂, например, от близлежащих заводов.

В 1961 году Килинг опубликовал собранные им данные, установив, что существуют сильные сезонные колебания уровней CO₂ и что они неуклонно повышаются - тенденция, которая позже стала известна как кривая Килинга. К маю 1974 года NOAA начала свои собственные параллельные измерения и с тех пор продолжаются. График кривой килинга выглядит следующим образом:

Учитывая сезонность и тенденцию к увеличению, эта кривая является хорошим кандидатом для тестирования Prophet. Этот набор данных содержит более 19 000 ежедневных наблюдений за 53 года. Единица измерения CO₂ - PPM, или частей на миллион, то есть количество молекул CO₂ на миллион молекул воздуха.

Чтобы начать нашу модель, нам нужно импортировать необходимые библиотеки, pandas и Matplotlib, а также импортировать класс Prophet из пакета fbprophet.

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

В качестве входных данных Prophet всегда требует фрейм данных pandas с двумя столбцами:

  • ds для отметки даты должен быть столбцом отметка даты или отметка времени в формате, ожидаемом пандами.
  • y - числовой столбец, содержащий показатель, который мы хотим спрогнозировать.

Здесь мы используем pandas для импорта данных, в данном случае файл csv [Примечание: этот csv-файл можно загрузить по адресу https://git.io/JYG6T], а затем загрузить его в DataFrame. Обратите внимание, что мы также преобразуем столбец ds в формат даты и времени pandas, чтобы гарантировать, что Pandas правильно определяет его как даты, а не просто загружает его как буквенно-цифровую строку.

df = pd.read_csv(‘co2-ppm-daily_csv.csv’)
df[‘date’] = pd.to_datetime(df[‘date’])
df.columns = [‘ds’, ‘y’]

Если вы знакомы с пакетом scikit-learn (sklearn), вы почувствуете себя как дома в Prophet, потому что он был разработан для работы аналогичным образом. Prophet следует парадигме sklearn: сначала создается экземпляр класса модели, а затем вызываются методы fit и Forecast.

model = Prophet()
model.fit(df)

В этой единственной команде fit Prophet проанализировал данные и выделил сезонность и тенденцию, не требуя от нас указания каких-либо дополнительных параметров. Однако он еще не сделал никаких прогнозов на будущее. Для этого нам нужно сначала создать DataFrame будущих дат, а затем вызвать метод прогноз. Метод make_future_dataframe требует от нас указать количество дней, в течение которых мы собираемся сделать прогноз. В этом случае мы выберем десять лет или 365 дней, умноженных на 10.

future = model.make_future_dataframe(periods=365 * 10)
forecast = model.predict(future)

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

Мы помечаем оси необязательными аргументами xlabel и ylabel, но просто придерживаемся значения по умолчанию для необязательного аргумента figsize. Обратите внимание, что я также добавляю заголовок, используя необработанный синтаксис Matplotlib; поскольку сюжет Prophet построен на Matplotlib, все, что вы можете сделать с фигурой Matplotlib, также может быть выполнено здесь. Кроме того, пусть вас не смущает странный текст ylabel со знаками доллара; это просто указывает Matplotlib использовать свой собственный TeX-подобный движок для создания индекса в CO₂.

fig = model.plot(forecast, xlabel=’Date’, ylabel=r’CO$_2$ PPM’)
plt.title(‘Daily Carbon Dioxide Levels Measured at Mauna Loa’)
plt.show()

График выглядит следующим образом:

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

Интерпретация прогноза DataFrame

Теперь давайте посмотрим на этот прогноз DataFrame, отобразив первые три строки (я переставил его здесь, чтобы лучше видеть имена столбцов на странице), и узнаем, как эти значения использовались. в приведенной выше таблице:

forecast.head(3).T

После выполнения этой команды вы должны увидеть распечатанную следующую таблицу:

Ниже приводится описание каждого столбца в фрейме данных прогноз:

  • ‘ds’ - отметка даты или времени, к которым относятся значения в этой строке.
  • «тренд» - значение только компонента тренда.
  • ‘yhat_lower’ - нижняя граница интервала неопределенности вокруг окончательного прогноза.
  • ‘yhat_upper’ - верхняя граница интервала неопределенности вокруг окончательного прогноза.
  • «trend_lower» - нижняя граница интервала неопределенности вокруг компонента тренда.
  • «trend_upper» - верхняя граница интервала неопределенности вокруг компонента тренда.
  • «add_terms» - совокупное значение всех аддитивных сезонностей.
  • «add_terms_lower» - нижняя граница интервала неопределенности вокруг аддитивных сезонностей.
  • «add_terms_upper» - верхняя граница интервала неопределенности вокруг аддитивных сезонностей.
  • еженедельно - значение еженедельной составляющей сезонности.
  • «weekly_lower» - нижняя граница интервала неопределенности около недельной составляющей.
  • «weekly_upper» - верхняя граница интервала неопределенности около недельной составляющей.
  • «годовой» - значение годовой составляющей сезонности.
  • «Annual_lower» - нижняя граница интервала неопределенности вокруг годовой составляющей.
  • «Annual_upper» - верхняя граница интервала неопределенности вокруг годовой составляющей.
  • ‘multiplicative_terms’ - совокупное значение всех мультипликативных сезонностей.
  • ‘multiplicative_terms_lower’ - нижняя граница интервала неопределенности вокруг мультипликативных сезонностей.
  • ‘multiplicative_terms_upper’ - верхняя граница интервала неопределенности вокруг мультипликативных сезонностей.
  • ‘yhat’ - окончательное прогнозируемое значение; сочетание «тенденции», «мультипликативных_термов» и «дополнительных_термов»

Если данные содержат ежедневную сезонность, то также будут включены столбцы для daily », « daily_upper » и « daily_lower », шаблон, установленный для столбцов "еженедельно" и "ежегодно". Последующие главы будут включать обсуждение и примеры как аддитивных / мультипликативных сезонностей, так и интервалов неопределенности.

На графике прогноза выше черные точки представляют собой фактические записанные значения y, которым мы подходим (те, которые указаны в столбце df ['y']), тогда как сплошная линия представляет рассчитанные значения yhat (столбец прогноз ['yhat']). Обратите внимание, что сплошная линия выходит за пределы диапазона черных точек, который мы прогнозировали в будущем. Более светлая заливка вокруг сплошной линии в прогнозируемой области представляет интервал неопределенности, связанный с прогнозом [‘yhat_lower’] и прогнозом [‘yhat_upper’].

Теперь давайте разберем этот прогноз на составляющие.

Понимание графиков компонентов

В главе 1, История и развитие прогнозирования временных рядов, Prophet был представлен как аддитивная регрессионная модель. Рисунки 1.4 и 1.5 показывают, как отдельные кривые составляющих тренда и различных сезонностей складываются вместе, чтобы создать более сложную кривую. Алгоритм Prophet, по сути, делает это наоборот; он берет сложную кривую и разлагает ее на составные части. Первым шагом к большему контролю над прогнозом Пророка является понимание этих компонентов, чтобы ими можно было управлять индивидуально. Prophet предоставляет метод plot_components для их визуализации.

Продолжая наш прогресс в модели Мауна-Лоа, построить график компонентов так же просто, как выполнить следующие команды:

fig2 = model.plot_components(forecast)
plt.show()

Как вы можете видеть на выходном графике, Prophet выделил в этом наборе данных три компонента: тренд, еженедельную сезонность и годовую сезонность :

Тенденция постоянно увеличивается, но, кажется, имеет все более крутой наклон с течением времени - увеличение концентрации CO₂ в атмосфере. Линия тренда также показывает небольшие интервалы неопределенности в прогнозируемом году. Из этой кривой мы узнаем, что в 1965 году концентрация CO₂ в атмосфере составляла около 320 частей на миллион. К 2015 году эта цифра выросла до 400, а к 2030 году мы ожидаем около 430 частей на миллион. Однако эти точные числа будут варьироваться в зависимости от дня недели и времени. года в связи с наличием сезонных эффектов.

еженедельная сезонность показывает, что по дням недели значения будут варьироваться примерно на 0,01 PPM - незначительная величина и, скорее всего, чисто из-за шума и случайной случайности. В самом деле, интуиция подсказывает нам, что уровни углекислого газа (при измерении достаточно далеко от человеческой деятельности, например, на высоких склонах Мауна-Лоа) не заботятся о том, какой сейчас день недели, и не зависят от него.

Мы узнаем в Главе 4, Сезонность, как проинструктировать Пророка не вписываться в еженедельную сезонность, как это разумно в этом случае. В главе 10 «Интервалы неопределенности» мы узнаем, как построить график неопределенности для сезонности и убедиться, что такую ​​сезонность можно игнорировать.

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

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

Этот отрывок взят из главы 2 книги Прогнозирование данных временных рядов с помощью Facebook Prophet, доступной сейчас на Amazon. Книга содержит более 250 страниц примеров, уроков и описаний каждого аспекта Prophet, а также более 10 поучительных наборов данных, которые помогут вам научиться совершенствовать свои прогнозы, демонстрируя функциональные возможности Prophet от простых до сложных с полностью работающими код.

Полная книга состоит из следующих глав:

  1. История и развитие прогнозирования временных рядов
  2. Начало работы с Facebook Prophet
  3. Не ежедневные данные
  4. Сезонность
  5. каникулы
  6. Режимы роста
  7. Точки изменения тренда
  8. Дополнительные регрессоры
  9. Выбросы и особые события
  10. Интервалы неопределенности
  11. Перекрестная проверка
  12. Показатели эффективности
  13. Производство Пророка

Если вам понравился этот пост на Medium, рассмотрите возможность его заказа здесь: https://amzn.to/373oIcf. Если вы прочитаете книгу, я буду очень рад услышать ваши мысли!