04 · Ocena · 4 min czytania · aktualizacja
Jak czytać krzywą precyzja–recall i czym jest average precision?
W skrócie
Krzywa precyzja–recall pokazuje precyzję modelu przy każdym poziomie recall, czyli dla wszystkich progów naraz. Przy rzadkiej klasie mówi więcej niż ROC.
Co to jest
Krzywa precyzja–recall (PR curve) to wykres, na którym oś pozioma to recall, a pionowa — precyzja, a każdy punkt odpowiada jednemu progowi decyzyjnemu klasyfikatora. Zamiast oceniać model przy jednym, arbitralnym progu, pokazuje cały zakres możliwych kompromisów między wykrywaniem przypadków a unikaniem fałszywych alarmów. Pole pod tą krzywą, liczone zwykle jako average precision (AP), streszcza ją w jednej liczbie od 0 do 1.
Idealny model ma krzywą przechodzącą przez prawy górny róg: pełny recall przy pełnej precyzji. Model losowy ma krzywą płaską na wysokości równej częstości klasy pozytywnej — jeśli pozytywów jest 5%, losowe zgadywanie daje precyzję 5% przy każdym recall. To jest punkt odniesienia, z którym należy porównywać AP, a nie 0,5.
Mechanizm — dlaczego tak działa
Klasyfikator przypisuje każdemu przykładowi wynik, a my sortujemy przykłady od najwyższego do najniższego i przesuwamy próg w dół. Na początku model oznacza jako pozytywne tylko kilka najpewniejszych przypadków: recall jest mały, precyzja zwykle wysoka. Z każdym obniżeniem progu dołączamy kolejne przykłady. Jeśli dołączony jest pozytywem, rośnie recall i (zwykle) precyzja; jeśli negatywem — recall stoi, a precyzja spada. Krzywa jest więc schodkowa i niemonotoniczna, w przeciwieństwie do krzywej ROC, która zawsze rośnie.
Average precision liczy się jako AP = Σ (Rₙ − Rₙ₋₁) · Pₙ: suma precyzji w punktach, w których rośnie recall, ważona przyrostem recall. Można ją rozumieć jako średnią precyzję, jaką zobaczy ktoś, kto przegląda listę od góry i zatrzymuje się po każdym znalezionym pozytywie. Uwaga: interpolacja liniowa między punktami krzywej PR (jak przy trapezowym liczeniu pola) zawyża wynik, dlatego scikit-learn liczy AP sumą schodkową.
Dlaczego krzywa PR, skoro jest krzywa ROC? ROC zestawia recall z odsetkiem fałszywych alarmów wśród negatywów (FPR). Gdy negatywów jest bardzo dużo, nawet tysiące fałszywych alarmów to mały FPR, więc ROC wygląda dobrze. Krzywa PR mierzy fałszywe alarmy względem trafień, czyli dokładnie to, co odczuje użytkownik przeglądający alarmy. Davis i Goadrich wykazali, że obie krzywe zawierają tę samą informację o rankingu (model dominujący w ROC dominuje też w PR), ale PR znacznie wyraźniej pokazuje różnice w obszarze, który przy rzadkiej klasie ma znaczenie.
Zastrzeżenia: AP zależy od częstości klasy, więc wyników z zestawów o różnych proporcjach nie da się wprost porównywać. Krzywa ocenia tylko ranking — nie mówi, czy prawdopodobieństwa są skalibrowane. A przy małej liczbie pozytywów jest bardzo poszarpana i niestabilna.
Na przykładzie
Zbiór Breast Cancer Wisconsin, pozytyw = guz złośliwy; podział warstwowy 426/143 z random_state=0, w teście 53 złośliwe (37,1%). Regresja logistyczna na wszystkich 30 cechach ma AP = 0,994 (ROC AUC = 0,996). Krzywa trzyma precyzję 100% aż do recall 96%, a pełny recall osiąga przy precyzji 82,8% (próg około 0,12). Ten sam model na jednej cesze, średniej teksturze, ma AP = 0,672 przy linii bazowej 0,371 — wyraźnie lepiej niż losowo, ale daleko od ideału.
Aby zobaczyć, jak częstość klasy wpływa na obie miary, policzyłem wyniki modelu „tylko tekstura” z 5-krotnej walidacji krzyżowej (cross_val_predict) na całym zbiorze: ROC AUC = 0,773, AP = 0,592. Następnie 200 razy losowałem 19 guzów złośliwych i dołączałem je do wszystkich 357 łagodnych, by pozytywów było 5%. Średnie ROC AUC prawie się nie zmieniło (0,771), a AP spadło do 0,136. Model jest ten sam; zmieniła się tylko rzadkość klasy. ROC tego nie pokazuje, krzywa PR — owszem: przy 5% pozytywów większość alarmów tego modelu byłaby fałszywa.
Dane: Breast Cancer Wisconsin (diagnostyka raka piersi)
W praktyce
precision_recall_curve(y_true, scores)zwraca precyzje, recall i progi;average_precision_score(y_true, scores)— AP. Podawaj wyniki ciągłe (predict_proba[:, 1]lubdecision_function), nie etykiety.- Wykres:
PrecisionRecallDisplay.from_estimator(model, X_test, y_test); dorysuj poziomą linię na wysokości częstości klasy. - W walidacji krzyżowej:
scoring='average_precision'. - Próg operacyjny wybieraj z krzywej na zbiorze walidacyjnym, np. najwyższa precyzja przy wymaganym recall.
- Nie licz pola przez
auc(recall, precision)z interpolacją trapezową — zawyża wynik; używajaverage_precision_score. - Przy wielu klasach rysuj krzywą dla każdej klasy (jedna przeciw reszcie) i raportuj średnią AP.
Najczęstsze pytania
- Kiedy używać krzywej PR zamiast ROC?
- Gdy klasa pozytywna jest rzadka i interesuje nas jakość listy alarmów: wykrywanie oszustw, diagnostyka przesiewowa, wyszukiwanie. Przy zbliżonych proporcjach klas obie krzywe dają podobny obraz, a ROC jest łatwiejsza do porównań między zbiorami.
- Dlaczego moja krzywa PR zaczyna się nisko po lewej?
- Bo przykład z najwyższym wynikiem okazał się negatywem: przy recall bliskim zera precyzja liczona jest z jednego lub kilku przykładów i bywa skrajna. To normalne przy małych danych i nie świadczy o błędzie.
- Czy AP to to samo co pole pod krzywą PR?
- To jeden ze sposobów jego szacowania — suma schodkowa bez interpolacji. Inne metody (trapezowa, interpolowana jak w konkursach detekcji obiektów) dają nieco inne liczby, więc porównuj tylko wyniki liczone tą samą metodą.
Źródła
- Davis J., Goadrich M. (2006). The Relationship Between Precision-Recall and ROC Curves. Proceedings of the 23rd International Conference on Machine Learning (ICML).
- Saito T., Rehmsmeier M. (2015). The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets. PLOS ONE, 10(3).
- Géron A. „Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow”, 3rd ed., O’Reilly 2022, rozdz. 3 (Classification — The Precision/Recall Trade-off).
- Dokumentacja scikit-learn: Precision-Recall — https://scikit-learn.org/stable/auto_examples/model_selection/plot_precision_recall.html