Kompromis między precyzją a czułością
W zadaniach klasyfikacji często pojawia się pojęcie kompromisu między precyzją a czułością (Precision-Recall trade-off). Skąd się bierze?
Zwykle dokument przypisuje się do klasy o najwyższym prawdopodobieństwie. Ale co, jeśli to maksymalne prawdopodobieństwo wynosi zaledwie 0.1? Czy warto przypisywać dokument do danej klasy przy zaledwie 10-procentowej pewności?
Odpowiedź zależy od konkretnego problemu. Można wprowadzić minimalny próg akceptacji klasyfikacji – zmieniając go, wartości precyzji i czułości przesuwają się w przeciwnych kierunkach.
Zmienne y_true i model model są już wczytane. Jeśli prawdopodobieństwo jest niższe od progu, dokument zostanie przypisany do DEFAULT_CLASS (przyjęto klasę 2).
To ćwiczenie jest częścią kursu
Rekurencyjne sieci neuronowe (RNN) do modelowania języka w Keras
Instrukcje do ćwiczenia
- Użyj metody
.predict(), aby uzyskać prawdopodobieństwa dla każdej klasy, i zapisz je w zmiennejpred_probabilities. - Zaakceptuj maksymalne prawdopodobieństwo tylko wtedy, gdy jest ono większe lub równe
0.5, i zapisz wyniki w zmiennejy_pred_50. - Użyj funkcji
np.argmax()inp.max(), aby wykonać to samo dla progu równego0.8. - Wyświetl zmienną
trade_offze wszystkimi metrykami.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# Get probabilities for each class
pred_probabilities = model.____(X_test)
# Thresholds at 0.5 and 0.8
y_pred_50 = [np.argmax(x) if np.max(x) >= ____ else DEFAULT_CLASS for x in pred_probabilities]
y_pred_80 = [np.____(x) if np.____(x) >= 0.8 else DEFAULT_CLASS for x in pred_probabilities]
trade_off = pd.DataFrame({
'Precision_50': precision_score(y_true, y_pred_50, average=None),
'Precision_80': precision_score(y_true, y_pred_80, average=None),
'Recall_50': recall_score(y_true, y_pred_50, average=None),
'Recall_80': recall_score(y_true, y_pred_80, average=None)},
index=['Class 1', 'Class 2', 'Class 3'])
____