Skip to content

Metriky a vyhodnoceni

Martin Skalicky edited this page Aug 6, 2026 · 1 revision

Metriky a vyhodnocení modelů

Mám klasifikátor rakoviny s přesností 99 %. Zní to výborně. Nemocný je jeden pacient ze sta, takže model, který napíše „zdravý" úplně všem, má přesnost 99 % taky - a nenajde ani jednoho nemocného.

Přesnost (accuracy) je nejpoužívanější a nejzavádějící metrika ve strojovém učení. U nevyvážených dat neříká vůbec nic a přesto se uvádí jako první číslo v každé práci.

Tahle stránka je o tom, čím ji nahradit, jak se čte matice záměn a proč se model nesmí testovat na datech, na kterých se učil. Předpokládá to klasifikaci a rozpoznávání. Nepotřebuješ k tomu žádnou statistiku nad rámec zlomků.

Základní typy dat

Než se začne měřit, musí se data uvést do stavu, ve kterém se měřit dají.

Intervalové proměnné - poloha, váha, výška. Normalizují se do [0, 1]:

x' = (x − xmin) / (xmax − xmin)

Tohle není kosmetika. Když má váha rozsah 50-120 a výška 1,5-2,0, každá euklidovská vzdálenost bude určena výhradně vahou a výška se v ní ztratí. Bez normalizace ti k-NN i shlukování měří něco jiného, než sis myslel.

Binární proměnné - dva stavy, 1 (přítomnost) a 0 (nepřítomnost). Normalizovat se nemusí.

Metriky vzdálenosti

Eukleidovská vzdálenost. Přímá čára, to, co si pod vzdáleností představíš:

d(X, Y) = √( Σ (xi − yi)² )

Manhattanská vzdálenost. Součet absolutních rozdílů, tedy cesta po ulicích pravoúhlého města:

d(X, Y) = Σ |xi − yi|

Je odolnější vůči odlehlým hodnotám, protože nemocní rozdíly na druhou. Jeden příznak, který se liší o deset, přispěje deseti, ne stem.

Kosinová podobnost. Úhel mezi vektory:

sim(X, Y) = (X · Y) / (‖X‖ · ‖Y‖)

Všimni si, že to není vzdálenost, ale podobnost - vyšší je lepší, hodnota 1 znamená stejný směr. A hlavně: ignoruje délku vektorů. Proto se používá na texty. Dokument o třiceti slovech a dokument o třech tisících se stejným tématem mají skoro stejný směr, ale obrovskou euklidovskou vzdálenost.

Volba metriky je součást návrhu, ne detail. Fyzikální veličiny → euklidovská. Data se šumem a odlehlými body → manhattanská. Texty a četnosti → kosinová.

Přesnost klasifikace

Chybovost a přesnost, nejzákladnější dvojice:

ER  = E / ALL              chybovost (error rate)
ACC = OK / ALL = 1 − ER    přesnost (accuracy)

U úloh typu rozpoznávání 1-n (spojitá řeč, sekvence znaků) to nestačí, protože model může slovo nejen zaměnit, ale i vynechat nebo přidat:

ACC = (N − D − S − I) / N

kde N je počet jednotek, D vynechané (deletions), S zaměněné (substitutions) a I vložené (insertions).

Ta I je důvod, proč tahle metrika může vyjít záporná. Když model vygeneruje víc jednotek, než jich ve skutečnosti bylo, I může být větší než N. To není chyba vzorce, to je poctivé měření.

Matice záměn

Tabulka skutečných proti predikovaným třídám. Pro dvě třídy:

Predikce + Predikce −
Skutečnost + TP FN
Skutečnost − FP TN
  • TP (true positive) - správně označený pozitiv,
  • FN (false negative) - prošvihnutý pozitiv,
  • FP (false positive) - falešný poplach,
  • TN (true negative) - správně označený negativ.

Nejdůležitější věc na téhle stránce: FN a FP nejsou stejně drahé. U testu na rakovinu je FN prošvihnutá diagnóza a FP zbytečné vyšetření navíc. U spamového filtru je FP ztracený důležitý e-mail a FN otravná reklama v inboxu. Která z těch dvou chyb tě víc bolí, rozhoduje o tom, kterou metriku máš sledovat.

Pozor na orientaci tabulky. Používají se obě konvence a liší se, jestli je řádek skutečnost, nebo odhad:

Odhad / Reál 1 0
1 TP FP
0 FN TN

Před interpretací si vždycky zkontroluj, co je řádek. Ve scikit-learn (ConfusionMatrixDisplay) je řádek skutečná třída a sloupec predikce.

Pro víc tříd je matice R × R. Příklad ze tří tříd:

a b c
a 88 4 12
b 8 65 4
c 11 15 33

Na diagonále jsou správné klasifikace, mimo ni záměny. Z téhle matice se toho dá vyčíst mnohem víc než z jednoho čísla přesnosti. Třída c má jen 33 správných ze 59 a nejčastěji se plete s b. Přesnost by ti řekla „78 %" a to, že jedna třída skoro nefunguje, bys nezjistil.

Přesně to je důvod, proč se u datasetu Digits kreslí matice záměn - je z ní vidět, že si model plete osmičku s trojkou, což z přesnosti 96 % nepoznáš.

Precision, Recall, F-míra

Precision = TP / (TP + FP)
Recall    = TP / (TP + FN)
F1        = 2 · Precision · Recall / (Precision + Recall)

Slovy, a tohle si zapamatuj v téhle podobě:

Precision odpovídá na otázku: „Kolik z toho, co jsem označil, bylo správně?" Jmenovatel je všechno, co model označil za pozitivní.

Recall odpovídá na otázku: „Kolik z toho, co existovalo, jsem našel?" Jmenovatel je všechno, co skutečně pozitivní bylo.

Jdou proti sobě a to je celý smysl toho, že jsou dvě. Model, který označí za pozitivní úplně všechno, má recall 1,0 a mizernou precision. Model, který označí jediný nejjistější případ, má precision 1,0 a mizerný recall. Jednu z nich vždycky zvedneš na úkor druhé posunutím prahu rozhodování.

F1 je jejich harmonický průměr. Používá se harmonický, ne aritmetický, protože tvrdě trestá nerovnováhu. Precision 1,0 a recall 0,0 dá aritmetický průměr 0,5, ale F1 = 0. To je správně - takový model je k ničemu.

Vrať se k příkladu z úvodu. Model „všichni zdraví" má accuracy 0,99, recall 0,0 a F1 = 0. Jedna metrika říká výborně, druhá říká úplně nefunguje, a pravdu má ta druhá.

Křížová validace

Data se rozdělí na k částí, typicky k = 10. Model se k-krát natrénuje, pokaždé s jinou částí jako testovací a zbytkem jako trénovací. Výsledná přesnost je průměrem.

flowchart LR
    A["data rozdělená na 10 dílů"] --> B["běh 1: test = díl 1"]
    A --> C["běh 2: test = díl 2"]
    A --> D["..."]
    A --> E["běh 10: test = díl 10"]
    B --> F["průměr přesností"]
    C --> F
    D --> F
    E --> F
Loading

Odstraňuje závislost na konkrétním rozdělení dat. Jeden náhodný split ti může dát 96 % nebo 91 % podle toho, jak padly těžké případy - a ty pak měříš náhodu, ne model.

Druhá výhoda: každý vzorek je právě jednou v testovací množině, takže využiješ všechna data na trénování i na testování, jen ne naráz. U malých datasetů je to zásadní.

Kde křížová validace přestává platit: u časových řad ji nepoužívej. Náhodné rozdělení znamená, že se model učí na budoucnosti a testuje na minulosti, a výsledek bude nesmyslně dobrý. Tam se dělí chronologicky.

Druhý případ: když děláš výběr příznaků nebo ladění parametrů, musí se to dělat uvnitř každého běhu. Když vybereš příznaky na celých datech a pak křížově validuješ, testovací data už model ovlivnila a přesnost je nadhodnocená.

Učební křivka

Závislost chyby na velikosti trénovací množiny, případně na počtu epoch. Kreslí se dvě křivky - trénovací a validační chyba - a z jejich vzájemné polohy se čte diagnóza:

Co vidíš Co to znamená Co s tím
Obě chyby vysoké, blízko sebe podtrénování (underfitting) větší model, víc příznaků, delší trénink
Trénovací nízká, validační vysoká přetrénování (overfitting) víc dat, regularizace, dropout, jednodušší model
Obě nízké a blízko model sedí hotovo
Validační klesá a pak roste přetrénování začalo v tom minimu early stopping právě tam

Tahle tabulka je nejužitečnější věc na celé stránce, protože převádí obrázek na konkrétní akci. Bez ní se ladí naslepo.

Podrobněji jsou příčiny a protiopatření u MLP a backpropagation.

Praktická pravidla

Nikdy netestuj na trénovacích datech. Zní to samozřejmě a stane se to každému, typicky přes příznaky vybrané na celém datasetu.

U nevyvážených dat neuváděj accuracy. Uváděj precision, recall a F1, nebo rovnou matici záměn.

Rozhodni předem, jestli tě víc bolí FP, nebo FN. Podle toho se pak volí práh a metrika, ne obráceně.

Vždycky se podívej na matici záměn, ne jen na číslo. Jedno číslo skryje, že jedna třída vůbec nefunguje.

Normalizuj příznaky před vším, co počítá vzdálenost. k-NN, k-means, SVM, neuronové sítě. Rozhodovací stromy to nepotřebují.

Křížovou validaci použij, kdykoliv máš míň než pár tisíc vzorků. Jeden split tam měří náhodu.

Co si odnést

Accuracy u nevyvážených dat nic neříká. 99 % může znamenat model, který nenajde ani jeden pozitiv.

Precision = kolik z označených sedělo. Recall = kolik z existujících jsem našel. Jdou proti sobě.

F1 je harmonický průměr, aby tvrdě trestal nerovnováhu.

Matice záměn řekne víc než jakákoliv jedna metrika. Podívej se na ni vždycky.

FN a FP nejsou stejně drahé. Která chyba bolí víc, je rozhodnutí zadání, ne modelu.

Křížová validace měří model, jeden split měří náhodu.

Normalizace patří před každý výpočet vzdálenosti.

Kam dál

Clone this wiki locally