Как проверить табличную модель на нескольких будущих месяцах

Удачный результат на одном будущем месяце ещё не показывает устойчивость табличной модели. Построим последовательный backtest и сохраним одинаковый смысл каждого месячного отчёта.

Повторяем тот момент, в котором принималось решение

Модель спроса проверили на сентябре и получили приемлемую ошибку. Перед запуском остаётся вопрос: это свойство подхода или удачное совпадение с одним спокойным месяцем? Ответить помогает серия исторических запусков. Для каждого месяца обучение использует доступное к его началу прошлое, а качество считается на следующем периоде.

Такую проверку называют backtest. Её ценность в повторении рабочего режима: сколько истории хранится, как часто модель переобучается, когда известны метки, какие признаки пересчитываются. Если в эксплуатации модель обучают раз в квартал, ежемесячный backtest с переобучением проверяет более благоприятный режим и может завысить ожидания.

Зафиксируйте календарь окон. Растущее окно сохраняет всю предыдущую историю; скользящее оставляет, например, только последние шесть месяцев. Выбор зависит от того, остаются ли старые наблюдения полезными. Сам backtest не выбирает окно за вас: он позволяет сравнить заранее заданные варианты на нескольких одинаковых проверочных периодах.

Проверим расписание на простом прогнозе

Возьмём продажи по месяцам с устойчивым ростом. Прогноз каждого месяца равен среднему предыдущих трёх. Это простой проверяемый baseline. Его задача — проверить хронологию расчёта и дать точку отсчёта для более сложной модели. В настоящем обучении вместо среднего вызывается процедура fit на соответствующем окне.

Нельзя сначала рассчитать признаки или подобрать настройки по всем месяцам, а потом только разрезать готовые прогнозы. Каждая операция, которая чему-либо учится на данных, должна повторяться внутри исторического окна. Если исходы заказов созревают через месяц, исключите ещё недоступные метки из обучения соответствующего запуска.

sales = [100, 110, 120, 130, 150, 160]
window = 3
errors = []
for month in range(window, len(sales)):
    train = sales[month-window:month]
    prediction = sum(train) / len(train)
    error = abs(prediction - sales[month])
    errors.append(error)
    print(month+1, "train=", train, "pred=", round(prediction, 2),
          "actual=", sales[month], "abs_error=", round(error, 2))
    assert len(train) == window
print("backtest MAE=", round(sum(errors)/len(errors), 2))
assert abs(sum(errors)/len(errors) - 230/9) < 1e-9

На четвёртый, пятый и шестой месяцы прогнозы составят 110, 120 и 133,33; факты — 130, 150 и 160. Средняя абсолютная ошибка трёх запусков равна 25,56. Видно, что среднее прошлого отстаёт от растущего ряда. Теперь у модели с трендовыми признаками есть понятный соперник: нужно улучшить этот результат на тех же месяцах.

При нескольких товарах храните качество по месяцу и товарной группе, а также число объектов. Среднее месячных MAE даёт каждому месяцу одинаковый вес. MAE по всем строкам сильнее учитывает месяцы с большим количеством наблюдений. Оба отчёта могут быть полезны, но отвечают на разные вопросы. Сразу укажите, как агрегируете результат.

Решение о запуске не должно зависеть только от одного общего числа. Посмотрите худший месяц, размах результатов и соответствующие изменения процесса: распродажу, смену ассортимента, запуск региона. Плохой месяц полезно расследовать, а не удалять из отчёта. Если событие повторится, система снова столкнётся с ним.

После выбора окна и признаков оставьте последний период для финальной проверки. Многократное изучение одних и тех же месяцев постепенно превращает их в данные для настройки. В итоговом артефакте сохраните границы окон, время доступности исходов, версии кода и прогнозы. Тогда backtest можно повторить после очередного изменения данных.

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

В платном курсе «ML Engineer / Data Scientist: табличные модели в продакшн» вы построите валидацию без утечек и научитесь вести воспроизводимую историю экспериментов. Эти навыки нужны, чтобы сравнивать модели на одних и тех же будущих периодах и объяснять результат. Откройте программу курса.

Продолжить на практике

  • ML Engineer / Data Scientist: табличные модели в продакшн ↗

    Практический курс для тех, кто хочет получить навыки ML Engineer / Data Scientist на реальных табличных задачах. В курсе Вы не просто обучите CatBoost/LightGBM, а соберёте полноценный production-style пайплайн: подготовка данных, feature engineering (генерация признаков), корректная валидация, защита от leakage (утечек), тюнинг через Optuna, интерпретация через SHAP, batch-инференс и REST API для предсказаний.