Прогнозирование временных рядов — ключевая задача для планирования продаж, закупок и загрузки мощностей. Недавно один из наших клиентов — сеть розничных магазинов с 500 точками — столкнулся с нестабильным прогнозом еженедельных продаж: Seasonal Naive давал SMAPE 15%, а бизнес требовал точность 10%. Мы выбрали Prophet, настроили changepoint_prior_scale=0.05, seasonality_mode='multiplicative' и получили SMAPE 8%, сократив ошибку вдвое. Это реальный пример, как правильная модель и тюнинг решают проблему.
Мы занимаемся AI/ML более 5 лет, выполнили 30+ проектов по прогнозированию. Гарантируем качество: используем строгую кросс-валидацию и сравниваем с несколькими baseline. Наши инженеры публикуют model cards и обеспечивают воспроизводимость экспериментов. Бюджет на обучение модели обсуждается индивидуально — стоимость зависит от сложности данных и требуемой точности.
Как выбрать между Prophet, NeuralProphet и TimesFM?
Выбор модели зависит от трёх факторов: объём данных, необходимость интерпретируемости, наличие внешних событий (праздники, промо). Если у вас мало данных (менее 2 лет) и нужна прозрачность — берите Prophet. Если есть нелинейные лаги и внешние регрессоры — NeuralProphet. Если данных много (тысячи точек) и нужна максимальная точность без объяснения — TimesFM. Для точного подбора свяжитесь с нами — мы проведём бесплатный анализ ваших данных.
Что входит в обучение модели под ключ?
Мы готовим данные, подбираем гиперпараметры, проводим кросс-валидацию, строим production-пайплайн (Airflow + MLflow), документируем модель и передаём API-эндпоинт. В результате вы получаете обученную модель, документацию, инструкцию по эксплуатации и месяц поддержки. Дополнительно настраиваем мониторинг дрейфа данных и автообновление модели.
Prophet: декомпозиционная модель
Meta Prophet — аддитивная модель:
y(t) = trend(t) + seasonality(t) + holidays(t) + ε(t)
Trend — кусочно-линейный или логистический рост. Changepoints — автоматическое обнаружение точек изменения тренда через L1-регуляризацию.
Seasonality описывается рядами Фурье: годовая с N=10 (default), недельная с N=3, пользовательская для любого периода.
Обучение и тюнинг:
from prophet import Prophet
import pandas as pd
m = Prophet(
changepoint_prior_scale=0.05, # гибкость тренда
seasonality_prior_scale=10.0, # гибкость сезонности
holidays_prior_scale=10.0,
seasonality_mode='multiplicative' # для данных с ростом
)
m.add_country_holidays(country_name='RU')
m.add_seasonality(name='monthly', period=30.5, fourier_order=5)
m.fit(df) # df с колонками ds, y
Ключевые параметры тюнинга: changepoint_prior_scale (0.001–0.5) контролирует overfit к тренду, seasonality_mode ('additive' для стационарных, 'multiplicative' для растущих), fourier_order (больше = гибче сезонность).
Кросс-валидация Prophet:
from prophet.diagnostics import cross_validation, performance_metrics
df_cv = cross_validation(m, initial='730 days', period='180 days', horizon='365 days')
df_p = performance_metrics(df_cv)
NeuralProphet: Prophet с нейросетевыми компонентами
NeuralProphet дополняет Prophet авторегрессией (AR-Net) и нелинейными лаговыми регрессорами. Обучение через PyTorch значительно быстрее MCMC-Prophet.
from neuralprophet import NeuralProphet
m = NeuralProphet(
n_forecasts=7, # горизонт прогноза
n_lags=14, # число лагов для AR
seasonality_mode='auto',
learning_rate=0.01
)
m = m.add_country_holidays('RU')
metrics = m.fit(df, freq='D', validation_df=df_val)
NeuralProphet эффективен при нелинейных лаговых зависимостях, множественных шагах прогноза и наличии внешних регрессоров с задержкой.
TimesFM: Foundation Model от Google
TimesFM — pretrained foundation model для zero-shot прогнозирования. Не требует обучения на ваших данных, первый прогноз за минуты.
import timesfm
tfm = timesfm.TimesFm(
context_len=512,
horizon_len=128,
input_patch_len=32,
output_patch_len=128,
num_layers=20,
model_dims=1280,
backend='gpu'
)
tfm.load_from_checkpoint(repo_id="google/timesfm-1.0-200m")
# Zero-shot inference
forecast_input = [np.array(historical_data)]
frequency_input = [0] # 0=high freq, 1=low freq
point_forecast, experimental_quantile_forecast = tfm.forecast(
forecast_input, freq=frequency_input
)
Преимущества: zero-shot, скорость, сильный результат на большинстве задач. Ограничения: не учитывает known future covariates без fine-tuning, ограниченная интерпретируемость, требует значимого контекста (>500 точек).
Сравнительный выбор моделей
| Критерий |
Prophet |
NeuralProphet |
TimesFM |
| Нужна интерпретируемость |
✓✓ |
✓ |
✗ |
| Есть known future events |
✓✓ |
✓✓ |
✗ |
| Мало данных (< 2 лет) |
✓ |
✓ |
✓✓ |
| Нелинейные лаги важны |
✗ |
✓✓ |
✓ |
| Нужна высшая точность |
✗ |
✓ |
✓✓ |
| Множество рядов (>1000) |
✗ |
✓ |
✓✓ |
Примерные сроки и объём работ
| Этап |
Длительность |
| Подготовка данных и EDA |
3–5 дней |
| Обучение и тюнинг одной модели |
5–10 дней |
| Кросс-валидация и выбор финальной модели |
2–3 дня |
| Развёртывание production-пайплайна |
10–15 дней |
| Документация и передача |
2–3 дня |
Типичные ошибки при обучении Prophet
- Установка changepoint_prior_scale слишком большой (>0.5) — переобучение тренда.
- Игнорирование мультиколлинеарности между праздничными эффектами.
- Использование аддитивной сезонности на данных с экспоненциальным ростом.
- Недостаточное количество initial периодов в кросс-валидации (меньше 2 сезонов).
Практика обучения и валидации
Pipeline обучения (пример с Prophet):
- Подготовка данных: ресемплинг к нужной частоте, обработка пропусков (interpolation / forward fill).
- Анализ: ACF/PACF, decompose, holiday analysis.
- Baseline: Seasonal Naive (прогноз = значение год назад).
- Prophet fit с default params, кросс-валидация.
- Hyperparameter search: Optuna / grid search по 4–6 параметрам (например, changepoint_prior_scale, seasonality_prior_scale, fourier_order).
- Ансамблирование с конкурентом (ETS или NeuralProphet).
- Productionization: Airflow DAG, MLflow tracking, API endpoint.
Метрики сравнения: SMAPE, MASE (нормирован на Seasonal Naive), Winkler Score для интервальных прогнозов.
Сроки: настройка и обучение Prophet/NeuralProphet для одного ряда с кросс-валидацией — 1–2 недели. Production pipeline с мониторингом и автопереобучением — 4–6 недель. Экономия от точного прогноза может покрыть стоимость проекта в течение первых месяцев. Получите индивидуальное предложение — свяжитесь с нами для консультации по вашей задаче. Оценим проект и предложим оптимальное решение.
Какие проблемы прогнозирования временных рядов встречаются чаще всего?
Финансовый директор запрашивает прогнозирование временных рядов продаж на квартал. Аналитик строит SARIMA, добивается MAPE 8.3% на тестовой выборке — и с гордостью деплоит. Через два месяца в production метрика падает до 23%. Причина классическая: модель обучалась на данных до COVID, тестировалась на стабильном периоде, а production попал на промо-акцию и сбой поставок. Data leakage + distribution shift = красивые цифры в ноутбуке и неработающий прогноз в реальности. Мы сталкивались с этим десятки раз. Наш опыт — 5+ лет в прогнозировании временных рядов для ритейла, финтеха и IoT, более 50 завершённых проектов.
Неправильная кросс-валидация. Стандартный train_test_split для временных рядов — ошибка. Случайное разбиение создаёт data leakage: модель видит «будущие» значения в обучении. Правильно — TimeSeriesSplit или walk-forward validation с expanding window.
Множественная сезонность. Почасовые данные потребления электроэнергии имеют три сезонности: суточную (24 ч), недельную (168 ч), годовую (8760 ч). SARIMA справляется только с одной. Prophet обрабатывает несколько, но медленно масштабируется на тысячи рядов.
Пропуски и аномалии в данных. Пропуск в сенсорных данных — это информация (датчик отключился), а не просто NaN. Линейная интерполяция убивает этот сигнал. Правильная обработка зависит от природы пропуска.
Cold start при иерархическом прогнозировании. Новый SKU в ассортименте из 50 000 позиций: исторических данных нет, нужен прогноз. Стандартные подходы тут не работают — нужны cross-learning подходы или feature-based методы.
Какие инструменты и когда применять?
Prophet (Meta) — отличный старт для бизнес-данных с понятной сезонностью и праздниками. Быстро настраивается, интерпретируем, встроенная обработка выбросов и пропусков. Падает в точности при нерегулярных паттернах и не масштабируется на десятки тысяч рядов без параллелизации. Prophet (Facebook) — официальная документация.
Gradient boosting на фичах (LightGBM, XGBoost) — часто недооценённый подход. Создаёте фичи вручную: лаги (t-1, t-7, t-28), скользящие средние, категориальные признаки (день недели, месяц), экзогенные переменные. Модель обучается на всех рядах одновременно — решает cold start через похожие ряды. MAPE на ритейл-прогнозировании часто лучше нейронных сетей при правильной feature engineering.
TFT (Temporal Fusion Transformer) — трансформер, специально разработанный для интерпретируемого прогнозирования с ковариатами. Встроенные механизмы: variable selection (какие признаки важны), temporal self-attention (какие временные точки влияют на прогноз), квантильные предсказания. Доступен в pytorch-forecasting. Требует ~10 000+ записей на ряд для стабильного обучения. Temporal Fusion Transformer — академическая публикация.
PatchTST — трансформер, который делит временной ряд на патчи (аналогично ViT для изображений). Лучше захватывает локальные паттерны, чем классические трансформеры. Хорошо работает для long-horizon forecasting (прогноз на 96–720 шагов). Реализация в neuralforecast от Nixtla.
N-HiTS, N-BEATS — нейронные архитектуры без attention, быстрее TFT, конкурентная точность. N-BEATS выигрывает на M4/M5 benchmark для задач без ковариат.
| Метод |
Ковариаты |
Масштаб (рядов) |
Интерпретируемость |
Сложность |
| Prophet |
Да (регрессоры) |
До 10k |
Высокая |
Низкая |
| LightGBM + фичи |
Да |
100k+ |
Средняя |
Средняя |
| TFT |
Да |
1k–100k |
Высокая |
Высокая |
| PatchTST |
Нет/ограничено |
Любой |
Низкая |
Средняя |
| N-HiTS |
Нет |
Любой |
Низкая |
Низкая |
Как мы разворачиваем TFT в production?
TFT требует тщательной подготовки данных. Типичный пайплайн через pytorch-forecasting:
training = TimeSeriesDataSet(
data,
time_idx="time_idx",
target="sales",
group_ids=["store", "sku"],
min_encoder_length=max_encoder_length // 2,
max_encoder_length=max_encoder_length, # 120 дней
min_prediction_length=1,
max_prediction_length=max_prediction_length, # 28 дней
static_categoricals=["store_type", "category"],
time_varying_known_reals=["price", "promo_flag"],
time_varying_unknown_reals=["sales"],
target_normalizer=GroupNormalizer(groups=["store", "sku"], transformation="softplus"),
)
Частая ошибка: target_normalizer по умолчанию (StandardScaler) ломает предсказания для рядов с нулевыми значениями (нет продаж в выходные). GroupNormalizer с transformation="softplus" — правильный выбор для count-данных.
Пошаговая инструкция по настройке TFT
-
Сбор и подготовка данных. Обработать пропуски (маркировать NaN, интерполировать только если это технический сбой), агрегировать до нужной частоты, сформировать ковариаты (праздники, промо, цены).
-
Создание
TimeSeriesDataSet. Указать group_ids (например, магазин+SKU), временной индекс, горизонт прогноза. Настроить target_normalizer с учётом распределения таргета.
-
Обучение baseline. Сначала Prophet или LightGBM — чтобы понять, насколько сложнее задача.
-
Тренировка TFT. Запустить
TemporalFusionTransformer с loss=QuantileLoss(), подобрать learning rate и размеры hidden слоёв. Использовать pytorch_forecasting или neuralforecast.
-
Валидация и интерпретация. Проверить walk-forward, проанализировать variable selection, построить attention heatmap.
Кейс: прогноз спроса в ритейле. Сеть из 120 магазинов, 8000 SKU, горизонт прогноза 28 дней. Исходная система: SARIMA отдельно для каждого ряда, MAPE 18.4%, полный цикл переобучения — 6 часов. TFT на PyTorch + pytorch-forecasting: одна модель на все ряды, MAPE 11.2%, переобучение — 40 мин на A10G. Дополнительный бонус: feature importance через variable selection — выяснилось, что day_before_holiday влияет сильнее, чем сама дата праздника. Средняя экономия бюджета на инференсе для клиента составила 1.5 млн ₽ в год.
Как правильно оценивать качество прогнозов?
Не используйте RMSE как единственную метрику — она сильно штрафует за большие ошибки на больших значениях. Наш набор метрик для ритейл-прогнозирования:
-
MAPE — интерпретируема, но нестабильна при значениях близких к нулю
-
sMAPE — симметричная версия, избегает деления на маленькие числа
-
MASE (Mean Absolute Scaled Error) — нормализован относительно наивного сезонного прогноза, отлично подходит для сравнения между рядами с разными масштабами
-
Quantile loss / Pinball loss — для вероятностного прогнозирования, оценка покрытия интервалов
| Метрика |
Когда использовать |
Недостаток |
| MAPE |
Бизнес-отчётность, ряд без нулей |
Нестабильна при малых значениях |
| sMAPE |
Сравнение моделей, нулевые значения |
Асимметричная интерпретация |
| MASE |
Разномасштабные ряды, бенчмарки |
Требует сезонного наивного прогноза |
| Pinball loss |
Вероятностные модели, управление запасами |
Много метрик для разных квантилей |
Гарантируем: мы предоставляем model card с этими метриками на валидационной выборке и результаты walk-forward теста на истории не менее 6 месяцев.
Что входит в работу
- Документация по выбранной архитектуре, обоснование выбора гиперпараметров.
- Воспроизводимый пайплайн обучения и инференса (Docker + CI/CD + Airflow/Prefect).
- Код с комментариями и модульными тестами на ключевые компоненты.
- Обучение вашей команды: как переобучать модель, как интерпретировать выходы, как деплоить новые версии.
- Поддержка в течение 3 месяцев после сдачи: консультации, фиксы багов, донастройка.
Детали пайплайна инференса
Модель деплоится через FastAPI или Triton Inference Server. Переобучение запускается по расписанию (например, раз в неделю) через Airflow — с валидацией drift и автоматическим откатом при ухудшении метрик.
Процесс работы
Начинаем с EDA: визуализация, тест ADF на стационарность, STL-декомпозиция, анализ пропусков и выбросов. Это 2–3 дня, но часто выявляет системные проблемы данных, которые блокируют прогнозирование.
Затем: baseline (наивный seasonal, Prophet), feature engineering для LGBM, выбор архитектуры нейронной сети если нужно. Walk-forward validation с реалистичным горизонтом. Деплой через API с автоматическим переобучением по расписанию через Airflow или Prefect.
Сроки ориентировочно: MVP-прогноз на одном типе данных — 3–6 недель. Иерархическая система прогнозирования с автоматизацией — 2–5 месяцев. Стоимость рассчитывается индивидуально.
Наша команда — сертифицированные ML-инженеры (AWS ML Specialty, GCP Professional ML Engineer). За 5 лет на рынке реализовали более 50 проектов по прогнозированию. Свяжитесь с нами для бесплатного анализа ваших данных — мы оценим задачу и дадим первые рекомендации за 1–2 дня. Закажите консультацию и убедитесь, что ваши прогнозы работают в production, а не только в ноутбуке.