ML Atlas

04 · Ocena · 4 min czytania · Interaktywne · aktualizacja

Czym różni się precyzja od recall (czułości) w klasyfikacji?

W skrócie

Precyzja mówi, jaka część alarmów modelu jest prawdziwa, a recall, jaką część prawdziwych przypadków model wykrył. Zwykle poprawa jednej psuje drugą.

Co to jest

Precyzja (precision) to odsetek przykładów oznaczonych przez model jako pozytywne, które naprawdę są pozytywne: precyzja = TP / (TP + FP). Recall (czułość, sensitivity, true positive rate) to odsetek prawdziwych pozytywów, które model wykrył: recall = TP / (TP + FN). Obie metryki skupiają się na klasie pozytywnej i ignorują prawdziwe negatywy.

Intuicja: wyobraź sobie wędkarza z siecią. Precyzja odpowiada na pytanie „ile z tego, co wyłowiłem, to ryby, a nie śmieci?”. Recall — „jaką część ryb z jeziora wyłowiłem?”. Mała sieć zarzucona tylko tam, gdzie ryby na pewno są, da wysoką precyzję i niski recall. Ogromna sieć przez całe jezioro — wysoki recall i niską precyzję.

Precyzja mówi, ile warte jest pojedyncze „tak” modelu. Recall mówi, ile przypadków nam umyka. W medycynie recall nazywa się czułością, a w wyszukiwaniu informacji — kompletnością, precyzja zaś bywa nazywana dodatnią wartością predykcyjną (PPV).

Mechanizm — dlaczego tak działa

Klasyfikator zwraca zwykle wynik ciągły (prawdopodobieństwo, odległość od granicy), a etykietę dostajemy, porównując go z progiem. Podniesienie progu sprawia, że model mówi „tak” tylko w najpewniejszych przypadkach: fałszywych alarmów ubywa (precyzja rośnie), ale część prawdziwych pozytywów spada poniżej progu (recall maleje). Obniżenie progu działa odwrotnie. Dlatego precyzja i recall są w kompromisie — każdy próg to inny punkt tej wymiany, a krzywa precyzja–recall pokazuje wszystkie naraz.

Recall zależy tylko od tego, jak model traktuje prawdziwe pozytywy, więc nie zmienia się, gdy zmienia się częstość klasy w populacji. Precyzja — przeciwnie. Gdy pozytywy są rzadkie, nawet mały odsetek fałszywych alarmów wśród ogromnej liczby negatywów przewyższa liczbę prawdziwych trafień. Test o czułości 99% i swoistości 99% przy chorobie występującej u 1 na 1000 osób ma precyzję poniżej 10%: na każdego wykrytego chorego przypada około dziesięciu zdrowych z wynikiem pozytywnym. To ten sam mechanizm co błąd ignorowania częstości bazowej.

Dlaczego te metryki, a nie trafność? Przy niezbalansowanych klasach trafność nagradza model za poprawne nazywanie licznej klasy negatywnej. Precyzja i recall patrzą tylko na klasę, która nas interesuje, więc model „zawsze nie” dostaje recall równy zero, choć jego trafność może sięgać 99%.

Zastrzeżenie: obie metryki są niepełne osobno. Recall = 100% osiąga każdy model mówiący zawsze „tak”, precyzję bliską 100% — model mówiący „tak” jeden raz, w najpewniejszym przypadku. Zawsze raportuj je razem, z progiem, przy którym je policzono.

Na przykładzie

Regresja logistyczna ze standaryzacją na zbiorze Breast Cancer Wisconsin (klasa pozytywna = guz złośliwy; 426 przykładów treningowych, 143 testowe, podział warstwowy z random_state=0). W teście jest 53 guzy złośliwe. Przy domyślnym progu 0,5 model oznaczył 51 guzów jako złośliwe i wszystkie były złośliwe: precyzja 100%, recall 96,2% (2 przeoczone nowotwory).

Obniżenie progu do 0,2: precyzja 85,2%, recall 98,1% — przeoczony już tylko jeden guz, ale 9 łagodnych oznaczonych jako złośliwe. Przy progu 0,1 recall osiąga 100%, a precyzja spada do 82,8% (11 fałszywych alarmów). W drugą stronę, przy progu 0,7 precyzja zostaje 100%, a recall spada do 88,7%: sześć przeoczeń. Model jest ten sam — zmienia się tylko decyzja, ile ryzyka przeoczenia jesteśmy gotowi wymienić na fałszywe alarmy.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: regresja logistyczna na biopsjach raka piersi: suwak progu zmienia macierz pomyłek, precision, recall i punkt na krzywej ROC.

Dane: Breast Cancer Wisconsin (diagnostyka raka piersi)

W praktyce

  • precision_score(y_true, y_pred) i recall_score(y_true, y_pred); classification_report wypisuje obie metryki dla każdej klasy.
  • Ustal, która etykieta jest pozytywna (pos_label=); w scikit-learn domyślnie jest to 1.
  • Próg zmieniaj na prawdopodobieństwach z predict_proba albo przez TunedThresholdClassifierCV (scikit-learn 1.5+), który dobiera próg walidacją krzyżową.
  • Dobór progu rób na walidacji, nie na teście — inaczej raportowana precyzja i recall są zawyżone.
  • Gdy zależy Ci na jednym z nich, ustal wymaganie i optymalizuj drugie, np. „maksymalna precyzja przy recall co najmniej 95%”.
  • Typowy błąd: raportowanie precyzji z danych zbalansowanych sztucznie (np. po SMOTE lub doborze 1:1) jako precyzji, jakiej należy się spodziewać w populacji.

Najczęstsze pytania

Co jest ważniejsze: precyzja czy recall?
Zależy od kosztów błędów. Gdy przeoczenie jest drogie (nowotwór, oszustwo, awaria), priorytetem jest recall. Gdy drogi jest fałszywy alarm (niesłusznie zablokowane konto, ważny mail w spamie), priorytetem jest precyzja.
Czym recall różni się od swoistości?
Recall to odsetek wykrytych pozytywów, swoistość — odsetek poprawnie rozpoznanych negatywów: TN / (TN + FP). Para recall–swoistość opisuje model niezależnie od częstości klas; para precyzja–recall jest bardziej wrażliwa na to, jak model radzi sobie z rzadką klasą.
Jak połączyć precyzję i recall w jedną liczbę?
Najczęściej przez miarę F1, czyli średnią harmoniczną obu. Dla oceny niezależnej od progu używa się pola pod krzywą precyzja–recall (average precision).

Źródła

  • Géron A. „Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow”, 3rd ed., O’Reilly 2022, rozdz. 3 (Classification — Precision and Recall).
  • Murphy K. P. „Probabilistic Machine Learning: An Introduction”, MIT Press 2022, rozdz. 5.1 (Bayesian decision theory — krzywe ROC i PR).
  • Sokolova M., Lapalme G. (2009). A systematic analysis of performance measures for classification tasks. Information Processing & Management, 45(4).
  • Dokumentacja scikit-learn: Precision, recall and F-measures — https://scikit-learn.org/stable/modules/model_evaluation.html#precision-recall-and-f-measures

Zobacz też