
Co je overfitting/underfitting a jak funguje?
O jakém jevu tady vůbec plánuji mluvit? A k čemu je nám dobré tyto jevy znát? I přesto, že se statistice nebo umělé inteligenci nevěnujete, a ani neplánujete věnovat, tento jev se vyskytuje ve spoustě příkladů z reálného světa.
Kde se vyskytují?
Tyto jevy se objevují když se snažíme natrénovat nějaký „chytrý“ algoritmus (neuronovou síť, algoritmus strojového učení, atd.). Stejně jako lidi, i tyto algoritmy se mohou jaksi špatně naučit na trénovacích datech. Pak můžou vzniknout právě tyto dva jevy.

Zde na grafu je zachycen trénovací proces „typického chytrého“ algoritmu strojového učení. A taky zde dovysvětlím pár pojmů:
- Epochs – počet epoch které algoritmus provede (1 Epocha – situace, za které algoritmus projde celý trénovací dataset).
- Early Stopping – Optimalizační technika která sníží možnost overfitování na datasetu, bez toho aby snížila přesnost modelu.
- Loss – ztráta, resp. metrika ve které se měří přesnost modelu (čím nižší ztráta, tím líp!).
- Validation & Training – dva různé datasety, každý slouží k něčemu jinému, např. Training dataset slouží k natrénování samotného modelu, zatímco Validation dataset slouží k validaci (vyhodnocení) tohoto modelu
Nutno podotknouti (k validation a training dataset), že u trénovacího datasetu se ztráta snižuje, zatímco u validace může narůstat, to je první známka Overfittování!
Underfitting
Underfitting (v češtině podtrénování), je situace, ve které se model nedokáže naučit tak dobře souvislost mezi daty, a tak je začne predikovat špatně (model plně nepochopí data) a tím má zbytečně velkou ztrátu a malou přesnost.
Tohle se například dá vidět při použití lineární regrese na nelineární data (obrázek pod tímto odstavcem). Model se nedokázal plně naučit vztahy mezy jednotlivými daty a díky tomu se vlastně naučil špatně. Zde ale bohužel u lineární regrese nic nezmůžeme, protože rovnice má předpis y = ax + b, a jediný měnitelný parametr je parametr a – který pouze ovlivňuje náklon, b – pouze ovlivňuje posunutí na y souřadnici. K tomu abychom dosáhli větší přesnosti, musíme použít napříkad Polynomiální regresi.

Overfitting
Overfitting (v češtině přeučení), jak už název sám napovídá, tento jev bude způsoben tím že se náš chytrý algoritmus přeučí na něčem, tím pádem bude hledat až moc souvislostí mezi datem, a místo aby zanedbával odchylky (a generalizoval), tak má tendenci započítat všechny veličiny tak aby zmenšil ztrátu a tím dostaneme naprosto nekvalitní algoritmus.
Berme třeba náš příklad s lineární regresí, dejme tomu že jsme zvolili polynomiální regresi, ale máme ji na datech s velkým šumem. Obrázek dole nám to dost dobře ukazuje.

Jak proti tomuhle bojovat?
Tak u underfittování je to lehké, stačí buď změnit algoritmus (použít složitější), změnit omezení které mu dáváme, a nebo upravit trénovací parametry (počet epoch, ztrátovou funkci, optimizátor)
U overfittování je to složitější, a zde jsou možnosti, jak tomu předejít:
Více dat: čím více dat budeme mít, tím více bude muset model generalizovat, a díky tomu upustí od overfittování (samozřejmě se to nesmí přehánět), u problému klasifikace pak musíme dávat pozor abychom brali data která jsou doopravdy reprezentativní pro svoji třídu
Augmentace dat: tento pojem vysvětlím velmi jednoduše, prakticky v této části se snažíme, aby se model podíval na data jiným způsobem (u detekce objektů v obrázku například přidáváme obrázky které jsou jen přetočené nebo přeškálované, aby se algoritmus naučil jiný typ dat)
Přidání více hluku k datům: Tento způsob nebude tak dobře fungovat u polynomiální regrese, kde je pak stále velká možnost přeučení. Zároveň zde snižujeme přesnost modelu.
Cross-validace: Dataset bude rozdělen do částí, na kterých se bude model iterativně trénovat a z toho se následně upraví parametry (velmi efektivní a robustní metoda)
Regularizace: Znemožníme modelu zvolit jisté extrémní parametry tak, že mu nastavíme limity parametrů (limit, do kterého jde hodnota parametru nastavit)
Early stopping: Modelu nastavíme brzké stopnutí, tak aby se dál netrénoval. A díky tomu nepřetrénoval (toto jde vidět na 1. obrázku, kde je přímka označující mez early stoppingu)
