Прогноз одним числом скрывает риск: квантили для интервала спроса

Поставщику нужно решить, сколько товара привезти. Средний прогноз 100 единиц не говорит, насколько опасно заказать ровно 100: спрос может обычно колебаться между 95 и 105, а может между 40 и 160. Для запаса важен диапазон возможных исходов, особенно если дефицит и излишек имеют разную цену. Один способ получить такой диапазон — обучить модель на условные квантили спроса.

Две границы вместо одной точки

Модель для 10-го процентиля оценивает нижнюю границу, для 90-го — верхнюю. Если обучение и будущие данные сопоставимы, приблизительно 80% новых фактов хотелось бы увидеть между ними. Это цель, которую нужно проверить, а не автоматическая гарантия после установки параметров 0.1 и 0.9. HistGradientBoostingRegressor поддерживает loss="quantile" и параметр нужного квантиля.

Синтетический пример ниже задаёт спрос с растущей неопределённостью: при большем признаке случайный разброс больше. Первые 800 строк идут в обучение, последние 400 — в проверку. Посчитаем покрытие на 400 отложенных строках.

import numpy as np
from sklearn.ensemble import HistGradientBoostingRegressor

rng = np.random.default_rng(2)
X = rng.uniform(0, 1, 1200).reshape(-1, 1)
y = 10 + 5 * X[:, 0] + rng.normal(0, 1 + 2 * X[:, 0])
train, test = np.arange(800), np.arange(800, 1200)
models = {}
for q in (0.1, 0.9):
    models[q] = HistGradientBoostingRegressor(
        loss="quantile", quantile=q, max_iter=100, random_state=0
    ).fit(X[train], y[train])
low = models[0.1].predict(X[test])
high = models[0.9].predict(X[test])
coverage = np.mean((y[test] >= low) & (y[test] <= high))
print("доля внутри интервала:", round(float(coverage), 3))
print("средняя ширина:", round(float(np.mean(high - low)), 3))
assert np.all(low <= high)

На этом прогоне внутри границ оказывается 0,71 проверочных наблюдений при средней ширине около 4,745. Это меньше намеченных 0,8: выбранные квантильные модели дают слишком узкий или смещённый диапазон для части новых строк. Не записывайте в отчёте «80% покрытие» по названиям квантилей; запишите измеренные 71% и исследуйте, где именно выходят факты. После изменения модели или правил калибровки проверьте новую версию на отдельном периоде.

Код выводит фактическую долю значений между двумя границами и среднюю ширину интервала. Первое число показывает, насколько часто история укладывается в диапазон; второе не даёт объявить полезным интервал от минус бесконечности до плюс бесконечности. Проверка low <= high ловит пересечение границ. На реальных данных такие пересечения возможны при независимом обучении квантильных моделей; тогда нужен явный способ обработки и повторная оценка.

Как применять диапазон для заказа

Считайте покрытие не только в среднем, но и по товарам, сезонам и точкам. Интервал, который работает для массовых позиций и систематически узок на редких, не решит задачу этих редких позиций. Смотрите также ширину: одинаковое покрытие при диапазонах 20 и 200 единиц имеет разную практическую ценность. Для дорогого дефицита можно ориентироваться ближе к верхнему квантилю, но конкретный объём заказа определяют вместе с остатком, сроком поставки и стоимостью хранения.

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

Курс «Data Scientist: от данных до деплоя моделей» помогает пройти от постановки задачи и выбора метрики до воспроизводимой валидации, анализа ошибок и мониторинга модели. На задаче заказа это превращает диапазон прогноза в проверяемое решение с известным покрытием и шириной. Откройте программу курса.

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

  • Data Scientist: от данных до деплоя моделей ↗

    Практический курс по Data Science: от постановки ML-задачи и работы с данными до inference API, CI/CD и мониторинга моделей в продакшне. Вы пройдёте EDA, feature engineering, обучение и оценку моделей, experiment tracking, error analysis и deployment — чтобы собирать полноценный рабочий контур вокруг ML-решения.