В чем разница между MAPE и sMAPE?

«В чем разница между MAPE и sMAPE?» — вопрос из категории Метрики и функции потерь, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

MAPE и sMAPE — это метрики для оценки точности прогнозов, выраженные в процентах, но они по-разному рассчитывают ошибку.

  • MAPE (Mean Absolute Percentage Error) — Средняя абсолютная процентная ошибка.

    • Формула: MAPE = (100% / n) * Σ |(Факт - Прогноз) / Факт|
    • Интерпретация: Показывает, в среднем на сколько процентов наши прогнозы отклоняются от фактических значений.
    • Недостатки:
      1. Асимметрия: Сильнее штрафует заниженные прогнозы, чем завышенные (так как знаменатель — фактическое значение).
      2. Проблема с нулями: Не может быть вычислен, если какое-либо фактическое значение равно нулю.
  • sMAPE (Symmetric Mean Absolute Percentage Error) — Симметричная средняя абсолютная процентная ошибка.

    • Формула: sMAPE = (200% / n) * Σ |Прогноз - Факт| / (|Прогноз| + |Факт|)
    • Идея: Учитывает ошибку относительно суммы фактического и прогнозируемого значений, что делает метрику симметричной.
    • Преимущество: Устраняет асимметрию MAPE, одинаково обрабатывая завышение и занижение.
    • Недостаток: Может давать завышенные значения ошибки, когда и факт, и прогноз близки к нулю.

Пример расчета на Python:

import numpy as np

y_true = np.array([100, 200, 300])
y_pred = np.array([110, 190, 280])

# MAPE
mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100
print(f"MAPE: {mape:.2f}%")

# sMAPE
smape = np.mean(2 * np.abs(y_pred - y_true) / (np.abs(y_true) + np.abs(y_pred))) * 100
print(f"sMAPE: {smape:.2f}%")

Вывод: MAPE более интуитивно понятен (ошибка в % от факта), но имеет серьезные ограничения. sMAPE часто используется как более сбалансированная альтернатива, особенно в задачах прогнозирования, где нет явного перекоса в сторону занижения или завышения.