Ответ
MAPE (Mean Absolute Percentage Error) — это метрика для оценки ошибок регрессионных моделей, которая выражает среднюю абсолютную ошибку в процентах от фактических значений. Она удобна для интерпретации бизнесом.
Формула:
MAPE = (100% / n) * Σ(|(Actual - Forecast)| / |Actual|)
Практическое применение и нюансы:
import numpy as np
def mape(y_true: np.ndarray, y_pred: np.ndarray) -> float:
"""Вычисление MAPE. Требует обработки нулевых значений."""
# Игнорируем деление на ноль
mask = y_true != 0
if not np.any(mask):
return np.nan # Все фактические значения равны нулю
return np.mean(np.abs((y_true[mask] - y_pred[mask]) / y_true[mask])) * 100
# Пример с реальными данными
actual = np.array([100, 200, 0, 400])
forecast = np.array([110, 190, 10, 380])
print(f"MAPE (без нулей): {mape(actual, forecast):.2f}%")
Преимущества и недостатки:
- Плюсы: Легко интерпретировать (ошибка в %), инвариантна к масштабу данных.
- Минусы:
- Не определена при нулевых фактических значениях, что требует предварительной фильтрации или использования модификаций (например, sMAPE).
- Асимметрична: штрафует заниженные прогнозы сильнее, чем завышенные (например, прогноз 50 для факта 100 даст 50% ошибки, а прогноз 150 для того же факта — только 33%).
- Чувствительна к выбросам с малыми фактическими значениями.
В production-пайплайнах я часто использую MAPE вместе с другими метриками (MAE, RMSE) для комплексной оценки.
Ответ 18+ 🔞
Ну ты представляешь, есть такая штука — MAPE. Это типа как посчитать, насколько твой прогноз от реальности отъехал, но не в рублях, а в процентах. Бизнесмены её обожают, потому что проценты — это понятно, это как скидка в магазине, только наоборот, ёпта.
Сама формула, бля:
MAPE = (100% / n) * Σ(|(Actual - Forecast)| / |Actual|)
Короче, берёшь разницу между тем, что было, и тем, что нагадал, делишь на то, что было на самом деле, модуль ставишь, чтобы минусы не путали, всё это суммируешь, среднее находишь и на сто умножаешь. Всё, готово, можно идти отчитываться.
А вот как это в коде выглядит, если ты не лох:
import numpy as np
def mape(y_true: np.ndarray, y_pred: np.ndarray) -> float:
"""Вычисление MAPE. Требует обработки нулевых значений."""
# Игнорируем деление на ноль
mask = y_true != 0
if not np.any(mask):
return np.nan # Все фактические значения равны нулю
return np.mean(np.abs((y_true[mask] - y_pred[mask]) / y_true[mask])) * 100
# Пример с реальными данными
actual = np.array([100, 200, 0, 400])
forecast = np.array([110, 190, 10, 380])
print(f"MAPE (без нулей): {mape(actual, forecast):.2f}%")
Видишь, тут маска? Это чтобы, если в реальных данных ноль, на него не делить. А то будет тебе, ядрёна вошь, деление на ноль и полный пиздец в консоли.
Ну а теперь про плюсы и минусы, тут интересно:
- Что хорошо: Ошибка в процентах — это охуенно наглядно. Сказал начальнику «модель ошибается на 5%», он кивает. Сказал «ошибка 12.7», он глазами хлопает. И ещё она не зависит от масштаба, продажи ты меряешь или температуру.
- А что пиздецово:
- Нули в данных. Это главная засада. Если факт — ноль, то формула ломается, потому что на ноль делить нельзя, ёпта. Приходится выкручиваться, как ужан, отфильтровывать эти нули или другую метрику городить.
- Она несправедливая, сука. Если ты занизил прогноз, она тебя накажет сильнее, чем если завысил. Смотри: факт 100, ты сказал 50 — ошибка 50%. А если факт 100, а ты сказал 150 — ошибка уже 33%. Чувствуешь подвох? Пизда рулю.
- Выбросы её ебут. Если реальное значение маленькое, а ты промахнулся сильно, то процент ошибки будет просто овердохуища, и всё среднее захуярит к чёртовой матери.
Так что в серьёзных пайплайнах я никогда на одну MAPE не молюсь. Всегда смотрю ещё на MAE, RMSE, чтобы полную картину иметь, а то так и охуеть можно от неожиданностей.