Условие
Прогнозируем daily revenue, некоторые дни близки к 0. Какую метрику использовать и почему?
Решение
Подход
| Метрика | Формула | Плюсы | Минусы |
|---|---|---|---|
| MAE | `(1/n) Σ | y − ŷ | ` |
| RMSE | √(1/n) Σ (y−ŷ)² |
Штрафует большие ошибки | Чувствительна к outliers |
| MAPE | `(100/n) Σ | y − ŷ | / |
| sMAPE | `(100/n) Σ | y−ŷ | /(( |
| MASE | MAE / MAE_naive |
Сравнима между сериями | Нужен baseline |
| WAPE | `Σ | y−ŷ | / Σ |
Когда что
- MAE/RMSE: внутри одной серии, бизнес меряет в рублях.
- MAPE: если y >> 0 везде. Если есть точки с y ≈ 0 — забыть, взрывается.
- WAPE: для агрегированной оценки по портфелю (e.g. forecast всех SKU).
- MASE: cross-series сравнение, или benchmark vs naive (yesterday=today).
Реализация
import numpy as np
def mape(y, yhat):
return 100 * np.mean(np.abs((y - yhat) / y))
def smape(y, yhat):
return 100 * np.mean(2 * np.abs(y - yhat) / (np.abs(y) + np.abs(yhat) + 1e-9))
def wape(y, yhat):
return 100 * np.sum(np.abs(y - yhat)) / np.sum(np.abs(y))
def mase(y, yhat, season=1):
naive_mae = np.mean(np.abs(y[season:] - y[:-season]))
return np.mean(np.abs(y - yhat)) / naive_maeAsymmetry MAPE
MAPE штрафует over-forecast и under-forecast асимметрично:
- y=100, ŷ=150 → MAPE=50%
- y=100, ŷ=50 → MAPE=50%
- y=50, ŷ=100 → MAPE=100% (!)
Это поощряет модели предсказывать ниже истинного значения. Если бизнес чувствителен к under-forecast (out of stock), это плохо.
Для бизнеса
- Бизнес чаще понимает MAPE (%), но осторожно с y→0.
- Для нескольких товаров с разным масштабом — WAPE или MASE.
- При интервальном прогнозе — pinball loss / quantile loss.
Подводные камни
- MAPE при y=0 = ∞. Фильтруйте такие точки или используйте sMAPE / WAPE.
- RMSE более чувствительна к outliers — на noisy данных модель будет «бороться» с выбросами.
- Скрытый zero division: если в test разовый ноль, средняя MAPE улетает. Решения — MAPE на subset y>threshold.
- MASE с seasonal naive (season=7 для daily с недельной сезонностью) — обычно более релевантный baseline.
- Метрика для optimization (loss) и для evaluation могут отличаться. Часто learn на MSE, evaluate на MAPE — потому что MSE дифференцируема, а MAPE нет.
Эталонный ответ
MAE/RMSE — в исходных единицах. MAPE — относительная, но взрывается при y→0 и асимметрична (поощряет under-forecast). sMAPE ограничена 200%. WAPE стабильна и хороша для agg-portfolio. MASE — для сравнения с naive baseline. При y близких к 0 — WAPE или MAE, не MAPE.