Почему метрика MAPE ассиметрична?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Почему метрика MAPE асимметрична
MAPE (Mean Absolute Percentage Error) — одна из популярных метрик для оценки регрессионных моделей, но она имеет фундаментальное математическое свойство асимметрии, которое часто приводит к неправильной интерпретации результатов и неожиданному поведению при сравнении моделей.
Формула MAPE
MAPE = (1/n) * Σ|y_true - y_pred| / |y_true| * 100%
Делитель — это истинное значение, а не среднее или предсказанное.
Математическая природа асимметрии
Асимметрия возникает из-за того, что знаменатель берётся только из реальных данных (y_true). Рассмотрим простой пример:
Сценарий 1: Недопредсказание
y_true = 100
y_pred = 50
ошибка = |100 - 50| / |100| = 50/100 = 0.50 = 50%
Сценарий 2: Перепредсказание на то же значение
y_true = 100
y_pred = 150
ошибка = |100 - 150| / |100| = 50/100 = 0.50 = 50%
Ока выглядят симметричными, но проблема проявляется в обратных случаях:
Сценарий 3: Перепредсказание в 2 раза
y_true = 100
y_pred = 200
ошибка = |100 - 200| / |100| = 100/100 = 1.00 = 100%
Максимум = 100%
Сценарий 4: Недопредсказание в 2 раза (максимальная ошибка)
y_true = 100
y_pred = 0
ошибка = |100 - 0| / |100| = 100/100 = 1.00 = 100%
Максимум = 100%
Сценарий 5: Предсказание = 0 (выше нельзя!)
y_true = 100
y_pred = -100
ошибка = |100 - (-100)| / |100| = 200/100 = 2.00 = 200%
Может быть > 100%!
Главная проблема: ограничение сверху
Минимальная ошибка = 0% (идеальное предсказание) Максимальная ошибка = +∞ (без верхнего предела!)
При перепредсказании можно получить ошибку в 100%, 200%, 1000% и больше:
import numpy as np
y_true = [100, 200, 50]
y_pred = [50, 1000, 25] # Второе значение сильно перепредсказано
mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100
# MAPE будет искажена большой ошибкой на втором значении
Практический пример асимметрии
Модель A: всегда предсказывает значение в 2 раза больше
y_true = [100, 200, 300]
y_pred = [200, 400, 600]
MAPE = (100/100 + 200/200 + 300/300) / 3 * 100 = 100%
Модель B: всегда предсказывает значение в 2 раза меньше
y_true = [100, 200, 300]
y_pred = [50, 100, 150]
MAPE = (50/100 + 100/200 + 150/300) / 3 * 100 = 50%
Модель B выглядит лучше, хотя обе допускают одинаковую систематическую ошибку в 2 раза!
Почему асимметрия критична
- Недопредсказание наказывается слабее — если true = 100, а pred = 0, максимум 100%
- Перепредсказание наказывается сильнее — если true = 100, а pred = 1000, это 900%!
- Невозможно сравнивать модели — если одна overestimates, другая underestimates
- Проблема с нулевыми значениями — если y_true = 0, формула не определена
Когда MAPE неприменима
- Близко к нулю значения — MAPE взлетает
- Нулевые значения — деление на ноль
- Смешанные знаки данных — асимметрия усугубляется
- Временные ряды — особенно близко к нулю
y_true = [0.1, 0.2, 0.5]
y_pred = [0.15, 0.25, 0.55]
MAPE = (0.05/0.1 + 0.05/0.2 + 0.05/0.5) / 3 * 100
= (50% + 25% + 10%) / 3 = 28.3%
# Высокая ошибка для точных предсказаний!
Альтернативы
-
SMAPE (Symmetric Mean Absolute Percentage Error)
SMAPE = (1/n) * Σ|y_true - y_pred| / (|y_true| + |y_pred|) / 2 * 100%- Более симметрична
- Диапазон: 0-100%
-
MASE (Mean Absolute Scaled Error) — симметричная, адаптивная
-
MAE/RMSE — просто используй абсолютные ошибки без процентов
-
RMSPE (Root Mean Squared Percentage Error) — менее асимметрична
Вывод
MAPE асимметрична из-за математической структуры: ошибка в процентах от true значения. Это означает:
- Недопредсказание: максимум ~100%
- Перепредсказание: без верхнего предела
В production используй SMAPE для симметрии или просто MAE/RMSE для простоты и надёжности.