Metryki w klasyfikacji binarnej¶
Ten dokument opisuje najczęściej stosowane metryki w klasyfikacji binarnej, ich znaczenie, sposób obliczania oraz interpretację nietypowych wartości (np. duży accuracy przy złym logloss). Celem jest ułatwienie zrozumienia wyników modelu i ich potencjalnych implikacji (np. przetrenowanie, zła kalibracja, niezrównoważone dane).
Macierz pomyłek (Confusion Matrix)¶
Macierz pomyłek to podstawowy sposób wizualizacji działania modelu klasyfikacyjnego:
| Predykcja: 0 (negatywna) | Predykcja: 1 (pozytywna) | |
|---|---|---|
| Prawda: 0 | TN – True Negative | FP – False Positive |
| Prawda: 1 | FN – False Negative | TP – True Positive |
Na podstawie tej macierzy obliczamy większość metryk klasyfikacyjnych.
Kluczowe metryki¶
1. Accuracy (dokładność)¶
- Opis: Procent poprawnie sklasyfikowanych przykładów.
- Wzór:
$$ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} $$ - Uwagi: Może być mylące w przypadku niezrównoważonych danych, więc trzeba uważać z jego stosowaniem.
2. Precision (precyzja)¶
- Opis: Mierzy jak wiele pozytywnych predykcji jest poprawnych.
- Wzór: $$ \text{Precision} = \frac{TP}{TP + FP} $$
- Zastosowanie: Minimalizacja fałszywych alarmów.
3. Recall (czułość)¶
- Opis: Jak wiele rzeczywistych pozytywnych przykładów zostało wykrytych?
- Wzór:$$ \text{Recall} = \frac{TP}{TP + FN} $$
- Zastosowanie: Minimalizacja pominięć (FN).
4. F1 Score¶
- Opis: Metryka która mierzy dokładność modelu balansując precyzję i czułość.
- Wzór:$$ F1 = 2 \cdot \frac{Precision \cdot Recall}{Precision + Recall} $$
- Zalety: Równoważy precyzję i czułość.
5. Log Loss (Logarithmic Loss)¶
- Opis: Miara różnicy między przewidywanymi prawdopodbieństwami a rzeczywistymi wartościami przy klasyfikacji.
- Wzór:$$ \text{LogLoss} = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(p_i) + (1 - y_i) \log(1 - p_i)] $$
- Zalety: Uwzględnia skalibrowanie predykcji (pewność modelu).
- Wysoki logloss + dobre accuracy: wskazuje na złą kalibrację modelu.
6. AUC - ROC¶
- Opis: Prawdopodobieństwo, że model prawidłowo rozróżni klasę pozytywną od negatywnej. AUC to pole pod krzywą ROC.
- Wzór:$$ \text{AUC} = \int_{0}^{1} TPR(FPR) \, dFPR $$
- Interpretacja:
- 0.5 = klasyfikator losowy
- 1.0 = idealny
- Zalety: Niezależna od progu, odporna na niezbalansowane dane.
7. Brier Score¶
- Opis: Mierzy średni kwadratowy błąd między przewidywanym prawdopodobieństwem a etykietą.
- Wzór:$$ \text{Brier Score} = \frac{1}{N} \sum_{i=1}^N (p_i - y_i)^2 $$
- Zakres: od
0.0(idealnie skalibrowany) do1.0(kompletnie błędny). - Zastosowanie:
- Ocena kalibracji modeli probabilistycznych.
- Mniej agresywny niż log loss – nie karze tak bardzo za wysoką pewność błędnej predykcji.
- Uwaga: niski Brier Score sugeruje dobre skalibrowanie predykcji, nawet jeśli
accuracyjest przeciętne.
Typowe przypadki i interpretacje¶
| Sytuacja | Możliwa interpretacja |
|---|---|
| Wysokie Accuracy + Wysoki LogLoss | Dobre klasy, zła kalibracja (niepewność predykcji). |
| Niska Precision, wysoka Recall | Dużo wykrytych przypadków, ale też wiele fałszywych alarmów. |
| Wysoki F1, niski AUC | Model działa dobrze przy danym progu, ale globalnie słabo rozróżnia klasy. |
| Niski LogLoss, niski Accuracy | Model pewny siebie, ale często się myli – może sugerować źle dobrane cechy lub próg. |
| Różnice między trenowaniem a walidacją | Możliwe przetrenowanie modelu. |
Przykład praktyczny¶
Załóżmy że model został przetestowany na 1000 przykładach:
| Predykcja: 0 | Predykcja: 1 | |
|---|---|---|
| Prawda: 0 | 850 (TN) | 50 (FP) |
| Prawda: 1 | 40 (FN) | 60 (TP) |
Obliczone metryki:¶
- Accuracy = 91%
- Precision ≈ 54.5%
- Recall = 60%
- F1 Score ≈ 0.57
- LogLoss – zakładamy wysoki z powodu niepewnych predykcji
- AUC – umiarkowany
Wniosek: Model dobrze przewiduje klasy, ale ma złą kalibrację – wskazane użycie wykresu kalibracji i ewentualna korekta (np. Platt scaling).
Kod: obliczanie metryk i wizualizacji (Python + scikit-learn)¶
import numpy as np
from sklearn.metrics import (
accuracy_score,
precision_score,
recall_score,
f1_score,
log_loss,
roc_auc_score,
confusion_matrix,
ConfusionMatrixDisplay,
calibration_curve,
)
import matplotlib.pyplot as plt
# Przykładowe dane
y_true = np.array([0]*850 + [0]*50 + [1]*40 + [1]*60) # 1000 przykładów
y_pred = np.array([0]*850 + [1]*50 + [0]*40 + [1]*60) # binarne predykcje
# Probabilistyczne predykcje (symulacja niepewności)
y_prob = np.concatenate([
np.random.uniform(0.1, 0.4, 850), # TN
np.random.uniform(0.6, 0.9, 50), # FP
np.random.uniform(0.1, 0.4, 40), # FN
np.random.uniform(0.6, 0.9, 60), # TP
])
# Obliczanie metryk
print("Accuracy:", accuracy_score(y_true, y_pred))
print("Precision:", precision_score(y_true, y_pred))
print("Recall:", recall_score(y_true, y_pred))
print("F1 Score:", f1_score(y_true, y_pred))
print("Log Loss:", log_loss(y_true, y_prob))
print("ROC AUC:", roc_auc_score(y_true, y_prob))
# Macierz pomyłek
cm = confusion_matrix(y_true, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot(cmap=plt.cm.Blues)
plt.title("Confusion Matrix")
plt.show()
# Krzywa kalibracji
prob_true, prob_pred = calibration_curve(y_true, y_prob, n_bins=10)
plt.figure(figsize=(6, 6))
plt.plot(prob_pred, prob_true, marker='o', label='Model')
plt.plot([0, 1], [0, 1], linestyle='--', color='gray', label='Ideal Calibration')
plt.title('Calibration Curve')
plt.xlabel('Średnie przewidywane prawdopodobieństwo')
plt.ylabel('Rzeczywisty odsetek klasy 1')
plt.legend()
plt.grid()
plt.show()