Ответ
MAPE и sMAPE — это метрики для оценки точности прогнозов, выраженные в процентах, но они по-разному рассчитывают ошибку.
-
MAPE (Mean Absolute Percentage Error) — Средняя абсолютная процентная ошибка.
- Формула:
MAPE = (100% / n) * Σ |(Факт - Прогноз) / Факт| - Интерпретация: Показывает, в среднем на сколько процентов наши прогнозы отклоняются от фактических значений.
- Недостатки:
- Асимметрия: Сильнее штрафует заниженные прогнозы, чем завышенные (так как знаменатель — фактическое значение).
- Проблема с нулями: Не может быть вычислен, если какое-либо фактическое значение равно нулю.
- Формула:
-
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) * Σ |(Факт - Прогноз) / Факт|. Говорит тебе, в среднем на сколько процентов ты проебался.
Но чувак, у него два косяка, просто пиздец каких жирных.
- Асимметрия. Он нихуя не справедливый. Если ты занизил прогноз (сказал 3 банки, а я 4 выпил), он тебя так отшлёпает! А если завысил (сказал 5, а я 4), он отнесётся снисходительнее. Потому что в знаменателе у него всегда факт. Непорядок, ёпта.
- Нули. Если в данных попадётся ноль (я, например, в тот день не пил вообще, факт = 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}%")
Запустишь — увидишь два разных числа. Теперь ты в теме. Выбирай метрику с умом, а не просто потому, что название красивое.