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ů.
Série Základy AI Díl 44 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- 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:
- trénovací sada {(xi, yi) : i ∈ Itr} — z ní se učí parametry modelu;
- 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ě);
- 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.
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:
- 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ě);
- 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ší).
Ú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:
- 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);
- pro každé c = 1, …, k naučí model f̂(−c) jen na datech {(xi, yi) : i ∉ Cc};
- 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.
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ů
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.
| Stupeň | 0 | 1 | 3 | 5 | 8 | 10 |
|---|---|---|---|---|---|---|
| chyba na tréninku | 0,698 | 0,424 | 0,196 | 0,193 | 0,181 | 0,172 |
| křížová validace | 0,717 | 0,492 | 0,230 | 0,262 | 0,509 | 0,714 |
| chyba na testu | 0,708 | 0,451 | 0,106 | 0,122 | 0,145 | 0,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í“.
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:
- skutečně pozitivní (true positive): TP = |{i : ŷi = 1 ∧ yi = 1}|;
- falešně pozitivní (chyba prvního druhu): FP = |{i : ŷi = 1 ∧ yi = 0}|;
- falešně negativní (chyba druhého druhu): FN = |{i : ŷi = 0 ∧ yi = 1}|;
- 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}|.
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ášť.
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].
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ř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:
- preciznost (precision), je-li TP + FP > 0 (model aspoň jednou řekl „pozitivní“): preciznost = TP/TP + FP;
- ú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;
- 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.
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 − π
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.
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áh | TP | FP | FN | přesnost | preciznost | úplnost | F1 |
|---|---|---|---|---|---|---|---|
| 0,5 | 44 | 292 | 6 | 0,702 | 0,131 | 0,880 | 0,228 |
| 1,0 | 37 | 152 | 13 | 0,835 | 0,196 | 0,740 | 0,310 |
| 1,5 | 28 | 68 | 22 | 0,910 | 0,292 | 0,560 | 0,384 |
| 2,0 | 20 | 28 | 30 | 0,942 | 0,417 | 0,400 | 0,408 |
| 2,5 | 11 | 11 | 39 | 0,950 | 0,500 | 0,220 | 0,306 |
| „všichni zdraví“ | 0 | 0 | 50 | 0,950 | — | 0,000 | 0,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.
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
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).
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
- střední kvadratickou chybu MSE = 1/n ∑i=1n (yi − ŷi)2;
- její odmocninu RMSE = √MSE;
- střední absolutní chybu MAE = 1/n ∑i=1n |yi − ŷi|;
- 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ší.
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
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):
- očekávaný výsledek hráče A je EA = 1/1 + 10(RB − RA)/400 ∈ (0, 1);
- 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.