Ответ
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:
- Симметричность: одинаково штрафует за переоценку и недооценку.
- Устойчивость к нулям: знаменатель
(|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:
- Симметричная, сука: ей похуй, переоценил ты или недооценил — штрафует одинаково, по-честному.
- Не паникует на нулях: знаменатель
(|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%
Где это всё применяют? Да везде, где нужно прогнозировать что-то и потом понятно объяснить ошибку в процентах — продажи, трафик, нагрузку на сервера. В бизнесе её любят, потому что проценты — это хоть как-то можно в отчетах начальству показать, не стыдно.