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

Какие знаешь методы агрегации мультиклассовых метрик?

2.0 Middle🔥 171 комментариев
#Метрики и оценка моделей#Статистика и A/B тестирование

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

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

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

Методы агрегации мультиклассовых метрик

Контекст

В бинарной классификации есть одна метрика precision, recall, f1. В мультиклассовой задаче (3+ класса) нужно агрегировать метрики по всем классам. Есть несколько подходов.

1. Макро-агрегация (Macro)

Суть: берём среднее арифметическое метрик каждого класса, игнорируя дисбаланс классов.

from sklearn.metrics import precision_score, recall_score, f1_score

# Случай: 100 samples класса A, 10 samples класса B
y_true = [0]*100 + [1]*10
y_pred = [0]*98 + [1]*2 + [1]*8 + [0]*2

# Macro: просто среднее
macro_precision = precision_score(y_true, y_pred, average='macro')
macro_recall = recall_score(y_true, y_pred, average='macro')
macro_f1 = f1_score(y_true, y_pred, average='macro')

# precision_class_0 = 98/100 = 0.98
# precision_class_1 = 8/10 = 0.80
# macro_precision = (0.98 + 0.80) / 2 = 0.89

Плюсы:

  • Равное внимание ко всем классам
  • Выявляет проблемы с редкими классами
  • Честна для несбалансированных данных

Минусы:

  • Не отражает реальную производительность на данных
  • Редкие классы доминируют в метрике

2. Микро-агрегация (Micro)

Суть: агрегируем на уровне предсказаний, учитывая дисбаланс классов.

# Micro: одна большая матрица ошибок для всех классов
micro_precision = precision_score(y_true, y_pred, average='micro')
micro_recall = recall_score(y_true, y_pred, average='micro')
micro_f1 = f1_score(y_true, y_pred, average='micro')

# micro precision = total_tp / total_predicted_positive
# micro recall = total_tp / total_actual_positive
# Для мультикласса: recall_micro = precision_micro = accuracy

Плюсы:

  • Отражает реальную производительность
  • Большие классы доминируют (как и должны)
  • Для recall = accuracy

Минусы:

  • Не видит проблемы с редкими классами
  • Может скрывать худые результаты

3. Взвешенная агрегация (Weighted)

Суть: среднее с весами, пропорциональными размеру класса.

# Weighted: каждый класс — с его весом (доля в данных)
weighted_precision = precision_score(y_true, y_pred, average='weighted')
weighted_f1 = f1_score(y_true, y_pred, average='weighted')

# Вес класса 0 = 100/110 ≈ 0.91
# Вес класса 1 = 10/110 ≈ 0.09
# weighted_precision = 0.98*0.91 + 0.80*0.09 ≈ 0.97

Плюсы:

  • Честная для несбалансированных данных
  • Отражает реальный вес классов
  • Компромисс между macro и micro

Минусы:

  • Может скрывать проблемы редких классов

4. Матрица ошибок + Per-class метрики

from sklearn.metrics import classification_report, confusion_matrix

print(classification_report(y_true, y_pred))
#              precision    recall  f1-score   support
#            0       0.98      0.98      0.98       100
#            1       0.80      0.80      0.80        10
#     accuracy                           0.97       110
#    macro avg       0.89      0.89      0.89       110
# weighted avg       0.97      0.97      0.97       110

Плюсы:

  • Полная информация по каждому классу
  • Видишь реальные проблемы
  • Лучший способ анализировать результаты

5. OvR (One-vs-Rest) и OvO (One-vs-One)

# OvR: n бинарных классификаторов (класс vs остальные)
from sklearn.preprocessing import label_binarize

f1_ovr = f1_score(y_true, y_pred, average='macro')  # уже OvR по умолчанию

# OvO: n*(n-1)/2 бинарных (класс A vs класс B)
# Чаще в SVM, но можно и для метрик

Практический выбор

# Сбалансированные классы → любой
f1_macro = f1_score(y_true, y_pred, average='macro')

# Несбалансированные классы → micro или weighted
f1_weighted = f1_score(y_true, y_pred, average='weighted')
f1_micro = f1_score(y_true, y_pred, average='micro')

# Хочешь видеть проблемы редких классов → macro
# Хочешь реальную accuracy → micro
# Хочешь компромисс → weighted

Сравнительная таблица

МетодБалансРедкие классыРеальностьКогда
MacroИгнорируетВидит ✓НетДисбаланс опасен
MicroУчитываетСкрывает ✗Да ✓Нужна реальная accuracy
WeightedУчитываетВидит ⚠️Да ✓Компромисс
Per-class-Все видишь ✓Да ✓Анализ

Вывод

В боевых условиях:

  1. Всегда смотри classification_report() — видишь всё
  2. Для одной метрики:
    • Дисбаланс опасен → weighted
    • Нужна реальность → micro
    • Нужна честность → macro
  3. Выбирай в зависимости от бизнес-целей: штрафуешь ошибки редких классов → macro, штрафуешь реальные ошибки → weighted