konfjúžn matrixTakékonfuzní matice, matice zmatení, chybová matice, error matrixPokročilý
Definice
Confusion matrix je tabulka, která porovnává předpovědi klasifikačního modelu se skutečnými třídami a rozděluje je na správné a chybné případy. U dvou tříd obsahuje čtyři čísla: true positive, true negative, false positive a false negative. Z těchto čtyř hodnot se počítá accuracy, precision, recall i F1 skóre.
Čtyři čísla, ze kterých se počítá všechno ostatní
Confusion matrix zapisuje výsledek klasifikace do tabulky, kde řádky obvykle znamenají skutečnou třídu a sloupce predikci modelu. U binární úlohy vzniknou čtyři buňky: true positive (model řekl pozitivní a měl pravdu), true negative (správně označil negativní případ), false positive (planý poplach) a false negative (přehlédnutý případ). Diagonála je to, co model trefil, mimo diagonálu leží chyby.
| Predikce: pozitivní | Predikce: negativní | |
|---|---|---|
| Skutečnost: pozitivní | TP | FN |
| Skutečnost: negativní | FP | TN |
Pozor na konvenci: knihovny se liší v tom, zda dávají skutečnou třídu do řádků, nebo do sloupců. Před interpretací tabulky se vyplatí ověřit orientaci v dokumentaci nástroje, jinak si člověk snadno prohodí precision a recall.
Proč samotná accuracy klame
Accuracy, tedy podíl správných předpovědí, se u nevyvážených dat chová zrádně. Když je jen 1 % transakcí podvodných, model, který u všeho řekne „v pořádku“, dosáhne 99 % accuracy a nezachytí jediný podvod. Confusion matrix tuhle situaci okamžitě odhalí: sloupec pozitivních predikcí je prázdný. Proto se z ní odvozují metriky, které se dívají jen na část tabulky.
- Precision = TP / (TP + FP): kolik z označených případů bylo skutečně pozitivních.
- Recall (senzitivita) = TP / (TP + FN): kolik skutečně pozitivních případů model našel.
- Specificita = TN / (TN + FP): jak dobře model nechává negativní případy na pokoji.
- F1 = harmonický průměr precision a recall, užitečný, když nechcete sledovat dvě čísla.
Cena chyby není symetrická
Rozdělení chyb na FP a FN má smysl hlavně proto, že každý typ stojí jiné peníze. U screeningu nemoci je false negative pacient, který odejde domů s neléčenou diagnózou; false positive znamená další vyšetření navíc. U spamového filtru je to naopak: propuštěný spam obtěžuje, ale zahozený objednávkový e-mail ničí obchod. Volba prahu pravděpodobnosti posouvá případy mezi FP a FN, a confusion matrix ukazuje, kam se posunuly.
Více tříd a nejčastější záměny
U více tříd má matice rozměr N krát N a její hlavní přínos není jen celková úspěšnost, ale konkrétní vzorec chyb. Když model rozeznává deset druhů zboží a pravidelně plete dvě vizuálně podobné kategorie, projeví se to jako jedna výrazná buňka mimo diagonálu. To je návod na akci: přidat trénovací data právě pro tuto dvojici, případně obě třídy sloučit. Normalizace po řádcích (podíl místo počtu) usnadní srovnání tříd s velmi odlišným počtem vzorků.
Confusion matrix se vždy počítá na datech, která model neviděl při trénování, typicky na validační nebo testovací množině. Matice sestavená na trénovacích datech vypadá skvěle a neříká nic o skutečné kvalitě modelu.
Příklady z praxe
Detekce podvodných plateb v e-shopu
Model označí 120 z 10 000 transakcí jako podvodné. Skutečných podvodů bylo 100, model z nich zachytil 80 (TP), 20 mu uteklo (FN) a 40 poctivých objednávek zbytečně zablokoval (FP). Recall je 80 %, precision jen 67 %: dvě třetiny zablokovaných zákazníků byly poctivé a někdo je musí odblokovat ručně.
Výpočet matice ve scikit-learn
Knihovna scikit-learn vrací matici jako pole, kde řádky jsou skutečné třídy a sloupce predikce. Rozbalením do čtyř proměnných získáte přímo TN, FP, FN a TP a můžete si dopočítat vlastní metriku, například očekávanou ztrátu v korunách.
from sklearn.metrics import confusion_matrix y_true = [0, 1, 1, 0, 1, 0, 1, 1] y_pred = [0, 1, 0, 0, 1, 1, 1, 0] tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel() print(tn, fp, fn, tp) # 2 1 2 3 precision = tp / (tp + fp) # 0.75 recall = tp / (tp + fn) # 0.60
Časté omyly
- MýtusModel má 95 % accuracy, takže je dobrý.
- Ve skutečnostiAccuracy sama o sobě nic neříká, dokud neznáte rozložení tříd. Při 5 % pozitivních případů dosáhne 95 % i model, který vždy odpoví „negativní“ a nezachytí ani jeden hledaný případ.
- MýtusConfusion matrix je jen vizualizace, na výsledek nemá vliv.
- Ve skutečnostiConfusion matrix je zdrojová tabulka, ze které se počítá precision, recall, specificita i F1. Volba prahu, která tato čísla mění, je běžné rozhodnutí při nasazení modelu.
- MýtusPro více tříd se confusion matrix nedá použít.
- Ve skutečnostiPro N tříd má matice rozměr N krát N a bývá ještě užitečnější než u binární úlohy, protože ukazuje, které konkrétní dvojice tříd si model plete.
Časté dotazy
- Jak se čte confusion matrix ve scikit-learn?
- Ve scikit-learn odpovídají řádky confusion matrix skutečným třídám a sloupce predikcím, přičemž třídy jsou seřazeny vzestupně, pokud není zadán parametr labels. U binární úlohy s hodnotami 0 a 1 tedy metoda ravel() vrátí čtveřici v pořadí TN, FP, FN, TP. Jiné nástroje a učebnice používají opačnou orientaci nebo pořadí tříd, takže před interpretací výstupu je rozumné ověřit konvenci v dokumentaci konkrétní knihovny. Chybná orientace vede k prohození precision a recall, což u nevyvážených dat úplně obrátí závěr.
- Kolik dat je potřeba, aby byla confusion matrix vypovídající?
- Vypovídací hodnota confusion matrix závisí hlavně na počtu vzorků v nejmenší třídě, ne na celkové velikosti testovací sady. Když je v testovací množině jen deset skutečně pozitivních případů, recall se mění o deset procentních bodů s každým jedním vzorkem a rozdíl mezi dvěma modely je nerozlišitelný od náhody. V takové situaci pomáhá křížová validace, stratifikované rozdělení dat nebo uvedení intervalu spolehlivosti místo jediného čísla.
- Jak se z confusion matrix pozná overfitting?
- Overfitting se z confusion matrix pozná porovnáním dvou matic: jedné na trénovacích datech a druhé na testovacích. Když je trénovací matice téměř čistě diagonální, zatímco testovací obsahuje výrazné hodnoty mimo diagonálu, model si zapamatoval trénovací vzorky místo obecného vzoru. Samotná testovací matice overfitting neodhalí, protože ukazuje jen výsledný stav, nikoli jeho příčinu. Sledovat se vyplatí i to, zda se chyby na testu koncentrují do konkrétních tříd s málo trénovacími příklady.
- Nahrazuje ROC křivka confusion matrix?
- ROC křivka confusion matrix nenahrazuje, ale vzniká z ní. Každý bod ROC křivky odpovídá jedné confusion matrix při konkrétním prahu rozhodování a vynáší se z něj podíl true positive proti podílu false positive. ROC tedy shrnuje chování modelu přes všechny prahy, kdežto confusion matrix popisuje jeden zvolený provozní bod, se kterým se reálně nasazuje. Při silně nevyvážených datech navíc ROC vypadá optimisticky a bývá vhodnější precision-recall křivka.
Zdroje
- Confusion matrix(otevře se v novém okně)
- Precision and recall(otevře se v novém okně)
- Machine Learning Glossary(otevře se v novém okně)
- NIST/SEMATECH e-Handbook of Statistical Methods(otevře se v novém okně)