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

Ответ

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 часто используется как более сбалансированная альтернатива, особенно в задачах прогнозирования, где нет явного перекоса в сторону занижения или завышения.

Ответ 18+ 🔞

Так, слушай, разберёмся с этими вашими MAPE и sMAPE, а то голова пухнет. Представь, что ты пытаешься угадать, сколько я выпью пива за вечер. Угадал 5 банок, а я на самом деле выпил 4. Ошибка-то есть, но как её в цифрах выразить, да ещё и красиво?

Вот тут на сцену вылезает MAPE, или, по-нашему, «Средняя абсолютная процентная ошибка». Суть простая, как три копейки: он берёт, смотрит, насколько твой прогноз от факта отклонился, делит это всё на сам факт (чтобы в проценты перевести), по модулю берёт (чтобы минусы не путали), усредняет — и вуаля. Формула его — (100% / n) * Σ |(Факт - Прогноз) / Факт|. Говорит тебе, в среднем на сколько процентов ты проебался.

Но чувак, у него два косяка, просто пиздец каких жирных.

  1. Асимметрия. Он нихуя не справедливый. Если ты занизил прогноз (сказал 3 банки, а я 4 выпил), он тебя так отшлёпает! А если завысил (сказал 5, а я 4), он отнесётся снисходительнее. Потому что в знаменателе у него всегда факт. Непорядок, ёпта.
  2. Нули. Если в данных попадётся ноль (я, например, в тот день не пил вообще, факт = 0), то MAPE просто накрывается медным тазом. Делить на ноль нельзя, вот и вся математика. Программа твоя ругнётся, и правильно сделает.

А теперь его младший, но более хитрожопый брат — sMAPE (Симметричная MAPE). Этот уже не так прост. Формула у него мудрёнее: (200% / n) * Σ |Прогноз - Факт| / (|Прогноз| + |Факт|). Он ошибку делит не просто на факт, а на сумму модулей прогноза и факта. Идея в чём? Сделать метрику симметричной, чтобы и за завышение, и за занижение бил одинаково.

Преимущество налицо — асимметрию убрали, молодец. Но и недостаток есть, ядрёна вошь. Если и факт, и прогноз оба близки к нулю (скажем, 1 и 1), то знаменатель формулы — маленький, и ошибка взлетает до небес, даже если ты, по сути, угадал. Волнение ебать, честно.

Короче, вывод:
MAPE — это как старый, понятный, но слегка кривой инструмент. Все его знают, но он может накосячить с нулями и несправедливо оценивать.
sMAPE — это попытка сделать всё по-честному и симметрично. Его часто юзают, когда хотят более сбалансированной картины. Но помни про его прыть на маленьких числах.

Вот тебе код на 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}%")

Запустишь — увидишь два разных числа. Теперь ты в теме. Выбирай метрику с умом, а не просто потому, что название красивое.