Что такое метрика sMAPE (Symmetric Mean Absolute Percentage Error)?

Ответ

sMAPE (Symmetric Mean Absolute Percentage Error) — симметричная средняя абсолютная процентная ошибка. Это модификация стандартной метрики MAPE, разработанная для решения её ключевой проблемы: асимметричного штрафа и неопределённости при истинных значениях, близких к нулю.

Формула (наиболее распространённый вариант): sMAPE = (100% / n) * Σ ( |y_true - y_pred| / ((|y_true| + |y_pred|) / 2) )

Или, что эквивалентно: sMAPE = (200% / n) * Σ ( |y_true - y_pred| / (|y_true| + |y_pred|) )

Интерпретация:

  • 0% — идеальный прогноз (факт и прогноз совпадают).
  • Значение может приближаться к 200% при больших ошибках, особенно когда факт и прогноз имеют разные знаки.

Преимущества перед MAPE:

  1. Симметричность: одинаково штрафует за переоценку и недооценку.
  2. Устойчивость к нулям: знаменатель (|y_true| + |y_pred|) не обращается в ноль, если оба значения не равны нулю одновременно.

Недостатки и критика:

  • Метрика всё ещё может быть неопределена, если и y_true, и y_pred равны нулю.
  • Некоторые исследователи указывают, что sMAPE также не является абсолютно симметричной и может иметь смещение.

Пример вычисления на Python:

import numpy as np

def smape(y_true, y_pred):
    """Вычисляет sMAPE в процентах."""
    # Добавляем эпсилон для численной стабильности, если оба значения нули
    epsilon = 1e-8
    numerator = np.abs(y_pred - y_true)
    denominator = (np.abs(y_true) + np.abs(y_pred)) / 2 + epsilon
    # Избегаем деления на ноль
    return 100 * np.mean(numerator / denominator)

# Пример
actual = np.array([120, 200, 300, 0, 500])
forecast = np.array([100, 210, 290, 5, 450])

print(f"sMAPE: {smape(actual, forecast):.2f}%")
# Вывод: sMAPE: 6.15%

Применение: Широко используется в задачах прогнозирования (например, продаж, нагрузки), особенно в бизнес-аналитике, где важна интерпретируемость в процентах.

Ответ 18+ 🔞

Слушай, вот есть такая штука — sMAPE. Это, блядь, симметричная средняя абсолютная процентная ошибка. По сути, это прокачанная версия обычного MAPE, которую придумали, чтобы решить его главные косяки: там, где MAPE начинает ебать копытом и орать как резаный, когда реальные значения около нуля, или несправедливо наказывает за переоценку, sMAPE пытается быть более адекватной.

Формула (та, которую все обычно юзают): sMAPE = (100% / n) * Σ ( |y_true - y_pred| / ((|y_true| + |y_pred|) / 2) )

Или, если по-простому: sMAPE = (200% / n) * Σ ( |y_true - y_pred| / (|y_true| + |y_pred|) )

Что означают циферки:

  • 0% — это просто сказка, угадал в точку, как в лотерею выиграл.
  • А вот если твои прогнозы — это пиздец полный, особенно когда знаки у факта и прогноза разные, то метрика может подползти аж к 200%. Ёперный театр, да?

Чем она круче обычного MAPE:

  1. Симметричная, сука: ей похуй, переоценил ты или недооценил — штрафует одинаково, по-честному.
  2. Не паникует на нулях: знаменатель (|y_true| + |y_pred|) не схлопнется в ноль, если только оба значения не нули одновременно. Уже легче.

Но и тут, конечно, не без ложки дёгтя:

  • Если и реальное значение, и прогноз — оба нули, то опять неопределённость, ёклмн. Хуй с горы.
  • Умные дядьки в статьях пишут, что она тоже не идеально симметрична и может немного косячить. Доверия ебать ноль к идеальным метрикам.

Пример на Python, чтобы было понятно:

import numpy as np

def smape(y_true, y_pred):
    """Вычисляет sMAPE в процентах."""
    # Добавляем крошечное число для подстраховки, чтобы совсем не словить деление на ноль
    epsilon = 1e-8
    numerator = np.abs(y_pred - y_true)
    denominator = (np.abs(y_true) + np.abs(y_pred)) / 2 + epsilon
    # Считаем среднее по всем наблюдениям
    return 100 * np.mean(numerator / denominator)

# Допустим, были такие данные
actual = np.array([120, 200, 300, 0, 500])
forecast = np.array([100, 210, 290, 5, 450])

print(f"sMAPE: {smape(actual, forecast):.2f}%")
# Вывод: sMAPE: 6.15%

Где это всё применяют? Да везде, где нужно прогнозировать что-то и потом понятно объяснить ошибку в процентах — продажи, трафик, нагрузку на сервера. В бизнесе её любят, потому что проценты — это хоть как-то можно в отчетах начальству показать, не стыдно.