MAPE взрывается при нулевых продажах: какую ошибку регрессии считать
Модель прогнозирует дневные продажи магазина. В большинстве дней спрос около ста единиц, но иногда продаж нет. В отчёте MAPE внезапно показывает огромное число, хотя ошибку в день без продаж можно описать просто: предсказали одну единицу вместо нуля. Прежде чем искать баг в модели, посмотрите на знаменатель метрики.
Что происходит с процентом при нулевом факте
MAPE усредняет отношение абсолютной ошибки к абсолютному факту. Для дня с продажами 100 и прогнозом 90 ошибка составляет 10%. Для дня с фактом 0 обычная формула делит на ноль. scikit-learn использует очень маленькое положительное значение вместо нулевого знаменателя и возвращает конечное, но крайне большое число. Это техническое поведение функции, а не осмысленный «процент ошибки» в пустой день.
В коротком примере есть один нулевой день и два дня с фактом 100. Посчитаем MAPE, абсолютную ошибку в исходных единицах и отдельно ошибку на нулевых днях.
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error
actual = np.array([0., 100., 100.])
forecast = np.array([1., 90., 110.])
print("MAE:", round(mean_absolute_error(actual, forecast), 3))
print("MAPE:", mean_absolute_percentage_error(actual, forecast))
print("MAE по нулевым дням:", mean_absolute_error(actual[actual == 0], forecast[actual == 0]))
assert mean_absolute_error(actual, forecast) == 7MAE равен 7 единицам: абсолютные ошибки 1, 10 и 10 делятся на три. Для нулевого дня MAE равен одной единице. Функция возвращает отношение, так что 0,1 означает 10%. Здесь MAPE равен примерно 1,5 × 10¹⁵ из-за одной строки, хотя остальные два дня имеют понятные десятипроцентные отклонения. Если оптимизировать модель только по этому числу, она может начать вести себя не так, как нужно магазину.
Вернитесь к цене ошибки
Если одна лишняя единица прогноза означает лишний товар на складе, MAE в штуках легче связать с действием. Если большие промахи особенно дорогие, посмотрите и RMSE: он сильнее штрафует крупные остатки. Для товаров разного масштаба считайте метрику по группам или нормируйте её понятным бизнес-объёмом, например общим спросом за период; заранее определите, какие нулевые группы допускают такой знаменатель.
Иногда команда предлагает просто добавить единицу к каждому факту перед делением. Это делает число конечным, но меняет смысл процента: ошибка на продаже одной штуки и нулевом дне начинает зависеть от выбранной константы. Если такое правило нужно для конкретного отчёта, объясните его единицу и проверьте, как меняется ранжирование моделей при другом значении константы. Для основных решений проще оставить метрику в натуральных единицах и показать нулевые дни отдельным срезом.
Сравните модель с тривиальным прогнозом, например вчерашним спросом или постоянной медианой за последние недели. Если сложная модель уменьшает MAE лишь на доли единицы, но сильно ошибается именно на днях с нулём, решение может быть хуже для склада. Обозначьте цену дефицита и избытка: когда она асимметрична, одна симметричная метрика не описывает всю задачу, и порог закупки нужно оценивать отдельно.
Не стоит просто выкидывать нулевые дни из итоговой оценки. Важно знать, как модель действует при закрытом магазине, отсутствии спроса или отключённом канале. Разделите причины нуля: если магазин был закрыт, прогнозирование спроса в этот день, возможно, вообще не является задачей модели. Если магазин работал, ноль — полноценное наблюдение. Посчитайте отдельно долю таких дней и абсолютную ошибку на них, чтобы общая метрика не скрывала провал.
Перед выбором метрики определите, на каком уровне нужен прогноз: штуки на товар, выручка на магазин или сумма за неделю. Одна и та же модель может выглядеть плохо по ежедневному MAPE и быть полезной для недельного заказа товара. Проверяйте её на том горизонте и той единице, где принимается решение. В отчёте оставьте распределение ошибок и несколько примеров с наибольшей стоимостью, а не только одно среднее.
В курсе «Data Scientist: от данных до деплоя моделей» вы начинаете с формулировки задачи и выбора метрики, затем строите baseline, сравниваете модели и разбираете ошибки по сегментам. На задаче спроса это позволяет выбрать показатель, который отражает цену недозаказа и избытка, и перенести его в мониторинг после релиза. Откройте программу курса.
Продолжить на практике
- Data Scientist: от данных до деплоя моделей ↗
Практический курс по Data Science: от постановки ML-задачи и работы с данными до inference API, CI/CD и мониторинга моделей в продакшне. Вы пройдёте EDA, feature engineering, обучение и оценку моделей, experiment tracking, error analysis и deployment — чтобы собирать полноценный рабочий контур вокруг ML-решения.
