Prophet от Facebook: обзор
Знакомимся с популярной библиотекой Prophet: что внутри, для каких задач она создана и когда её брать.
Prophet — это аддитивная модель прогноза вида y(t) = тренд(t) + сезонность(t) + праздники(t) + шум, спроектированная для бизнес-рядов с сильной сезонностью.
Зачем ещё один инструмент
ARIMA требует стационарности, аккуратного подбора p,d,q и плохо переносит пропуски и выбросы. Prophet создавался в Facebook под массовый прогноз бизнес-метрик «без эксперта»: он устойчив к пропускам, умеет несколько сезонностей сразу (недельную + годовую), нативно учитывает праздники и даёт интервалы из коробки. Это делает его дефолтным выбором для прогноза трафика и продаж, когда нужен быстрый разумный результат.
Представьте отдел аналитики маркетплейса, которому каждое утро нужно обновить прогноз спроса по нескольким тысячам товарных категорий. У каждого ряда своя сезонность, свои праздничные всплески и свои пропуски в днях, когда товар был недоступен. Сажать на каждую категорию отдельного эксперта по ARIMA нереально: это месяцы ручного подбора. Prophet решает ровно эту боль — он даёт «достаточно хороший» прогноз по умолчанию, который можно гнать конвейером и улучшать точечно там, где это действительно важно для выручки.
Ещё одна типичная сцена — прогноз трафика веб-сайта или нагрузки на серверы. Тут переплетаются сразу несколько ритмов: будни против выходных, дневные и ночные часы, годовой спад на летних каникулах и резкие пики вокруг распродаж. Prophet ловит эти ритмы одной моделью, а инженер не вязнет в тонкой настройке. Когда от прогноза зависит, сколько серверов поднять и сколько денег потратить на инфраструктуру, важна именно скорость получения вменяемой оценки, а не борьба за последний процент точности.
Как устроена модель
Prophet раскладывает ряд на три явных слагаемых. Тренд — кусочно-линейный или логистический, с автоматически найденными точками перелома (change points). Сезонность — приближается рядом Фурье, поэтому одна модель держит и недельный, и годовой циклы. Праздники — отдельные регрессоры с собственными окнами влияния.
Сила такой декомпозиции в интерпретируемости. После обучения можно посмотреть на каждую компоненту по отдельности: вот растущий тренд, вот недельная волна с провалом в выходные, вот всплеск вокруг новогодних праздников. Это не чёрный ящик — заказчик из бизнеса видит, какая часть прогноза откуда взялась, и может оспорить или подтвердить логику. Для принятия решений эта прозрачность зачастую ценнее, чем минимальная ошибка непонятной модели.
from prophet import Prophet
import pandas as pd
df = pd.DataFrame({"ds": dates, "y": values}) # ds = дата, y = значение
m = Prophet(yearly_seasonality=True, weekly_seasonality=True)
m.add_country_holidays(country_name="RU") # праздники РФ
m.fit(df)
future = m.make_future_dataframe(periods=30) # горизонт 30 дней
forecast = m.predict(future)
print(forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail())
В прогнозе сразу есть yhat (точка) и yhat_lower/yhat_upper (интервал) — Prophet не заставляет считать неопределённость отдельно.
Обратите внимание на интерфейс: модель ждёт ровно два столбца — ds с датами и y со значениями. Это сознательное упрощение: единый контракт данных позволяет переиспользовать один и тот же код для любого ряда, будь то продажи, регистрации или количество заявок в поддержку. Метод make_future_dataframe сам достраивает будущие даты на нужный горизонт, а add_country_holidays подтягивает встроенный календарь праздников страны, избавляя от ручного ввода каждой даты.
Идея точек перелома тренда
Главная фишка — автоматический поиск мест, где наклон тренда меняется. Покажем простую эвристику обнаружения такой точки по смене знака приращений тренда.
trend = [10, 12, 14, 16, 18, 17, 16, 15, 14] # рост сменился спадом
slopes = [trend[i] - trend[i-1] for i in range(1, len(trend))]
print("Наклоны:", slopes)
for i in range(1, len(slopes)):
if (slopes[i] > 0) != (slopes[i-1] > 0):
print(f"Точка перелома около индекса {i+1}")
Вывод:
Наклоны: [2, 2, 2, 2, -1, -1, -1, -1] Точка перелома около индекса 5
Наклон был +2, затем стал -1 — в этой точке тренд переломился. Prophet делает то же самое, но статистически: расставляет много кандидатов-переломов и оставляет значимые, что позволяет гибко следовать за меняющимся трендом.
Зачем это нужно на практике? Бизнес-ряды редко растут по одной прямой годами. Запустили рекламную кампанию — наклон вырос; конкурент уронил цену — рост замедлился; вышли на новый рынок — тренд снова ускорился. Жёсткая прямая или единый ARIMA-дрифт такие сломы не отслеживают и начинают систематически промахиваться. Автоматические точки перелома позволяют тренду «дышать» вместе с реальностью, а заодно подсказывают аналитику даты, когда что-то в бизнесе изменилось — это уже само по себе полезный сигнал.
Как работает под капотом
Prophet формулирует прогноз как задачу байесовской регрессии на компоненты и оценивает её через Stan. Тренд по умолчанию кусочно-линейный: на каждой change point наклон получает поправку, а их сумма даёт гибкую ломаную. Сезонность — сумма синусов и косинусов (ряд Фурье) с настраиваемым числом гармоник. Праздники моделируются индикаторами с окнами. Всё аддитивно, поэтому компоненты легко интерпретировать по отдельности.
Байесовский подход даёт ещё один бонус — естественные интервалы неопределённости. На точках перелома Prophet закладывает априорное распределение на величину поправки наклона, а затем, экстраполируя в будущее, допускает, что новые переломы тоже возможны. Именно поэтому доверительный интервал прогноза расширяется по мере удаления горизонта: чем дальше заглядываем, тем больше шансов, что тренд успеет сломаться. Число гармоник Фурье регулирует гибкость сезонности: мало гармоник — плавная гладкая волна, много — модель цепляется за мелкие сезонные детали и рискует переобучиться на шум прошлых лет.
Частые ошибки
- Применять Prophet к высокочастотным рядам (секунды) — он заточен под дневную/недельную/годовую сезонность.
- Забыть указать праздники для ряда продаж — пики вокруг них останутся непойманными.
- Доверять кусочно-линейному тренду на длинном горизонте — он может «улететь» без логистического ограничения.
- Брать дефолтные настройки для ряда с явным насыщением — для рынков с потолком спроса нужен логистический тренд с заданной величиной cap.
- Слепо доверять автоматическим точкам перелома на коротком ряде — на нескольких десятках точек их статистика ненадёжна.
Итоги
- Prophet — аддитивная модель тренда, сезонности и праздников для бизнес-рядов.
- Он устойчив к пропускам, держит несколько сезонностей и сразу даёт интервалы.
- Сила — автоматические точки перелома тренда; слабость — высокая частота и длинный горизонт.
- Главная ценность — скорость и интерпретируемость: годный прогноз конвейером без эксперта на каждый ряд.