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

Какие метрики можно применить на разбалансированных классах?

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

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

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

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

Метрики для разбалансированных классов

Когда в датасете классы распределены неравномерно (например, 99% мошенничества нет, 1% мошенничество), стандартные метрики вроде accuracy становятся бесполезны. Модель может просто предсказывать "нет мошенничества" для всех и получить 99% accuracy. Нужны специализированные метрики.

Проблема стандартной accuracy

from sklearn.metrics import accuracy_score

y_true = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
y_pred = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

acc = accuracy_score(y_true, y_pred)

1. Precision и Recall

Фундаментальные метрики:

Precision = TP / (TP + FP)
Recall = TP / (TP + FN)

from sklearn.metrics import precision_score, recall_score
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)

Precision — из всех предсказанных положительных, сколько верных? Recall — из всех реальных положительных, сколько поймали?

2. F1-score

Гармоническое среднее precision и recall:

F1 = 2 * (Precision * Recall) / (Precision + Recall)
from sklearn.metrics import f1_score
f1 = f1_score(y_true, y_pred)

Когда использовать: когда нужен один number, обе метрики примерно одинаково важны.

3. Weighted F1 и Macro F1

Для мультиклассовой классификации:

from sklearn.metrics import f1_score
f1_weighted = f1_score(y_true, y_pred, average=weighted)
f1_macro = f1_score(y_true, y_pred, average=macro)
f1_micro = f1_score(y_true, y_pred, average=micro)

Macro F1 лучше отражает производительность на редком классе.

4. ROC-AUC

Использует все пороги классификации:

from sklearn.metrics import roc_auc_score, roc_curve
y_proba = model.predict_proba(X)[:, 1]
auc = roc_auc_score(y_true, y_proba)
fpr, tpr, thresholds = roc_curve(y_true, y_proba)

Интерпретация: вероятность того, что положительный пример модель оценит выше, чем отрицательный. Диапазон: от 0.5 (случайное) до 1.0 (идеально).

5. PR-AUC (Precision-Recall AUC)

from sklearn.metrics import precision_recall_curve, auc
precision, recall, thresholds = precision_recall_curve(y_true, y_proba)
pr_auc = auc(recall, precision)

Когда использовать: когда False Positive дорогостоящий. Важно: PR-AUC часто лучше чем ROC-AUC для сильно несбалансированных данных!

6. Cohens Kappa

Учитывает случайное угадывание:

from sklearn.metrics import cohen_kappa_score
kappa = cohen_kappa_score(y_true, y_pred)

Интерпретация: от -1 (плохое согласие) до 1 (идеальное).

7. Matthews Correlation Coefficient (MCC)

Единственная метрика, одинаково наказывающая все типы ошибок:

from sklearn.metrics import matthews_corrcoef
mcc = matthews_corrcoef(y_true, y_pred)

Диапазон: от -1 до +1. Лучше справляется с дисбалансом, чем F1.

8. Confusion Matrix

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_true, y_pred)
TN, FP, FN, TP = cm.ravel()
sensitivity = TP / (TP + FN)
specificity = TN / (TN + FP)

Sensitivity = Recall (доля положительных найденных) Specificity (доля отрицательных правильно классифицирована)

9. Threshold-dependent метрики

Для вероятностных моделей можно менять порог:

from sklearn.metrics import precision_recall_curve
import numpy as np

precision, recall, thresholds = precision_recall_curve(y_true, y_proba)
idx = np.argmax((precision > 0.95) & (recall > 0))
optimal_threshold = thresholds[idx]

10. Класс-взвешенные метрики

Используем weights в функции потерь:

from sklearn.utils.class_weight import compute_class_weight
class_weights = compute_class_weight(
    balanced,
    classes=np.unique(y_train),
    y=y_train
)

Рекомендация по выбору метрики

  • FP дорогостоящий → Precision, PR-AUC
  • FN дорогостоящий → Recall, ROC-AUC
  • Оба одинаково важны → F1, MCC
  • Нужен baseline → Accuracy
  • Для выбора порога → PR или ROC кривая
  • Для comparison моделей → ROC-AUC или PR-AUC

Практический пример

from sklearn.metrics import (
    accuracy_score, precision_score, recall_score,
    f1_score, roc_auc_score, matthews_corrcoef
)

print(f"Accuracy: {accuracy_score(y_true, y_pred):.3f}")
print(f"Precision: {precision_score(y_true, y_pred):.3f}")
print(f"Recall: {recall_score(y_true, y_pred):.3f}")
print(f"F1: {f1_score(y_true, y_pred):.3f}")
print(f"ROC-AUC: {roc_auc_score(y_true, y_pred_proba):.3f}")
print(f"MCC: {matthews_corrcoef(y_true, y_pred):.3f}")

Итог

НИКОГДА не используй accuracy для несбалансированных данных! Выбирай: F1 или MCC для простого верного решения, ROC-AUC для ranking задач, PR-AUC для когда false positives критичны, Precision/Recall + PR кривая для выбора оптимального порога.