Что такое MAPE?

Ответ

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}%")

Преимущества и недостатки:

  • Плюсы: Легко интерпретировать (ошибка в %), инвариантна к масштабу данных.
  • Минусы:
    1. Не определена при нулевых фактических значениях, что требует предварительной фильтрации или использования модификаций (например, sMAPE).
    2. Асимметрична: штрафует заниженные прогнозы сильнее, чем завышенные (например, прогноз 50 для факта 100 даст 50% ошибки, а прогноз 150 для того же факта — только 33%).
    3. Чувствительна к выбросам с малыми фактическими значениями.

В 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», он глазами хлопает. И ещё она не зависит от масштаба, продажи ты меряешь или температуру.
  • А что пиздецово:
    1. Нули в данных. Это главная засада. Если факт — ноль, то формула ломается, потому что на ноль делить нельзя, ёпта. Приходится выкручиваться, как ужан, отфильтровывать эти нули или другую метрику городить.
    2. Она несправедливая, сука. Если ты занизил прогноз, она тебя накажет сильнее, чем если завысил. Смотри: факт 100, ты сказал 50 — ошибка 50%. А если факт 100, а ты сказал 150 — ошибка уже 33%. Чувствуешь подвох? Пизда рулю.
    3. Выбросы её ебут. Если реальное значение маленькое, а ты промахнулся сильно, то процент ошибки будет просто овердохуища, и всё среднее захуярит к чёртовой матери.

Так что в серьёзных пайплайнах я никогда на одну MAPE не молюсь. Всегда смотрю ещё на MAE, RMSE, чтобы полную картину иметь, а то так и охуеть можно от неожиданностей.