Přeskočit na obsah
coden

Vyhodnocení modelu: křížová validace, F1 a křivka ROC

Trénovací, validační a testovací data, únik dat, křížová validace, matice záměn, paradox přesnosti, preciznost, úplnost a F1, křivky ROC a preciznost–úplnost, regresní chyby a měření jazykových modelů.

14 minut Matěj Žalmánek 2026-10-15

Série Základy AI Díl 44 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat

Celá osnova série 83 z 83 témat hotovo

Co si odnesete
  • Proč se model měří na datech, která neviděl, a jak z mála dat vytěžit spolehlivý odhad křížovou validací.
  • Proč přesnost u vzácných jevů klame a co říkají preciznost, úplnost a F1.
  • Jak číst křivku ROC a AUC a kdy je poctivější křivka preciznost–úplnost.

Co se hodí znát předem: Přeučení a regularizace: proč model, který zná data nazpaměť, selže, Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další

Firma se pochlubí, že její model rozpozná vzácnou nemoc s přesností 95 %. Zní to skvěle — dokud nezjistíte, že nemoc má jen 5 % lidí a model prostě každému řekne „jste zdravý“. Měřit, jak dobrý model je, je skoro stejně těžké jako ho naučit. V tomhle dílu si ukážeme, na jakých datech se model měří, proč samotná přesnost klame a co ji nahrazuje: matici záměn, preciznost, úplnost, F1 a křivku ROC.

Navazuje na díly Druhy strojového učení a Přeučení a regularizace.

1. Trénovací, validační a testovací data

Definice — trénovací, validační a testovací sada

Nechť D = ((xi, yi))i=1n jsou označená data vybraná nezávisle z jednoho rozdělení. Před učením se množina indexů rozdělí na tři navzájem disjunktní neprázdné části

{1, …, n} = Itr ∪ Ival ∪ Itest,   Itr ∩ Ival = Itr ∩ Itest = Ival ∩ Itest = ∅,

a příslušné dvojice tvoří tři sady s těmito rolemi:

  1. trénovací sada {(xi, yi) : i ∈ Itr} — z ní se učí parametry modelu;
  2. validační sada {(xi, yi) : i ∈ Ival} — na ní se porovnávají nastavení, která učení samo neurčí (hyperparametry: stupeň polynomu, síla regularizace, velikost sítě);
  3. testovací sada {(xi, yi) : i ∈ Itest} — použije se jednou, na úplném konci, k odhadu chyby na nových datech. Odhad je nestranný, právě proto, že na testovací sadě nezávisí ani parametry, ani hyperparametry.
Laicky řečeno

Trénovací data jsou učebnice, validační data cvičné testy a testovací data maturita. Ze cvičných testů se student dozví, jak se učit líp — ale kdyby uviděl maturitní otázky předem, známka z maturity by už nic neznamenala. Obvyklé rozdělení je třeba 70 : 15 : 15.

Definice — únik dat

Nechť je dána trénovací, validační a testovací sada (definice výše) a postup učení, který z dat vyrobí model a pak ho vyhodnotí. Únik dat (data leakage) nastane, právě když platí aspoň jedno z:

  1. naučený model nebo volba hyperparametrů závisí na testovací sadě (třeba přes normalizaci spočtenou ze všech dat nebo přes stejný objekt — pacienta — v trénovací i testovací sadě);
  2. model k předpovědi pro vstup x používá informaci, která v ostrém provozu v okamžiku předpovědi nebude k dispozici (třeba údaje z budoucnosti).

Chyba změřená na testovací sadě pak přestane být nestranným odhadem chyby na nových datech — bývá optimisticky zkreslená (menší).

Laicky řečeno

Únik je zrádný, protože nebývá vidět. Typické případy: stejný pacient má snímky v tréninku i v testu, takže model pozná pacienta, ne nemoc. Data se normalizují průměrem spočteným ze všech dat včetně testu. Model na předpověď cen akcií se testuje na datech náhodně zamíchaných v čase, takže se „učí z budoucnosti“. Výsledek je vždy stejný: krásné číslo v laboratoři a zklamání v provozu.

Proti úniku pomáhá jednoduché pravidlo: nejdřív rozdělit, pak teprve cokoli počítat. Všechno, co se z dat „učí“ — i obyčejný průměr pro normalizaci —, se spočte jen z trénovací sady a na ostatní se jen použije:

def vyhodnot(data, d):
    trenink, validace, test = rozdel(data, 0.70, 0.15, 0.15)   # 1. rozdělit hned na začátku
    mu, s = prumer(trenink.x), smer_odchylka(trenink.x)        # 2. normalizace jen z tréninku
    norm = lambda x: (x - mu) / s
    nastaveni = vyber_nejlepsi(trenink, validace, norm)        # 3. hyperparametry na validaci
    model = uc(trenink, nastaveni, norm)
    return chyba(model, test, norm)                            # 4. test jednou, na konci

U dat s časem (ceny, provoz serveru) se nemíchá náhodně: trénuje se na minulosti a testuje na tom, co následovalo. U dat se skupinami (pacient, uživatel) jde celá skupina buď do tréninku, nebo do testu.

2. Křížová validace

Když máme dat málo, je škoda patnáct procent z nich obětovat validaci — a výsledek na tak malé sadě navíc hodně závisí na tom, které body do ní náhodou padly.

Definice — k-násobná křížová validace

Nechť D = ((xi, yi))i=1n jsou trénovací data, k ∈ ℕ, 2 ≤ k ≤ n, a L ztrátová funkce (zde L(ŷ, y) = (y − ŷ)2). k-násobná křížová validace:

  1. rozdělí indexy na k navzájem disjunktních částí {1, …, n} = C1 ∪ … ∪ Ck stejné velikosti (až na zaokrouhlení: |Cc| se liší nejvýš o 1);
  2. pro každé c = 1, …, k naučí model f̂(−c) jen na datech {(xi, yi) : i ∉ Cc};
  3. jako odhad chyby na nových datech vrátí průměrnou ztrátu každého bodu pod modelem, který ho neviděl: CVL = 1/n ∑c=1k ∑i ∈ Cc L(f̂(−c)(xi), yi).

Pro čtvercovou ztrátu uvádíme odmocninu CV = √CVL (v rámečku níže), aby byla v jednotkách RMSE. Krajní případ k = n (každá část má jeden bod) se jmenuje leave-one-out.

Laicky řečeno

Každý bod se jednou ocitne ve validační sadě a čtyřikrát v trénovací. Nic se neplýtvá a náhoda jednoho rozdělení se zprůměruje. Cenou je, že se model učí kkrát — pro velké neuronové sítě je to drahé, proto se křížová validace používá hlavně u menších modelů a menších dat.

CV = √1/n ∑c=1k ∑i ∈ Cc ( yi − f̂(−c)(xi) )2

CV
odhad chyby na nových datech (fialová křivka v grafu níže); počítáme ho pro každý stupeň zvlášť a vybereme stupeň s nejmenším
∑c ∑i ∈ Cc
projdeme všech k částí C1, …, Ck a v každé všechny její body — protože části pokrývají data celá, každý bod se započte právě jednou
f̂(−c)
model naučený na všem kromě části c; bod xi z části c tedy hodnotí model, který ho nikdy neviděl — v tom je celá pointa
1/n
průměr přes všech n bodů; při stejně velkých částech je to totéž jako průměr chyb k jednotlivých běhů
Odmocnina vrací RMSE, abychom mohli srovnávat s trénovací a testovací chybou.
def krizova_validace(body, d, k=5):
    poradi = zamichej(range(len(body)))
    casti = [poradi[c::k] for c in range(k)]      # k částí po n/k bodech
    soucet = 0
    for c in casti:
        validace = [body[i] for i in c]
        trenink  = [body[i] for i in poradi if i not in c]
        f = proloz(trenink, d)                    # f̂ bez části c
        soucet += sum((y - f(x)) ** 2 for x, y in validace)
    return sqrt(soucet / len(body))

Zkusme to na úloze z minulého dílu: body ze sinusovky se šumem, tentokrát jich je 30. Pro každý stupeň polynomu od 0 do 10 spočteme pětinásobnou křížovou validací odhad chyby (RMSE) a porovnáme ho s chybou na 201 testovacích bodech, které při volbě vůbec nepoužijeme.

00,20,40,6 012345678910 stupeň polynomu (0–10) chyba RMSE (bez jednotky)
Volba stupně polynomu pětinásobnou křížovou validací trénink křížová validace test
Stupeň0135810
chyba na tréninku0,6980,4240,1960,1930,1810,172
křížová validace0,7170,4920,2300,2620,5090,714
chyba na testu0,7080,4510,1060,1220,1450,199

Trénovací chyba s rostoucím stupněm klesá pořád, takže by vybrala stupeň 10. Křížová validace má minimum u stupně 3 — a ten je opravdu nejlepší i na testu. Na absolutní hodnoty se ale dívejte opatrně. Testovací body leží přesně na sinusovce, kdežto validační mají šum se směrodatnou odchylkou 0,25 — proto je křížová chyba vždy vyšší než testovací. A u vysokých stupňů roste mnohem prudčeji, protože každý model v ní vidí jen 24 bodů místo 30 a polynom vysokého stupně je na počet bodů citlivý. Pro volbu modelu to nevadí: rozhoduje, kde má křivka minimum.

3. Matice záměn

Teď ke klasifikaci. Náš příklad: screeningový test na vzácnou nemoc, tisíc lidí, z toho 50 nemocných (5 %). Test každému přiřadí číslo — skóre. Zdraví mají skóre kolem 0, nemocní kolem 1,8; obě skupiny se ale dost překrývají. Kdo má skóre aspoň práh, tomu test řekne „pozitivní“.

−3−2−1012345 práh 1,5 skóre testu (bez jednotky) hustota (lidí na 1 bod skóre)
Skóre testu u 950 zdravých a 50 nemocných zdraví nemocní (10× zvětšeno)

Křivky jsou nakreslené v počtech lidí, ne v procentech, a křivku nemocných jsme museli desetkrát zvětšit — ve skutečném měřítku by u dna grafu skoro nebyla vidět. Vpravo od prahu leží pozitivní výsledky: tmavě červená plocha jsou správně odhalení nemocní, zelená zdraví, které test zbytečně vyděsil. Světle červená plocha vlevo jsou nemocní, které test přehlédl.

Definice — matice záměn

Nechť n ≥ 1 a pro i = 1, …, n je yi ∈ {0, 1} skutečná třída a ŷi ∈ {0, 1} předpověď modelu (1 = „pozitivní“, 0 = „negativní“; u testu se skóre si a prahem t je ŷi = 1, právě když si ≥ t). Definujeme čtyři počty:

  1. skutečně pozitivní (true positive): TP = |{i : ŷi = 1 ∧ yi = 1}|;
  2. falešně pozitivní (chyba prvního druhu): FP = |{i : ŷi = 1 ∧ yi = 0}|;
  3. falešně negativní (chyba druhého druhu): FN = |{i : ŷi = 0 ∧ yi = 1}|;
  4. skutečně negativní (true negative): TN = |{i : ŷi = 0 ∧ yi = 0}|.

Každý příklad patří právě do jedné skupiny, takže TP + FP + FN + TN = n. Matice záměn je tabulka 2 × 2 těchto počtů (řádek = předpověď, sloupec = skutečnost):

M = TPFPFNTN.

Pro K tříd, yi, ŷi ∈ {1, …, K}, je to matice M ∈ ℕ0K×K s prvky Mab = |{i : ŷi = a ∧ yi = b}|.

Laicky řečeno

Test se může splést dvěma způsoby, a ty nejsou stejně zlé. Falešný poplach (FP) znamená zbytečný strach a další vyšetření. Přehlédnutí (FN) znamená neléčenou nemoc. Matice záměn ty dvě chyby nesčítá dohromady, ale ukáže každou zvlášť.

skutečnost nemocný zdravý test pozitivní negativní 28 odhalení nemocní (TP) 68 falešný poplach (FP) 22 přehlédnutí (FN) 882 správně zdraví (TN)
Matice záměn při prahu 1,5

Při prahu 1,5 test odhalil 28 z 50 nemocných a 22 přehlédl. Ze zdravých jich 882 správně pustil domů a 68 poslal na zbytečné vyšetření. Všechny metriky ze zbytku dílu jsou jen různé zlomky z těchhle čtyř čísel.

4. Paradox přesnosti

Definice — přesnost

Nechť TP, FP, FN, TN jsou počty z matice záměn (definice výše) a n = TP + FP + FN + TN ≥ 1. Přesnost (accuracy) je podíl správných předpovědí:

přesnost = TP + TN/TP + FP + FN + TN ∈ [0, 1].

Laicky řečeno

Kolik procent lidí test zařadil správně. Je to nejpřirozenější číslo — a u nevyvážených dat nejzrádnější.

Náš test má při prahu 1,5 přesnost 91,0 %: 28 + 882/1000. „Model“, který každému řekne „zdravý“ a skóre vůbec nečte, má přesnost 95,0 % — je podle přesnosti lepší, a přitom neodhalí ani jednoho nemocného. Tomu se říká paradox přesnosti. Když je jedna třída vzácná, přesnost měří hlavně to, jak dobře model pozná tu častou. U podvodných plateb, závad ve výrobě nebo vzácných nemocí jde přitom právě o tu vzácnou.

Proč tomu tak je, ukáže přesnost rozepsaná podle tříd. Označme π prevalenci (podíl skutečně pozitivních), TPR = TP/TP + FN úplnost a TNR = TN/TN + FP specificitu (obě přesně definujeme v dalším oddílu). Protože TP = πn · TPR a TN = (1 − π)n · TNR, je

přesnost = π · TPR + (1 − π) · TNR

π
podíl nemocných; váha, se kterou do přesnosti vstoupí úspěch u nich — u nás jen 0,05
TPR
jaký podíl nemocných test odhalí; je tu, protože správně zařazený nemocný je jeden ze dvou druhů správné odpovědi
(1 − π)
podíl zdravých, váha druhého členu — u nás 0,95, devatenáctkrát víc než u nemocných
TNR
jaký podíl zdravých test správně pustí domů; druhý druh správné odpovědi
Přesnost je vážený průměr úspěšnosti v obou třídách — a váhy určuje prevalence, ne to, na čem nám záleží.

Při prahu 1,5 (barvy podle vzorce výše): 0,05 · 0,560 + 0,95 · 0,928 = 0,028 + 0,882 = 0,910. Odhalení nemocní přispěli necelými třemi procentními body, zbytek obstarali zdraví. Model „všichni zdraví“ má TPR = 0 a TNR = 1, takže jeho přesnost je přesně 1 − π = 0,95: celý první člen mu chybí, a stejně vyhraje.

5. Preciznost, úplnost a F1

Definice — preciznost a úplnost

Nechť TP, FP, FN, TN jsou počty z matice záměn. Definujeme:

  1. preciznost (precision), je-li TP + FP > 0 (model aspoň jednou řekl „pozitivní“): preciznost = TP/TP + FP;
  2. úplnost (recall, v medicíně senzitivita, značka TPR), je-li TP + FN > 0 (v datech je aspoň jeden pozitivní): úplnost = TPR = TP/TP + FN;
  3. specificitu (TNR), je-li TN + FP > 0: specificita = TNR = TN/TN + FP.

Preciznost je tedy podíl skutečně pozitivních mezi všemi, které model označil za pozitivní, úplnost podíl odhalených mezi všemi skutečně pozitivními a specificita podíl správně poznaných mezi skutečně negativními.

Laicky řečeno

Preciznost odpovídá na otázku pacienta: „Test mi vyšel pozitivní — jak moc se mám bát?“ Úplnost odpovídá na otázku lékaře: „Kolik nemocných mi test najde?“ Při prahu 1,5 je preciznost 28/96 = 0,292 a úplnost 28/50 = 0,560. Pozitivní výsledek tedy znamená nemoc jen asi ve třech případech z deseti — i když test pozná 92,8 % zdravých. Je to stejný jev jako v dílu o Bayesově větě: u vzácné nemoci převáží falešné poplachy, protože zdravých je devatenáctkrát víc.

Ta souvislost s Bayesovou větou jde napsat přesně. Vydělíme-li TP i FP počtem lidí n, dostaneme TP/n = π · TPR a FP/n = (1 − π) · FPR, kde FPR = FP/FP + TN = 1 − specificita je podíl falešně pozitivních mezi zdravými:

preciznost = π · TPR/π · TPR + (1 − π) · FPR

π · TPR
podíl všech lidí, kteří jsou nemocní a test je chytil — tmavě červená plocha v grafu skóre; v čitateli je, protože právě ti z pozitivních mají pravdu
(1 − π) · FPR
podíl všech lidí, kteří jsou zdraví, a test přesto zazvonil — zelená plocha v grafu; jen ve jmenovateli, protože ředí pozitivní výsledky. I malé FPR se tu násobí velkým 1 − π
Preciznost je podíl „pravých“ poplachů mezi všemi poplachy — a ten podíl závisí na prevalenci π, i když se test sám nezmění.

Při prahu 1,5 je TPR = 0,560 a FPR = 68/950 = 0,0716, takže (barvy podle vzorce výše) preciznost = 0,05 · 0,560/0,05 · 0,560 + 0,95 · 0,0716 = 0,028/0,028 + 0,068 = 0,292 — totéž co 28/96 z matice záměn.

Definice — míra F1

Nechť P ∈ [0, 1] je preciznost a R ∈ [0, 1] úplnost téhož klasifikátoru a P + R > 0. Míra F1 je jejich harmonický průměr

F1 = 2/1/P + 1/R = 2PR/P + R.

Obecněji pro β > 0 je

Fβ = (1 + β2)PR/β2P + R;

Fβ dává úplnosti βkrát větší váhu než preciznosti (β = 1 je F1). Vyjde-li P = R = 0, klade se Fβ = 0.

Laicky řečeno

Jedno číslo, které je vysoké, jen když jsou vysoké obě složky. Harmonický průměr se táhne k menšímu z čísel: model s precizností 1 a úplností 0,01 má aritmetický průměr přes 0,5, ale F1 jen 0,02. Model „všichni zdraví“ má F1 rovnou 0 — paradox přesnosti zmizí.

Příklad — F1 přímo z matice záměn

Dosadíme-li P = TP/TP + FP a R = TP/TP + FN do 2PR/P + R a zkrátíme, vyjde F1 = 2 TP/2 TP + FP + FN. Skutečně negativní (TN) ve vzorci vůbec nejsou — proto je F1 vůči tisícům správně poznaných zdravých slepá a paradox přesnosti se jí netýká.

Při prahu 1,5: F1 = 2 · 28/2 · 28 + 68 + 22 = 56/146 = 0,384. Přes preciznost a úplnost: 2 · 0,292 · 0,560/0,292 + 0,560 = 0,384.

Pro screening, kde je přehlédnutí horší, se hodí F2 (β = 2: úplnost váží dvakrát víc, ve vzorci jako β2 = 4). U prahu 1,0 vyjde F2 = 5 · 0,196 · 0,740/4 · 0,196 + 0,740 = 0,476, u prahu 1,5 0,473 a u prahu 2,0 jen 0,403 — F2 by tedy volila nižší práh než F1, přesně jak má.

Všechna tahle čísla závisí na prahu. Nízký práh pošle na vyšetření skoro všechny nemocné, ale i spoustu zdravých; vysoký práh poplachy omezí, ale nemocné přehlíží:

PráhTPFPFNpřesnostpreciznostúplnostF1
0,54429260,7020,1310,8800,228
1,037152130,8350,1960,7400,310
1,52868220,9100,2920,5600,384
2,02028300,9420,4170,4000,408
2,51111390,9500,5000,2200,306
„všichni zdraví“00500,950—0,0000,000

Největší F1 (0,446) dává práh 1,81: preciznost 0,403, úplnost 0,500. To ale neznamená, že je to správný práh. Pro screening rakoviny je přehlédnutí mnohem horší než zbytečné vyšetření, takže se volí nízký práh a vysoká úplnost; pro spamový filtr, který nesmí zahodit důležitý e-mail, je to naopak. Volba prahu není otázka statistiky, ale toho, kolik stojí která chyba.

6. Křivka ROC a AUC

Tabulka s pěti prahy je nepohodlná. Chtěli bychom vidět všechny prahy naráz — a umět porovnat dva modely, aniž bychom se předem rozhodli pro práh.

Definice — křivka ROC a AUC

Nechť s1, …, sn ∈ ℝ jsou skóre a y1, …, yn ∈ {0, 1} skutečné třídy, přičemž pozitivních je P = |{i : yi = 1}| ≥ 1 a negativních N = n − P ≥ 1. Pro práh t ∈ ℝ ∪ {−∞, +∞} je ŷi(t) = 1, právě když si ≥ t; TP(t), FP(t) jsou příslušné počty z matice záměn a

TPR(t) = TP(t)/P,   FPR(t) = FP(t)/N

(úplnost a podíl falešně pozitivních mezi negativními). Křivka ROC (receiver operating characteristic) je lomená čára v [0, 1]2, která spojuje body

{(FPR(t), TPR(t)) : t ∈ ℝ ∪ {−∞, +∞}}

seřazené podle klesajícího t; vede z bodu (0, 0) (t = +∞, nikdo pozitivní) do (1, 1) (t = −∞, všichni pozitivní).

AUC (area under curve) je plocha pod křivkou ROC. Platí (rámeček níže)

AUC = 1/P · N ∑i : yi = 1 ∑j : yj = 0 ([si > sj] + ½ [si = sj]),

kde [A] je 1, právě když výrok A platí, jinak 0. AUC je tedy pravděpodobnost, že náhodně vybraný pozitivní případ má vyšší skóre než náhodně vybraný negativní (shoda se počítá napůl). Náhodné hádání má AUC 0,5, dokonalý model 1.

Laicky řečeno

Posouváme práh odshora dolů a sledujeme, kolik nemocných jsme už „chytili“ a kolik zdravých jsme za to museli zbytečně vyděsit. Dobrý test stoupá rychle nahoru, dokud ještě nikoho zdravého neobtěžuje. AUC říká, jak dobře skóre řadí lidi — nezávisle na tom, kde nakonec práh uděláme. Název pochází z druhé světové války: tak se hodnotilo, jak dobře operátoři radarů rozeznají letadlo od šumu.

AUC = 1/P · N ∑i ∈ poz ∑j ∈ neg ( [si > sj] + ½ [si = sj] )

∑i ∈ poz
každý z P pozitivních (nemocných, červená křivka v grafu skóre)…
∑j ∈ neg
…postavíme proti každému z N negativních (zdravých, zelená křivka) — AUC je soutěž dvojic, práh v ní nevystupuje
[si > sj]
1, když skóre seřadilo dvojici správně (nemocný výš), jinak 0; hranaté závorky jsou „1, pokud platí“
½ [si = sj]
shoda skóre je napůl dobře, napůl špatně — jako hod mincí; bez ní by AUC závisela na tom, jak shody rozhodneme
1/P · N
dělíme počtem všech dvojic, takže vyjde podíl správně seřazených, číslo mezi 0 a 1
U nás P · N = 50 · 950 = 47 500 dvojic. To, že podíl správně seřazených dvojic je totéž co plocha pod křivkou ROC, platí přesně: každý krok křivky doprava (jeden zdravý) přidá sloupec s výškou rovnou podílu nemocných, kteří mají skóre vyšší než on.
000,50,511 000,50,511 AUC = 0,869 náhoda (5 %) podíl falešně pozitivních FPR (0–1) úplnost (0–1) úplnost TPR (0–1) preciznost (0–1)
Křivka ROC (vlevo) a křivka preciznost–úplnost (vpravo) Žlutá tečka je práh 1,5.

Náš test má AUC 0,869. Pro dvě normální rozdělení posunutá o 1,8 by teoreticky vyšla 0,898; rozdíl je náhoda — nemocných máme jen 50, takže odhad AUC kolísá. I tohle patří k vyhodnocení: každá metrika spočtená na konečném vzorku je jen odhad a má svou nejistotu.

Věta — AUC dvou normálních rozdělení

Nechť δ ∈ ℝ, S− ∼ N(0, 1) je skóre náhodně vybraného negativního případu a S+ ∼ N(δ, 1) skóre náhodně vybraného pozitivního případu, S+ a S− nezávislé, a nechť AUC = P(S+ > S−) (populační protějšek definice výše; shody mají u spojitých rozdělení pravděpodobnost 0). Označme Φ distribuční funkci standardního normálního rozdělení N(0, 1). Pak

AUC = Φ(δ/√2).

Důkaz: AUC = P(S+ > S−) = P(S+ − S− > 0). Rozdíl nezávislých normálních veličin je normální se střední hodnotou δ − 0 = δ a rozptylem 1 + 1 = 2. Po normování Z = S+ − S− − δ/√2 ∼ N(0, 1) je P(S+ − S− > 0) = P(Z > −δ/√2) = Φ(δ/√2), protože rozdělení N(0, 1) je symetrické. ∎

Pro náš posun δ = 1,8: δ/√2 = 1,8/1,414 = 1,273 a Φ(1,27) = 0,898.

Spočítat AUC přímo podle definice znamená projít všech 47 500 dvojic; u milionu lidí se stejnou prevalencí by to bylo 47,5 miliardy. Rychlejší je lidi jednou seřadit a sečíst pořadí pozitivních (Mannův–Whitneyův vzorec):

def auc(lide):
    serazeni = sorted(lide, key=lambda c: c.skore)        # vzestupně, pořadí 1 … n
    R = sum(poradi for poradi, c in enumerate(serazeni, 1) if c.nemocny)
    # shody skóre dostanou průměrné pořadí (tady žádné nejsou)
    P = pocet_nemocnych(lide); N = len(lide) - P
    return (R - P * (P + 1) / 2) / (P * N)

Proč to funguje: nemocný na pořadí r předběhl r − 1 lidí, z toho všechny níž postavené nemocné. Odečtením 1 + 2 + … + P = P(P + 1)/2 zbude jen počet předběhnutých zdravých — čitatel z rámečku nahoře. U nás je součet pořadí nemocných R = 42 564, takže AUC = 42 564 − 50 · 51/2/47 500 = 42 564 − 1 275/47 500 = 41 289/47 500 = 0,869 (jmenovatel je počet dvojic P · N, barva podle vzorce v rámečku výše).

7. Když je pozitivních málo

Křivka ROC má jednu vlastnost, která je současně výhodou i pastí: nezávisí na prevalenci. Úplnost se počítá jen z nemocných a podíl falešně pozitivních jen ze zdravých — kolik je kterých, je jí jedno. Kdyby byla polovina lidí nemocná, vyšla by stejně (u nás AUC 0,892 — opět jen náhodou trochu jinak).

Definice — křivka preciznost–úplnost

Nechť skóre, třídy, P, N a TP(t), FP(t) jsou jako v definici křivky ROC. Pro každý práh t s TP(t) + FP(t) > 0 označme

úplnost(t) = TP(t)/P,   preciznost(t) = TP(t)/TP(t) + FP(t).

Křivka preciznost–úplnost (PR) je množina bodů {(úplnost(t), preciznost(t))} pro všechny takové prahy — úplnost na vodorovné ose, preciznost na svislé. Model, jehož skóre na třídě nezávisí, má (v očekávání) při každém prahu preciznost rovnou prevalenci π = P/P + N; plocha pod křivkou se nazývá průměrná preciznost (average precision, definice níže).

Laicky řečeno

Preciznost na prevalenci závisí hodně. Stejný test se stejným prahem 1,5 by při polovině nemocných měl preciznost 0,890 místo 0,292 — pozitivní výsledek by skoro jistě znamenal nemoc. Křivka ROC tenhle rozdíl nevidí, PR křivka ano. Proto se u vzácných jevů (podvody, vyhledávání, detekce vad) hodnotí spíš PR křivkou.

Na pravém grafu je to vidět: ROC vypadá sebevědomě, ale PR křivka ukazuje, že preciznosti nad 0,5 dosáhneme jen při úplnosti pod čtvrtinu. Úplně vlevo PR křivka skáče — při prvních pár pozitivních rozhoduje každý jednotlivý člověk.

Příklad — preciznost při polovině nemocných

Vzorec preciznost = π · TPR/π · TPR + (1 − π) · FPR z oddílu o preciznosti ukazuje, co se změní. Ve vzorku s polovinou nemocných má práh 1,5 TPR = 306/500 = 0,612 a FPR = 38/500 = 0,076 — podobně jako předtím, test je týž. Jenže teď π = 0,5:

0,5 · 0,612/0,5 · 0,612 + 0,5 · 0,076 = 0,306/0,344 = 0,890.

Zelený člen ve jmenovateli, dřív násobený 0,95, se teď násobí jen 0,5 a falešné poplachy přestanou převažovat. S přesně stejnými TPR a FPR jako v původním vzorku by vyšlo 0,887; rozdíl proti 0,890 je jen náhoda jiného vzorku.

Definice — průměrná preciznost (AP)

Nechť n příkladů se skóre a třídami yi ∈ {0, 1} je seřazeno podle skóre sestupně (bez shod skóre) a mezi nimi je P ≥ 1 pozitivních. Pro k = 1, …, n označme TPk počet pozitivních mezi prvními k příklady a

Pk = TPk/k,   Rk = TPk/P,   R0 = 0

(preciznost a úplnost, když za pozitivní prohlásíme prvních k). Průměrná preciznost je

AP = ∑k=1n (Rk − Rk−1) · Pk.

Rozdíl Rk − Rk−1 je nenulový (rovný 1/P), právě když k-tý příklad je pozitivní, takže AP je průměr preciznosti zaznamenané v okamžicích, kdy narazíme na další pozitivní.

Náš test má AP = 0,356. Náhodné skóre by mělo AP zhruba rovné prevalenci, 0,05 — test je tedy asi sedmkrát lepší než náhoda, ale od dokonalé jedničky má daleko. AUC 0,869 vyznívá mnohem optimističtěji, přestože popisuje tentýž test.

8. Chyba u regrese

Když model předpovídá číslo místo třídy, matice záměn nedává smysl. Měříme, jak daleko jsou předpovědi ŷi od skutečnosti yi.

Definice — MSE, RMSE, MAE a koeficient determinace

Nechť n ≥ 1, y1, …, yn ∈ ℝ jsou skutečné hodnoty a ŷ1, …, ŷn ∈ ℝ předpovědi modelu. Definujeme

  1. střední kvadratickou chybu MSE = 1/n ∑i=1n (yi − ŷi)2;
  2. její odmocninu RMSE = √MSE;
  3. střední absolutní chybu MAE = 1/n ∑i=1n |yi − ŷi|;
  4. pro ȳ = 1/n ∑i=1n yi a Var(y) = 1/n ∑i=1n (yi − ȳ)2 > 0 (ne všechna yi jsou stejná) koeficient determinace R2 = 1 − MSE/Var(y) ∈ (−∞, 1].

R2 porovnává model s konstantní předpovědí ŷi = ȳ, jejíž MSE je právě Var(y): R2 = 1, právě když ŷi = yi pro všechna i; 0 není lepší než průměr, záporné hodnoty jsou horší.

Laicky řečeno

RMSE i MAE jsou v jednotkách předpovídané veličiny („mýlíme se průměrně o 80 korun“). RMSE trestá velké chyby víc, protože je umocňuje — jedna obří chyba ji zvedne výrazně, MAE jen trochu. R2 je bez jednotek a říká, kolik rozptylu dat model vysvětlil. Polynom stupně 3 z křížové validace má na testu RMSE 0,106, MAE 0,084 a R2 = 0,977; konstanta (stupeň 0) má R2 prakticky nulové, −0,008.

R2 = 1 − MSE/Var(y), kde Var(y) = 1/n ∑ (yi − ȳ)2

MSE
chyba našeho modelu — kolik rozptylu kolem jeho předpovědí ještě zbývá
Var(y)
chyba nejhloupějšího rozumného modelu, který vždy řekne průměr ȳ; jeho MSE je přesně rozptyl dat. Je tu jako měřítko: dělením zmizí jednotky i velikost čísel
1 −
z „jaký podíl rozptylu zbyl“ dělá „jaký podíl jsme vysvětlili“, aby větší číslo znamenalo lepší model
Model, který neumí víc než průměr, má R2 = 0; nic ale nebrání být horší než průměr — pak je R2 záporné.
Příklad — R² stupně 3 a proč RMSE trestá velké chyby

Testovací y = sin(2πx) na 201 bodech má průměr 0 a rozptyl 0,4975 (pro spojitou sinusovku by to byla přesně 1/2). Stupeň 3 má RMSE 0,1064, tedy MSE = 0,10642 ≈ 0,0113, takže (barvy podle vzorce výše) R2 = 1 − 0,0113/0,4975 = 0,977. Konstanta má MSE 0,5013, o kousek víc než rozptyl — proto R2 = 1 − 0,5013/0,4975 = −0,008: konstanta −0,061 z trénovacích bodů trefila průměr testu o něco hůř než 0.

A k rozdílu RMSE a MAE: pět chyb 1, 1, 1, 1, 1 dává MAE = 1 i RMSE = 1. Když jednu z nich zvětšíme na 6, je MAE = 4 + 6/5 = 2, ale RMSE = √4 · 1 + 36/5 = √8 ≈ 2,83. Jediný velký omyl RMSE skoro ztrojnásobí, MAE jen zdvojnásobí.

9. Jak se měří velké jazykové modely

U chatbota není jedno správné číslo, které by se dalo porovnat s předpovědí. Používá se proto několik přístupů, a každý má své slabiny:

  • Benchmarky — sady otázek se známou odpovědí, například MMLU (2020) s výběrem ze čtyř možností ve 57 oborech, nebo úlohy z programování, kde se odpověď ověří spuštěním testů. Výsledkem je obyčejná přesnost.
  • Kontaminace — jazykové modely se učí na velké části internetu, a tam bývají i otázky z benchmarků. Je to únik dat ve velkém: model může odpověď znát nazpaměť. Proto vznikají nové, neveřejné nebo průběžně obměňované sady.
  • Lidské hodnocení — lidé porovnávají dvě odpovědi naslepo a vybírají lepší; z tisíců takových soubojů se spočte pořadí podobné šachovému Elu (tak funguje třeba Chatbot Arena). Měří to, co se lidem líbí — a to není totéž co pravdivost.
  • Model jako soudce — odpovědi hodnotí jiný jazykový model. Je to levné a rychlé, ale soudce má vlastní předsudky: třeba upřednostňuje delší odpovědi.
Definice — Elo hodnocení

Nechť hráč (model) A má hodnocení RA ∈ ℝ, jeho soupeř B hodnocení RB ∈ ℝ a K > 0 je konstanta (v šachu obvykle 10 až 40), která určuje, jak rychle se hodnocení hýbe. V dnes běžné logistické podobě systému Arpada Ela (šachy, 60. léta; Elo sám počítal s normálním rozdělením):

  1. očekávaný výsledek hráče A je EA = 1/1 + 10(RB − RA)/400 ∈ (0, 1);
  2. po zápase s výsledkem SA ∈ {0, ½, 1} (prohra, remíza, výhra) se hodnocení změní na RA ← RA + K(SA − EA).

Protože EA + EB = 1, ztratí B přesně tolik, kolik A získá.

Příklad: model s 1 200 proti modelu s 1 000 má E = 1/1 + 10−0,5 = 1/1,316 = 0,760. Když vyhraje, s K = 32 získá jen 32 · (1 − 0,760) = 7,7 bodu; když prohraje, ztratí 32 · 0,760 = 24,3. Překvapivý výsledek hýbe hodnocením víc než očekávaný.

Chatbot Arena podle svého popisu (Chiang a kol., 2024) dnes nepočítá Elo zápas po zápase, ale prokládá všechny souboje najednou modelem Bradleyho–Terryho, který má pro pravděpodobnost výhry tentýž tvar; výsledek se nemění podle pořadí, v jakém souboje přišly.

Příklad — jak přesné je skóre na benchmarku

Přesnost na n otázkách je odhad pravděpodobnosti p, že model odpoví správně. Odpovědi jsou (zjednodušeně) nezávislé pokusy, takže směrodatná chyba odhadu je √p(1 − p)/n a 95% interval je zhruba ± 2 směrodatné chyby.

Model s přesností 80 % na 1 000 otázkách: √0,8 · 0,2/1 000 = √0,00016 ≈ 0,0126, interval tedy asi ± 2,5 procentního bodu. Dva modely s 80 % a 82 % na takovém testu od sebe spolehlivě odlišit nejdou — stejně jako u AUC výše je i tohle číslo jen odhad.

Nad tím vším visí Goodhartův zákon: když se z ukazatele stane cíl, přestane být dobrým ukazatelem. Na benchmark, podle kterého se modely porovnávají, se vývojáři — i nechtěně — začnou ladit, až přestane měřit to, co měřit měl. Je to stejná past jako ladění na testovací sadě, jen v měřítku celého oboru.

10. Shrnutí

  • Model se učí na trénovací sadě, nastavuje na validační a měří jednou na testovací; únik dat dělá z odhadu chyby iluzi.
  • Pětinásobná křížová validace na 30 bodech vybrala polynom stupně 3 — ten je nejlepší i na testu, zatímco trénovací chyba by vybrala stupeň 10.
  • U nevyvážených dat přesnost klame: „všichni zdraví“ má 95 % a neodhalí nikoho.
  • Preciznost, úplnost a F1 se počítají z matice záměn a závisí na prahu; práh se volí podle toho, kolik stojí která chyba.
  • Křivka ROC shrnuje všechny prahy a nezávisí na prevalenci (náš test AUC 0,869); u vzácných jevů je poctivější křivka preciznost–úplnost.
  • U jazykových modelů hrozí kontaminace benchmarků a Goodhartův zákon.

Chcete si to osahat? Nechte AI agenta vzít libovolný model z předchozích dílů, spočítat jeho matici záměn a nakreslit ROC — a pak zkuste data uměle znevyvážit a sledujte, co se stane s přesností a co s F1.

Máte na to jiný názor? Napište na support@coden-app.com.

Agent na vašem počítači, ovládaný z telefonu