Условие
Multi-class классификатор: 5 классов, 60% accuracy. Это много или мало? Какую метрику использовать?
Решение
Подход
Accuracy 60% сам по себе не информативен — зависит от baseline (a) доли majority class, (b) baseline random.
Cohen's kappa:
κ = (p_o − p_e) / (1 − p_e)
p_o — observed agreement (accuracy), p_e — expected agreement под случайностью.
κ = 1: идеально.κ = 0: не лучше случайности.κ < 0: хуже случайности (есть!).
Интерпретация (Landis-Koch):
| κ | Согласие |
|---|---|
| 0.81–1.00 | almost perfect |
| 0.61–0.80 | substantial |
| 0.41–0.60 | moderate |
| 0.21–0.40 | fair |
| 0.00–0.20 | slight |
Реализация
from sklearn.metrics import cohen_kappa_score, confusion_matrix
import numpy as np
# Простой случай
kappa = cohen_kappa_score(y_true, y_pred)
# Quadratic weighted kappa (для ordinal классов)
kappa_q = cohen_kappa_score(y_true, y_pred, weights='quadratic')p_e считается как сумма произведений marginal распределений:
def kappa_manual(y_true, y_pred, n_classes):
cm = confusion_matrix(y_true, y_pred)
n = cm.sum()
p_o = np.trace(cm) / n
p_e = sum((cm[i].sum()/n) * (cm[:,i].sum()/n) for i in range(n_classes))
return (p_o - p_e) / (1 - p_e)Quadratic weighted kappa
Для ordinal классификации (например, оценки 1-5): ошибка «4 vs 5» легче, чем «1 vs 5». Веса:
w_{ij} = ((i − j) / (K − 1))²
Используется в Kaggle (Diabetic Retinopathy, Asthma).
Multi-class альтернативы
- Macro-F1: среднее F1 по классам, равный вес каждому.
- Weighted-F1: взвешенное по поддержке.
- MCC multiclass: обобщение MCC.
- Balanced accuracy: среднее recall по классам.
Подводные камни
- На сильно imbalanced (90% majority) accuracy 90% = baseline. Kappa = 0. Используйте kappa или balanced accuracy.
- Kappa чувствителен к prevalence — на двух датасетах с разным class balance не сравним напрямую.
- Weighted kappa требует ordinal классов; на nominal не имеет смысла.
- Cohen's vs Fleiss's kappa: Cohen на 2 разметчика (или предсказание vs label), Fleiss — на много.
- Kappa может быть отрицательным — модель систематически предсказывает не то.
Эталонный ответ
Cohen's κ = (p_o − p_e)/(1 − p_e) корректирует accuracy на случайное согласие. >0.6 — хорошо. Для ordinal классов — quadratic weighted kappa. На imbalanced лучше чем raw accuracy. Не сравним между датасетами с разным prevalence.