Какие метрики можно применить на разбалансированных классах?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Метрики для разбалансированных классов
Когда в датасете классы распределены неравномерно (например, 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 кривая для выбора оптимального порога.