Приведи примеры несимметричных метрик
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Примеры несимметричных метрик в машинном обучении
Несимметричные метрики — это метрики, которые по-разному штрафуют ошибки предсказания в зависимости от направления отклонения (выше или ниже истинного значения). Они критичны в задачах, где некоторые типы ошибок имеют разные последствия.
1. MAPE (Mean Absolute Percentage Error)
Формула:
MAPE = (1/n) * Σ|y_true - y_pred| / |y_true| * 100%
Пример асимметрии:
y_true = 100
# Случай 1: предсказание 50
error_1 = |100 - 50| / 100 = 50%
# Случай 2: предсказание 200
error_2 = |100 - 200| / 100 = 100%
# Одинаковая абсолютная ошибка (50), но MAPE разная!
Почему асимметрична: При перепредсказании можно получить ошибку > 100%, при недопредсказании максимум 100%.
2. Assymetric MAPE (AMAPE)
Формула:
AMAPE = (1/n) * Σ [a * |y_true - y_pred| / y_true, если y_pred < y_true
b * |y_true - y_pred| / y_true, если y_pred > y_true]
Где a и b — разные коэффициенты штрафа.
Пример с a=1, b=2 (перепредсказание штрафуется в 2 раза):
import numpy as np
y_true = [100, 100]
y_pred = [50, 150]
# y_pred[0] < y_true[0]: штраф = 1 * |100-50|/100 = 50%
# y_pred[1] > y_true[1]: штраф = 2 * |100-150|/100 = 100%
# Асимметричные штрафы за разные типы ошибок
Реальный пример: При прогнозировании спроса на товар:
- Недопредсказание (нехватка товара): потеря продаж
- Перепредсказание (переизбыток): затраты на хранение (в 2 раза дороже!)
3. Weighted Absolute Percentage Error (WAPE)
Формула:
WAPE = Σ|y_true - y_pred| / Σ|y_true| * 100%
Асимметрия через веса:
weights = [1, 5, 2] # Разные важности
y_true = [100, 200, 150]
y_pred = [90, 300, 140]
# Каждое абсолютное отклонение взвешивается
weighted_error = weights * np.abs(y_true - y_pred)
# error[1] (200 -> 300) наказывается в 5 раз сильнее
4. Quantile Loss (Pinball Loss)
Формула:
L_q(y_true, y_pred) = (q - 1) * (y_true - y_pred), если y_true < y_pred
q * (y_pred - y_true), если y_true >= y_pred
Где q — квантиль (0 < q < 1).
Пример с q=0.9 (90-й квантиль):
def quantile_loss(y_true, y_pred, q=0.9):
errors = y_true - y_pred
return np.mean(np.where(errors > 0, q * errors, (q - 1) * errors))
y_true = [100]
y_pred = [110] # Перепредсказание
# При q=0.9:
# error = 100 - 110 = -10
# loss = (0.9 - 1) * (-10) = 1.0
# При недопредсказании на 10:
# error = 100 - 90 = 10
# loss = 0.9 * 10 = 9.0
# Недопредсказание штрафуется в 9 раз сильнее!
Практическое применение: При предсказании продаж:
- q=0.1: штрафуем недопредсказание (риск нехватки товара)
- q=0.9: штрафуем перепредсказание (риск переизбытка)
- q=0.5: обычная абсолютная ошибка
5. Weighted MAE
Формула:
WMAE = (1/n) * Σ w_i * |y_true - y_pred|
Пример:
y_true = [10, 20, 30]
y_pred = [8, 25, 25]
errors = [2, 5, 5]
# Асимметричные веса
weights_down = [1, 1, 1] # За ошибку вниз
weights_up = [5, 5, 5] # За ошибку вверх
# y_pred[0] < y_true[0]: weight = 1
# y_pred[1] > y_true[1]: weight = 5
# y_pred[2] < y_true[2]: weight = 1
wmae = (1*2 + 5*5 + 1*5) / 3 = 10.67
6. Huber Loss
Формула:
L_δ(y, ŷ) = 1/2 * (y - ŷ)², если |y - ŷ| <= δ
δ * (|y - ŷ| - 1/2 * δ), если |y - ŷ| > δ
Асимметрия в практическом применении:
import numpy as np
from sklearn.linear_model import HuberRegressor
# Данные с выбросами
y_true = [1, 2, 3, 4, 100] # Последний выброс
# Huber с разными epsilon штрафует большие ошибки по-разному
huber_gentle = HuberRegressor(epsilon=1.35) # Более мягко
huber_strict = HuberRegressor(epsilon=1.01) # Более строго
7. Log-Cosh Loss
Формула:
L(y, ŷ) = log(cosh(y - ŷ))
Примерно как MSE для маленьких ошибок, как MAE для больших.
Асимметрия: Гладкость зависит от величины ошибки, создавая неявную асимметрию в разных режимах.
8. Focal Loss (для классификации)
Формула:
FL(p_t) = -(1 - p_t)^γ * log(p_t)
Асимметрия в примере:
import numpy as np
# Асимметричный штраф за ошибочные классы
focal_loss_correct = -(1 - 0.99)^2 * log(0.99) ≈ 0.0001 # Малый штраф
focal_loss_wrong = -(1 - 0.01)^2 * log(0.01) ≈ 0.36 # Большой штраф
# Ошибки в меньшинстве наказываются сильнее
9. Pinball Loss для квантилей (пример из реальности)
Практический случай: предсказание времени доставки
# p50 (медиана)
q50_loss = quantile_loss(y_true, y_pred, q=0.5)
# p25 (оптимистичное предсказание)
q25_loss = quantile_loss(y_true, y_pred, q=0.25)
# Недопредсказание штрафуется слабее (хорошо, если рано)
# p95 (пессимистичное предсказание)
q95_loss = quantile_loss(y_true, y_pred, q=0.95)
# Перепредсказание штрафуется слабее (хорошо, если позже)
Когда использовать несимметричные метрики
- Разные стоимости ошибок: недопредсказание стоит X, перепредсказание стоит Y
- Несбалансированные классы: Focal Loss для редких классов
- Временные ряды: штрафуем недопредсказание (спрос) больше
- Квантильная регрессия: предсказываем интервалы, не точки
- Медицина/безопасность: false negative опаснее false positive
Итог
Несимметричные метрики — это инструмент, который кодирует бизнес-логику в функцию ошибки. Выбор метрики зависит от того, какая ошибка дороже для вашей задачи. Всегда выбирай метрику, соответствующую реальным последствиям ошибок предсказания.