Baseline для прогноза спроса: как задать модели честного соперника

Перед обучением модели спроса задайте простой прогноз, который можно повторить в эксплуатации. Сравним прошлое значение по товару с ML-прогнозом и разберём, какие ошибки делает baseline.

Простой соперник должен знать столько же, сколько модель

Команда обучила бустинг и получила MAE 7 товаров в день. Этого мало для оценки полезности: возможно, прогноз «продажи такого же дня прошлой недели» даёт ошибку пять. Baseline задаёт минимальный ориентир и помогает обнаружить ошибки постановки до дорогого перебора моделей.

Для спроса разумный baseline зависит от процесса. При недельном ритме можно взять значение того же дня прошлой недели; для медленно меняющегося показателя — последнее доступное наблюдение. Постоянное среднее тоже полезно, но не всегда отражает простое правило, которым уже пользуется компания. Выберите соперника, доступного в момент решения, и реализуйте его как обычную версию прогнозирования.

Сравнение должно сохранять горизонт. Если прогноз строится сразу на две недели, значение вчерашних продаж будет недоступно для дальних дат этого горизонта. Нельзя кормить baseline фактическими промежуточными значениями, когда модель их не получает. Аналогично нельзя давать модели обновлённую историю, а простому правилу — старую выгрузку.

Посчитаем ошибку по каждому товару

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

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

history = {"a": [100, 110], "b": [30, 30], "c": [0, 0]}
actual = {"a": 120, "b": 30, "c": 20}
model = {"a": 118, "b": 35, "c": 12}
baseline_errors, model_errors = [], []
for item, values in history.items():
    baseline = values[-1]
    be = abs(actual[item] - baseline)
    me = abs(actual[item] - model[item])
    baseline_errors.append(be)
    model_errors.append(me)
    print(item, "baseline=", baseline, "baseline_error=", be, "model_error=", me)
old = sum(baseline_errors)/len(baseline_errors)
new = sum(model_errors)/len(model_errors)
print("MAE:", old, new)
assert old == 10 and new == 5

Baseline получает ошибки 10, 0 и 20; модель — 2, 5 и 8. Средняя MAE снижается с 10 до 5. При этом на товаре b сложная версия хуже идеального простого прогноза. Следующий вопрос — устойчив ли выигрыш на нескольких периодах и не скрывает ли среднее ухудшение важной группы товаров.

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

Для новых товаров у правила последнего значения нет истории. Заранее определите fallback, например медиану похожей группы по прошлым данным. Оцените этот маршрут отдельно: он использует другое количество информации. Нельзя просто удалить новые товары из теста, если в эксплуатации они составят заметную часть запросов.

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

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

В платном курсе «ML Engineer / Data Scientist: табличные модели в продакшн» вы создадите признаки, обучите CatBoost и LightGBM и сравните результаты на корректной валидации. С такой практикой сложность модели можно сопоставить с измеримой пользой относительно простого прогноза. Откройте программу курса.

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

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

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