Когда у вас сильно несбалансированный набор данных с 95% примеров в одном классе и 5% в другом, стандартные метрики, такие как accuracy (точность), становятся неэффективными. Они могут давать высокие значения, даже если модель просто предсказывает всегда более частый класс. В таких случаях лучше использовать метрики, которые учитывают дисбаланс классов.
🟠Матрица ошибок
Дает представление о количестве истинно положительных (TP), истинно отрицательных (TN), ложно положительных (FP) и ложно отрицательных (FN) предсказаний. Это основа для вычисления многих других метрик.
from sklearn.metrics import confusion_matrix
y_true = [0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
y_pred = [0, 0, 1, 0, 0, 0, 1, 1, 1, 1]
conf_matrix = confusion_matrix(y_true, y_pred)
print(conf_matrix)
🟠Precision, Recall и F1-Score
Доля правильных предсказаний положительного класса среди всех предсказаний положительного класса.
\text{Precision} = \frac{TP}{TP + FP}Доля правильных предсказаний положительного класса среди всех реальных положительных примеров.
\text{Recall} = \frac{TP}{TP + FN}Гармоническое среднее Precision и Recall.
\text{F1-Score} = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}from sklearn.metrics import precision_score, recall_score, f1_score
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1-Score: {f1}")
🟠ROC-AUC
Измеряет качество классификатора по совокупности всех возможных порогов классификации. Это хорошо работает с несбалансированными данными, так как учитывает соотношение истинно положительных и ложноположительных сработок.
from sklearn.metrics import roc_auc_score
y_true = [0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
y_scores = [0.1, 0.4, 0.35, 0.8, 0.65, 0.7, 0.85, 0.9, 0.95, 0.98] # вероятности
roc_auc = roc_auc_score(y_true, y_scores)
print(f"ROC-AUC: {roc_auc}")
🟠Precision-Recall Curve и PR-AUC
Более информативна для несбалансированных данных, так как она лучше показывает разницу в предсказаниях для меньшего класса. PR-AUC — это площадь под кривой Precision-Recall.
from sklearn.metrics import precision_recall_curve, auc
precision, recall, _ = precision_recall_curve(y_true, y_scores)
pr_auc = auc(recall, precision)
print(f"PR-AUC: {pr_auc}")
🟠Balanced Accuracy
Это среднее значение чувствительности (Recall) для каждого класса, что делает ее более подходящей для несбалансированных данных.
from sklearn.metrics import balanced_accuracy_score
balanced_acc = balanced_accuracy_score(y_true, y_pred)
print(f"Balanced Accuracy: {balanced_acc}")
🟠Cohen's Kappa
Учитывает вероятность случайных совпадений и дает более точную оценку производительности модели на несбалансированных данных.
from sklearn.metrics import cohen_kappa_score
kappa = cohen_kappa_score(y_true, y_pred)
print(f"Cohen's Kappa: {kappa}")
Ставь 👍 и забирай 📚 Базу знаний