Контекст и цель
В этом проекте я решал задачу прогнозирования количества заказов такси на следующий час по историческим данным. Формально это регрессия, но по сути — классическая работа с временным рядом.
Репозиторий с ноутбуком проекта:
Notebook: forecasting_taxi_orders/project_df_20260228_fin.ipynb
Ссылка на проект: перейти
Постановка задачи
Дано: история заказов с временной меткой.
Нужно: предсказать num_orders на следующий час.
Метрика качества: RMSE (чем меньше — тем лучше).
train_test_split здесь не подходит: нужно разделение с сохранением временного порядка.
Данные и предобработка
1) Приведение временной шкалы
Первое, что я сделал в задаче:
- приводим столбец времени к
datetime - устанавливаем его индексом
- приводим ряд к равномерной сетке (например, почасовой)
|
|
2) Анализ ряда (EDA)
На этапе EDA необходимо проверить:
- тренд и сезонности (суточная/недельная)
- выбросы и аномальные пики
- стабильность дисперсии
Подготовка признаков: как превратить ряд в табличные данные
Большинство моделей градиентного бустинга (CatBoost/LightGBM/XGBoost) ожидают табличные признаки. Поэтому временной ряд нужно «развернуть» в supervised-формат.
Я использовал два основных семейства признаков:
- Лаги — значения ряда в прошлом (
t-1,t-2, …) - Скользящие статистики — например, rolling mean
|
|
shift(1), иначе в признаках окажется текущее значение целевой переменной.
После генерации признаков неизбежно появляются NaN в начале ряда (из-за лагов и окна). Их нужно удалить:
|
|
Разделение train/valid/test без утечки
Правильный подход — последнюю часть ряда оставить под тест, а до неё — обучаться и валидироваться.
TimeSeriesSplit.
Обучение моделей и сравнение
Я сравнивал несколько базовых подходов:
- простая baseline-модель
- линейная регрессия (как sanity check)
- бустинги: LightGBM / CatBoost
Почему бустинг — сильный кандидат:
- хорошо работает на табличных данных
- «переваривает» много лаговых признаков
- умеет моделировать нелинейности и взаимодействия (час × день недели × лаги)
|
|
Что важно в результате (и что я вынес)
- Временной порядок важнее всего. Ошибка в разбиении или в rolling легко даст нереалистично хорошую метрику.
- Фичи решают. В задачах прогнозирования на 1 шаг вперёд лаги + rolling часто дают большой прирост.
- Календарные признаки — must-have. Без
hourиdayofweekмодель хуже ловит сезонность. - Baseline обязателен. Он защищает от ситуации «сложная модель хуже, чем простое правило».