← Назад к вопросам
Какие знаешь методы агрегации мультиклассовых метрик?
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 | - | Все видишь ✓ | Да ✓ | Анализ |
Вывод
В боевых условиях:
- Всегда смотри
classification_report()— видишь всё - Для одной метрики:
- Дисбаланс опасен → weighted
- Нужна реальность → micro
- Нужна честность → macro
- Выбирай в зависимости от бизнес-целей: штрафуешь ошибки редких классов → macro, штрафуешь реальные ошибки → weighted