← Назад к вопросам

Приведи примеры несимметричных метрик

2.3 Middle🔥 142 комментариев
#Машинное обучение#Метрики и оценка моделей

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Примеры несимметричных метрик в машинном обучении

Несимметричные метрики — это метрики, которые по-разному штрафуют ошибки предсказания в зависимости от направления отклонения (выше или ниже истинного значения). Они критичны в задачах, где некоторые типы ошибок имеют разные последствия.

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)
# Перепредсказание штрафуется слабее (хорошо, если позже)

Когда использовать несимметричные метрики

  1. Разные стоимости ошибок: недопредсказание стоит X, перепредсказание стоит Y
  2. Несбалансированные классы: Focal Loss для редких классов
  3. Временные ряды: штрафуем недопредсказание (спрос) больше
  4. Квантильная регрессия: предсказываем интервалы, не точки
  5. Медицина/безопасность: false negative опаснее false positive

Итог

Несимметричные метрики — это инструмент, который кодирует бизнес-логику в функцию ошибки. Выбор метрики зависит от того, какая ошибка дороже для вашей задачи. Всегда выбирай метрику, соответствующую реальным последствиям ошибок предсказания.

Приведи примеры несимметричных метрик | PrepBro