ML Atlas

04 · Ocena · 4 min czytania · Interaktywne · aktualizacja

Co to jest macierz pomyłek (confusion matrix) i jak ją czytać?

W skrócie

Macierz pomyłek zlicza, ile przykładów każdej prawdziwej klasy model przypisał do każdej klasy. Z niej wynikają trafność, precyzja, recall i inne metryki.

Co to jest

Macierz pomyłek (confusion matrix) to tabela, w której wiersze odpowiadają prawdziwym klasom, kolumny klasom przewidzianym przez model, a w komórkach stoi liczba przykładów o danej kombinacji. Na przekątnej leżą trafienia, poza nią — konkretne rodzaje błędów. To najbardziej podstawowy i najbogatszy w informację sposób opisania wyników klasyfikatora.

W klasyfikacji binarnej ma cztery komórki: TP (prawdziwie pozytywne — chory rozpoznany jako chory), TN (prawdziwie negatywne — zdrowy jako zdrowy), FP (fałszywie pozytywne, błąd I rodzaju — fałszywy alarm) i FN (fałszywie negatywne, błąd II rodzaju — przeoczenie). Pojedyncza liczba, jak trafność, zlewa te cztery wartości w jedną i gubi informację, jakie błędy model popełnia.

Mechanizm — dlaczego tak działa

Każda popularna metryka klasyfikacji jest funkcją tych czterech liczb. Trafność = (TP + TN) / wszystkie. Precyzja = TP / (TP + FP) — jaka część alarmów jest prawdziwa. Recall (czułość) = TP / (TP + FN) — jaką część prawdziwych przypadków wykryliśmy. Swoistość = TN / (TN + FP). Odczytując macierz, widzimy od razu, która z nich jest problemem, zamiast zgadywać na podstawie jednej liczby.

Macierz pokazuje też, dlaczego trafność bywa myląca. Gdy pozytywów jest 1%, model mówiący zawsze „negatywny” ma 99% trafności i TP = 0. Macierz ujawnia to od razu: cała kolumna „pozytywny” jest pusta.

Ważne: macierz pomyłek nie jest cechą samego modelu, lecz modelu i progu decyzyjnego. Klasyfikator zwykle zwraca prawdopodobieństwo, a etykietę dostajemy, porównując je z progiem (domyślnie 0,5). Obniżenie progu przesuwa przykłady z kolumny „negatywny” do „pozytywny”: FN maleje, FP rośnie. Nie ma progu, który poprawia wszystko naraz — to wymiana jednych błędów na drugie, a o kursie wymiany decydują koszty błędów w danym zastosowaniu.

Macierz zależy też od proporcji klas w zbiorze, na którym ją liczymy. Te same zdolności modelu dadzą zupełnie inną precyzję w szpitalu onkologicznym i w badaniach przesiewowych, bo zmienia się udział chorych. Recall i swoistość są od tego niezależne, precyzja i trafność — nie.

W problemach wieloklasowych macierz ma wymiar K × K. Komórki poza przekątną pokazują, które klasy są ze sobą mylone, co często podpowiada, czego modelowi brakuje (np. cyfry 3 i 8 różnią się lewą połową).

Na przykładzie

Na zbiorze Breast Cancer Wisconsin (569 guzów, klasa pozytywna = złośliwy) wytrenowałem regresję logistyczną ze standaryzacją cech na 426 przykładach i oceniłem na 143 testowych (podział warstwowy, test_size=0.25, random_state=0). W teście było 53 guzy złośliwe i 90 łagodnych. Przy progu 0,5 macierz wygląda tak: TN = 90, FP = 0, FN = 2, TP = 51. Trafność to 98,6%, precyzja 100%, recall 96,2%: model nie wywołał ani jednego fałszywego alarmu, ale przeoczył dwa nowotwory.

W diagnostyce przeoczenie jest zwykle groźniejsze od fałszywego alarmu, więc obniżmy próg do 0,1. Macierz: TN = 79, FP = 11, FN = 0, TP = 53. Wszystkie złośliwe guzy wykryte, ale 11 łagodnych skierowano by na dodatkową diagnostykę; trafność spadła do 92,3%. Która macierz jest lepsza, zależy od kosztów — i właśnie dlatego warto patrzeć na macierz, a nie tylko na trafność, która wskazałaby pierwszy wariant.

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

  • confusion_matrix(y_true, y_pred) z sklearn.metrics; w scikit-learn wiersze to klasy prawdziwe, kolumny przewidziane. Dla przypadku binarnego tn, fp, fn, tp = confusion_matrix(...).ravel().
  • Wizualizacja: ConfusionMatrixDisplay.from_estimator(model, X_test, y_test) lub from_predictions.
  • normalize='true' dzieli przez sumy wierszy (na przekątnej pojawia się recall każdej klasy), normalize='pred' przez sumy kolumn (precyzja).
  • Sprawdź, która klasa jest „pozytywna”. W load_breast_cancer etykieta 1 oznacza guz łagodny, więc trzeba ją odwrócić, jeśli pozytywem ma być nowotwór.
  • Typowy błąd: różne konwencje osi w podręcznikach i bibliotekach. Zawsze podpisuj osie.

Najczęstsze pytania

Dlaczego to się nazywa „macierz pomyłek”?
Bo pokazuje, z czym model myli każdą klasę. Komórka w wierszu „kot” i kolumnie „pies” mówi, ile kotów uznano za psy, a komórka odwrotna — ile psów za koty. Te dwie liczby zwykle nie są równe, więc macierz nie jest symetryczna.
Który błąd jest gorszy: FP czy FN?
To zależy od zastosowania, nie od statystyki. W badaniach przesiewowych zwykle FN, w filtrze antyspamowym raczej FP (zgubiony ważny mail). Koszty warto ustalić przed trenowaniem i dobrać do nich próg.
Jak czytać macierz dla wielu klas?
Patrz najpierw na przekątną znormalizowaną po wierszach — to recall każdej klasy. Potem szukaj największych komórek poza przekątną: wskazują pary klas, które model myli najczęściej.

Źródła

  • Géron A. „Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow”, 3rd ed., O’Reilly 2022, rozdz. 3 (Classification).
  • James G., Witten D., Hastie T., Tibshirani R. „An Introduction to Statistical Learning”, 2nd ed., Springer 2021, rozdz. 4 (Classification).
  • Fawcett T. (2006). An introduction to ROC analysis. Pattern Recognition Letters, 27(8).
  • Dokumentacja scikit-learn: Confusion matrix — https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix

Zobacz też