04 · Ocena · 4 min czytania · Interaktywne · aktualizacja
Czym różni się macro, micro i weighted F1 w klasyfikacji wieloklasowej?
W skrócie
W klasyfikacji wieloklasowej precyzję, recall i F1 liczy się dla każdej klasy osobno i uśrednia. Sposób uśredniania decyduje, czy liczą się rzadkie klasy.
Co to jest
Metryki wieloklasowe to sposoby oceny klasyfikatora, który wybiera jedną z K > 2 klas. Precyzja, recall i F1 są z natury binarne, więc liczy się je dla każdej klasy w schemacie „ta klasa przeciw reszcie”, a potem łączy w jedną liczbę przez uśrednianie makro, mikro lub ważone. Do tego dochodzą trafność, zbalansowana trafność, macierz pomyłek K × K oraz metryki rankingowe, jak trafność top-k i ROC AUC jeden-przeciw-reszcie.
Uśrednianie makro liczy metrykę osobno dla każdej klasy i bierze zwykłą średnią — każda klasa waży tyle samo, niezależnie od liczności. Mikro najpierw sumuje TP, FP i FN ze wszystkich klas, a dopiero potem liczy metrykę — każdy przykład waży tyle samo. Ważone (weighted) to średnia z metryk klas ważona ich licznością.
Mechanizm — dlaczego tak działa
Różnica między makro a mikro sprowadza się do pytania: co jest jednostką sprawiedliwości — klasa czy przykład? Przy uśrednianiu mikro klasa licząca 90% danych dominuje wynik; model, który ignoruje rzadkie klasy, nadal wypada świetnie. Przy uśrednianiu makro rzadka klasa, w której model zawodzi, ciągnie średnią w dół tak samo jak klasa najliczniejsza. Jeśli wszystkie klasy są równie ważne biznesowo, makro jest uczciwsze; jeśli liczy się ogólna liczba poprawnych decyzji, lepsze jest mikro.
W klasyfikacji jednoetykietowej (każdy przykład ma dokładnie jedną klasę) każdy błąd jest jednocześnie fałszywym pozytywem dla klasy przewidzianej i fałszywym negatywem dla klasy prawdziwej. Dlatego suma FP równa się sumie FN i mikro-precyzja = mikro-recall = mikro-F1 = trafność. To częste źródło nieporozumień: mikro-F1 nie wnosi tu nic nowego. Makro-recall z kolei jest dokładnie zbalansowaną trafnością.
Gdy klasy są w przybliżeniu równoliczne, wszystkie trzy średnie dają podobne liczby, a różnice ujawniają się dopiero w wynikach dla poszczególnych klas. Dlatego warto zawsze patrzeć na raport per klasa i macierz pomyłek, a nie tylko na średnią: ta sama średnia może kryć model równomiernie dobry albo świetny w ośmiu klasach i bezużyteczny w dwóch.
Zastrzeżenie dotyczące makro-F1: istnieją dwie definicje — średnia z F1 klas albo F1 policzone ze średniej precyzji i średniego recall. Dają różne liczby. scikit-learn stosuje pierwszą. Przy porównywaniu z literaturą warto sprawdzić, której użyto.
Metryki rankingowe ratują sytuację, gdy klas jest dużo i podobne klasy łatwo pomylić: trafność top-5 w rozpoznawaniu obrazów pyta, czy prawidłowa klasa jest wśród pięciu najbardziej prawdopodobnych. ROC AUC dla wielu klas liczy się jako średnią z krzywych jeden-przeciw-reszcie lub jeden-przeciw-jednemu.
Na przykładzie
Zbiór Digits to 1797 obrazków cyfr 8 × 8 pikseli, około 180 na klasę. Po podziale warstwowym 75/25 (random_state=0, 450 przykładów testowych) naiwny klasyfikator bayesowski (GaussianNB) uzyskał trafność 83,6%, a więc i mikro-F1 = 0,836. Makro-F1 = 0,835 i ważone F1 = 0,836 są prawie takie same, bo klasy są niemal równoliczne. Średnie ukrywają jednak duże różnice między klasami. Recall cyfry 2 wynosi tylko 0,50 przy precyzji 1,0: model rzadko mówi „2”, ale gdy już mówi, ma rację. Cyfra 8 ma odwrotny problem — precyzja 0,52, bo model wrzuca do niej cudze przykłady.
Macierz pomyłek wyjaśnia, skąd to się bierze: aż 15 z 44 dwójek zaklasyfikowano jako ósemki, a kolejne 7 jako jedynki. Dla porównania regresja logistyczna ze standaryzacją ma trafność 96,9%, makro-F1 0,969, a jej najczęstsza pomyłka to 3 ósemki uznane za jedynki. Z samej średniej nie dało się dowiedzieć, że pierwszy model ma w zasadzie problem z dwiema konkretnymi klasami.
Dane: Digits (ręcznie pisane cyfry 8×8)
W praktyce
classification_report(y_true, y_pred, digits=3)wypisuje precyzję, recall i F1 dla każdej klasy oraz średnie makro i ważoną.f1_score(y_true, y_pred, average='macro' | 'micro' | 'weighted' | None);average=Nonezwraca wynik dla każdej klasy.balanced_accuracy_score= makro-recall; dobra domyślna metryka przy niezbalansowanych klasach.top_k_accuracy_score(y_true, proba, k=5)iroc_auc_score(y_true, proba, multi_class='ovr')wymagają prawdopodobieństw dla wszystkich klas.- W walidacji krzyżowej stosuj
StratifiedKFold, by rzadkie klasy pojawiały się w każdym foldzie; inaczej makro-metryki stają się nieokreślone. - Typowy błąd: raportowanie mikro-F1 jako „metryki odpornej na niezbalansowanie” — w zadaniach jednoetykietowych to po prostu trafność.
Najczęstsze pytania
- Którą średnią wybrać?
- Makro, gdy każda klasa jest tak samo ważna, zwłaszcza przy rzadkich klasach. Ważoną, gdy chcesz uwzględnić liczność, ale zachować informację o F1 klas. Mikro ma sens głównie w zadaniach wieloetykietowych, gdzie przykład może mieć wiele klas naraz.
- Dlaczego micro-F1 równa się trafności?
- Bo w zadaniu jednoetykietowym każdy błędnie sklasyfikowany przykład liczy się raz jako FP (dla przewidzianej klasy) i raz jako FN (dla prawdziwej). Sumy FP i FN są równe, więc mikro-precyzja i mikro-recall są równe trafności.
- Co zrobić, gdy jakaś klasa nie pojawia się w zbiorze testowym?
- Precyzja lub recall tej klasy są nieokreślone (dzielenie przez zero) i scikit-learn ostrzega oraz wstawia 0, co zaniża makro-średnią. Rozwiązaniem jest warstwowy podział, a przy bardzo rzadkich klasach — raportowanie ich osobno.
Źródła
- Sokolova M., Lapalme G. (2009). A systematic analysis of performance measures for classification tasks. Information Processing & Management, 45(4).
- Géron A. „Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow”, 3rd ed., O’Reilly 2022, rozdz. 3 (Classification — Multiclass Classification, Error Analysis).
- Murphy K. P. „Probabilistic Machine Learning: An Introduction”, MIT Press 2022, rozdz. 5.1 (Bayesian decision theory).
- Dokumentacja scikit-learn: Multiclass and multilabel classification metrics — https://scikit-learn.org/stable/modules/model_evaluation.html#multiclass-and-multilabel-classification