Ответ
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%
Применение: Широко используется в задачах прогнозирования (например, продаж, нагрузки), особенно в бизнес-аналитике, где важна интерпретируемость в процентах.