Accuracy, precision, recall, F1 – co to za czary?

Jeżeli zajmujemy się uczeniem nadzorowanym, to rozwiązujemy jakiś problem na bazie cech niezależnych i wynikających z nich cech zależnych. Nasz program „ogląda” cechy niezależne z każdej strony i próbuje stworzyć jakąś relację między nimi a cechami zależnymi. Na przykład w czasie badania wyszło, że przebadana osoba ma 1000 (jakiś) komórek w jednostce objętości i jest też chora (na coś). Zbadano także całkiem zdrową osobę i okazało się, że tych komórek ma ona 100 w takiej samej objętości. Badanie to powtórzono milion razy. Bardzo często sytuacja wyglądała podobnie: 870 – chory, 1250 – chory, 15 – zdrowy, 320 – zdrowy. Nasz program przeanalizował wszystkie te sytuacje i zaproponował podział przy wartości 550 – jeśli pacjent ma więcej, to jest chory, a jeśli mniej to jest zdrowy. Mamy więc tutaj klasyczną sytuację klasyfikacji – mamy jakieś obserwacje i będziemy starali się je sklasyfikować binarne – obserwacja będzie należeć albo do jednej, albo do drugiej grupy.

Przychodzi nasz kolega z zespołu i mówi, że użył innego algorytmu i jemu granica wyszła przy 700. Usłyszała tę rozmowę inna osoba, która pracowała z tymi danymi pół roku temu i zaśmiała się, bo jej wyszło 335. I kto tu ma rację? W sumie każdy może mieć tutaj rację. A rozbieżność może zależeć od tego, co optymalizują przy poszukiwaniu rozwiązania.

Accuracy

Jeżeli dokonuję jakiejś klasyfikacji i nie jestem na etapie szukania optymalnej metryki dotyczącej mojej sytuacji, to zdaję się na accuracy. Jest to bardzo intuicyjne podejście. Metryka ta mówi nam o stosunku dobrze dokonanych klasyfikacji do ilości wszystkich dokonanych klasyfikacji. Fajnie się wyraża w procentach i każdy ją od razu zrozumie. Ale ma też wady i jedną z nich jest sytuacja, w której mamy niezrównoważony zbiór. Jeśli w zbiorze mamy 98 przypadków „nie” i 2 „tak”, to gdy będziemy przewidywać zawsze „nie”, będziemy mieć skuteczność 98 procent. A tak naprawdę nie mamy żadnej skuteczności, bo zgubiliśmy to, czego szukaliśmy. Accuracy może być więc bardzo zwodnicze. Ale jeśli przewidujemy tylko jedną klasę, to powinniśmy się w ogóle zastanowić czy ma to jakikolwiek sens. Przyjmijmy więc, że nasz klasyfikator dokonuje następujących predykcji:

  • 95 x nie, gdzie faktycznie było nie,
  • 1 x tak, gdzie faktycznie było tak,
  • 1 x nie, gdzie faktycznie było tak,
  • 3 x tak, gdzie faktycznie było nie.

Wszystkich prawdziwych „nie” w zbiorze mamy 98, a wszystkich prawdziwych „tak” 2. Otrzymujemy więc tutaj accuracy = (95 + 1) / 100, czyli 96 procent. Niby ok, ale zgubiliśmy połowę obserwacji „tak” więc wyczuwamy tutaj dość mocno lipę.

Precision

Metryka precision mówi nam mniej więcej o tym, w jakim stopniu możemy zaufać naszym pozytywnym predykcjom w danej klasie. Jest zdefiniowana jako:

precision = \frac{tp}{tp + fp}

gdzie tp – true positive to obserwacja dobrze przypisana do analizowanej klasy, a fp – false positive to obserwacja błędnie przypisana. W przykładzie powyżej, jeśli przeanalizujemy klasę „nie” to wytypowaliśmy 96 obserwacji na „nie” (95 + 1), a poprawnie ich było (tp) 95. Otrzymujemy wyniki 95/96 = 0,989583333. Ale jeśli następnie zajmiemy się klasą „tak” to otrzymujemy 4 z predykcji (1 + 3) i 1 ze stanu faktycznego (tp). Wtedy nasze precision wynosi 1/4 = 0,25. Widzimy więc tutaj sporą rozbieżność, a średnia daje nam 0,619791667. I to już jest zdecydowanie lepsza liczba, jeśli chodzi o zaufanie, jakim możemy obdarzyć nasz model niż dana przez accuracy. Widzimy też, że jeżeli pochylamy się nad wynikami „tak” to są to w praktyce śmieci.

Recall

Koncepcja stojąca za recall jest podobna do precision, dowiadujemy się z niej jednak ile obserwacji zgubiliśmy dla danej klasy. Stosujemy tutaj następujące równanie:

recall = \frac{tp}{tp + fn}.

Jak to będzie wyglądać dla powyższego przykładu? Policzmy! Dla „nie” suma tp i fn wyniesie 95 + 3. mamy więc 95 / 98 = 0,969387755. Zajmijmy się teraz przypadkiem „tak”. Tutaj tp + fn daje 1 + 1. Mamy więc 1 / 2 = 0.5. Widzimy więc, że jeśli chodzi o namierzanie „tak” to gubimy połowę obserwacji. Średnia w tym przypadku wynosi 0,734693878.

F1

Okej, mamy więc sytuację, gdzie accuracy wyszło nam niby całkiem dobre, ale precision i recall już nie za bardzo. Widzimy, że precision i recall dają nam więcej informacji o naszym modelu, ale wciąż są to dwie liczby. Jeśli chcemy więc porównać dwa modele A i B, to mamy aż cztery możliwości: precision i recall jest lepsze w A, albo w B, albo precision jest lepsze w A ale recall jest lepsze w B, albo precision jest lepsze w B i recall w A. Pierwsze dwie sytuacje są w miarę ok, ale sytuacje mieszane już mogą napsuć nam krwi. Dlatego wymyślono więc metrykę zwaną F1, która jest średnią harmoniczną z dwóch powyższych wartości:

F1 = 2 \cdot \frac{precision \cdot recall}{precision + recall}.

W ten sposób uzyskujemy jedną liczbę (między 1 a 0, gdzie 1 jest sytuacją najlepszą), która równomiernie uwzględnia precision i recall. W naszym przypadku uzyskamy wartość około 0,67.

Po co nam to wszystko?

Po pierwsze, dostaliśmy właśnie narzędzie, które w wielu sytuacjach jest o wiele bardziej sensowne niż pierwsza metryka, która nam przychodzi na myśli, czyli accuracy. Nie zwiedzie już nas wysoka jej wartość, która jak się okazuje, może taka być, nawet gdy nasz model jest słaby.

Po drugie, to narzędzie, a raczej dwie składowe w postaci precision i recall dają nam dokładniejszy wgląd w typy błędów, które popełnia nasz model. Precision mówi nam, jak mocne są nasze predykcje – czyli czy przypadkiem nie bierzemy ze sobą za dużo pomyłek. Recall mówi nam zaś, ile predykcji nam ucieka. Takiej informacji nijak nie dostaniemy z accuracy.

Po trzecie, wartości te wyliczamy dla poszczególnych klas. A to już pozwala nam optymalizować potencjalne rozwiązanie problemu w zależności od kosztów związanych z tymi klasami. Wyobraźmy sobie taką (być może nieetyczną) sytuację. Powyższy przykład i modele, które dla niego tworzymy, chcemy zastosować w naszej klinice. Możemy przyjąć tutaj na przykład dwie strategie. Pierwsza strategia polega na „U nas na pewno dowiesz się, jeśli jesteś chory”. Czyli zależy nam na tym, żeby żadne „tak” nam nie uciekło. Będziemy więc tak optymalizować modele, żeby recall dla „tak” było, jak najwyższe. Oczywiście możemy zawsze mówić „tak”, wtedy to recall będzie równe 1. Musimy więc wprowadzić dalsze kryteria – ale tak czy siak, będzie to dla nas metryka do najdokładniejszego monitorowania. Nasza klinika może też przyjąć strategię, że „nie wyrzucamy pieniędzy w błoto” – czyli dążymy do prawidłowego namierzenia jak największej liczby „tak” żeby ich od razu leczyć. Nie chcemy więc brać zdrowych pacjentów. Wtedy będziemy maksymalizować precision dla „tak”. Będziemy takich predykcji dawać mało – pewnie przy bardzo wysokim progu prawdopodobieństwa przynależności do tej grupy. Dane mamy niby takie same, ale rozwiązania mogą być diametralnie różne.

Podsumowanie

Wraz ze zbieraniem doświadczenia w uczeniu maszynowym uczymy się budowania coraz to różniejszych modeli. Nie powinniśmy jednak zapominać o rozszerzaniu swojego zbioru narzędzi o kolejne metryki. Modele, które będziemy budować, będą optymalizować jakieś „wewnętrzne” funkcje, jednakże na końcu będziemy je oceniać przy pomocy metryk. Jeżeli dobierzemy nieodpowiednią metrykę, to będziemy mieli świetne rozwiązanie problemu, który nas nie interesuje.

Jeśli interesuje Cię jakiś temat – nie musi być związany z tym artykułem – to zostaw mi sygnał tutaj. Dzięki!

5 1 vote
Article Rating
Subscribe
Powiadom o
guest

6 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
Jus
Jus
5 lat temu

Dzięki za ten artykuł. Bardzo przejrzyście opisane 🙂 czy da się jakoś określić, od jakich wartości powyższych parametrów możemy mówić o zadowalającej predykcji czy to zależy tylko od danego przypadku? Jakie wartości mogą nam pokazać, że model jednak nie jest optymalny? Jest jakaś przyjęta skala czy to raczej dość intuicyjne?

Matt
Matt
3 lat temu

Świetnie wyjaśnione! Widać, że autor tryska energią opowiadając o ML, a nie jak czasem smutne kursy na Udemy 😀
Dzięki!

Andrzej
Andrzej
3 lat temu

Cześć, dzięki za artykuł – jest bardzo pomocny 🙂
Zauważyłem jednak błąd edytorski – w sekcji o metryce recall podany jest wzór na precision.