Диагностика Mock-интервью
Главная · Основы машинного обучения

Временные ряды и прогнозирование

Временные ряды (time series): декомпозиция на тренд и сезонность, наивные бейзлайны, лаговые фичи, walk-forward валидация и почему random split для рядов — утечка данных.

Интуиция

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

Классический способ думать о ряде — декомпозиция (decomposition) на три компоненты:

y(t) = тренд(t) + сезонность(t) + остаток(t)

Тренд — медленное движение уровня (бизнес растёт), сезонность — повторяющийся узор (по субботам продажи выше), остаток — шум, который не объясняется ни тем, ни другим. Хорошая модель ловит первые две компоненты и не пытается выучить третью.

Бейзлайны, которые стыдно проигрывать

Прежде чем строить что-то умное, обязательны наивные прогнозы:

Если ваша нейросеть проигрывает seasonal naive — у вас нет модели, у вас есть дорогой генератор случайных чисел. На собеседовании фраза «сначала я построю naive-бейзлайн» звучит как признак зрелости.

💡 Ключевая мысль В задачах с временем главное правило одно: и фичи, и валидация используют только прошлое. Всё, что трогает будущее, — утечка.

Фичи и валидация: только из прошлого

ML-подход к рядам — превратить прогноз в обычную табличную задачу. Фичи для точки t:

Железное правило: каждая фича вычисляется только из данных до момента t. Скользящее среднее, центрированное на t (окно захватывает будущее), — уже утечка данных. Тот же вопрос задаём внешним признакам: фактическая погода в день прогноза известна не будет — можно брать только прогноз погоды, каким он был в момент предсказания.

Валидация — та же логика. Random split перемешивает будущее в train, и модель получает нечестно низкую ошибку: она интерполирует между известными соседями вместо экстраполяции. Правильно — сплит по времени: обучение на прошлом, проверка на будущем. Ещё честнее — walk-forward (расширяющееся окно): обучаемся на данных до точки k, прогнозируем следующий отрезок, сдвигаем границу, повторяем и усредняем ошибку по всем отрезкам.

Чем прогнозируют на практике

Качество меряют MAE (средняя абсолютная ошибка, в единицах ряда) и MAPE (в процентах — удобно сравнивать ряды разного масштаба). И помните про горизонт: чем дальше прогноз, тем больше накапливается неопределённость — ошибка на 30 дней вперёд всегда хуже, чем на 7. Поэтому горизонт выбирают от бизнес-задачи (на сколько дней вперёд реально принимаются решения), а метрику считают отдельно по каждому шагу горизонта: усреднённое по 30 дням число прячет тот факт, что первая неделя предсказывается отлично, а последняя — на уровне подбрасывания монетки.

⚠️ Подводный камень MAPE делит ошибку на фактическое значение: если ряд проходит около нуля (маржа, температура, спрос на редкий товар), метрика взрывается до тысяч процентов или вовсе не определена. Для таких рядов берите MAE или sMAPE/WAPE.
🎤 На собеседовании
  • «Как валидировать модель прогноза продаж?» — только сплит по времени, лучше walk-forward: несколько последовательных отрезков «обучение на прошлом — проверка на будущем».
  • «Почему naive-бейзлайн обязателен?» — он задаёт планку почти бесплатно; сложная модель, не бьющая seasonal naive, не даёт ценности.
  • «Какие фичи нельзя брать?» — всё, что использует данные после момента предсказания: центрированные окна, агрегаты за «весь период», статистики, посчитанные по всему ряду до сплита.
  • «Чем бы прогнозировали 10 000 рядов товаров?» — бустинг на лагах и календарных фичах: одна модель на все ряды, внешние признаки добавляются тривиально.