rendem foristTakéRandom Forests, RF klasifikátor, náhodný rozhodovací lesPokročilý
Definice
Random forest je algoritmus strojového učení, který kombinuje stovky rozhodovacích stromů natrénovaných na náhodných výběrech dat i příznaků a jejich hlasy nebo průměry spojí do jedné predikce. Tímto zprůměrováním potlačí sklon jednotlivého stromu k přeučení a dosahuje stabilních výsledků na tabulkových datech bez náročného ladění.
Než se na to spolehnete: Wikidata Q-identifikátor pro Random forest jsem uvedl podle paměti a nemusí sedět; doporučuji ověřit. Podíl dat mimo bootstrapový vzorek (cca třetina, přesněji 1/e) je uveden zaokrouhleně.
Proč jeden strom nestačí
Rozhodovací strom se učí tak, že data postupně dělí podle prahových hodnot příznaků. Když ho necháme růst do hloubky, dokáže si zapamatovat prakticky každý trénovací záznam: na trénovací sadě je téměř bezchybný, na nových datech kolísá. Malá změna vstupu přitom může celý strom přestavět, protože se změní volba dělení hned u kořene. Takový model má nízké zkreslení, ale obrovský rozptyl.
Random forest tento rozptyl řeší tím, že místo jednoho stromu postaví celý les a výsledky zprůměruje. Chyby jednotlivých stromů se navzájem částečně vyruší, pokud nejsou příliš korelované. Právě proto stojí algoritmus na dvou zdrojích náhody.
Dvě vrstvy náhody
Bagging trénovacích dat
Každý strom dostane vlastní bootstrapový vzorek: z původní sady se náhodně losuje s vracením, takže některé záznamy chybí a jiné se opakují. Zhruba třetina dat se do konkrétního stromu nedostane a tvoří jeho out-of-bag sadu, na které lze zdarma odhadnout chybu bez samostatné validace.
Náhodný výběr příznaků
V každém uzlu se nehledá nejlepší dělení mezi všemi příznaky, ale jen mezi náhodnou podmnožinou (typicky odmocnina z počtu příznaků u klasifikace). Bez tohoto kroku by silný prediktor dominoval kořenu všech stromů a les by byl jen kopie sebe sama. Právě dekorelace stromů odlišuje random forest od prostého baggingu.
Co model prozradí o datech
Kromě predikce nabízí random forest odhad důležitosti příznaků. Klasická varianta sčítá pokles nečistoty (Gini nebo entropie) při dělení daným příznakem, spolehlivější je permutační důležitost: příznak se v out-of-bag datech náhodně zamíchá a měří se, o kolik se zhorší přesnost. První metoda nadhodnocuje spojité proměnné a kategorie s mnoha úrovněmi, proto se v analytické praxi častěji reportuje ta druhá.
Kde má les hranice
Random forest neextrapoluje: v regresi nikdy nepředpoví hodnotu mimo rozsah, který viděl v trénovacích datech, takže na trend v čase je nevhodný. Na řídkých vysokorozměrných datech (text, obraz) ho porážejí gradient boosting a neuronové sítě. Vycvičený les navíc žije celý v RAM: pět set hlubokých stromů nad milionem řádků znamená stovky megabajtů modelu a znatelnou latenci při inferenci. Vysvětlitelnost je také jen zdánlivá, jeden strom si přečtete, pět set ne.
Praktické ladění
- Počet stromů: čím víc, tím lépe, chyba se ustálí a nepřeučuje se jimi; limitem je čas a paměť.
- Hloubka a minimální velikost listu: hlavní brzda proti přeučení u zašuměných dat.
- Počet příznaků na dělení: nejcitlivější parametr, vyplatí se ho projet křížovou validací.
- Nevyvážené třídy: pomáhá vážení tříd nebo vyvážený bootstrap, samotný les menšinovou třídu ignoruje.
Standardizace vstupů ani odstranění odlehlých hodnot nejsou nutné, protože stromy pracují s pořadím hodnot, ne s jejich měřítkem.
Příklady z praxe
Scoring rizika u žádostí o půjčku
Fintech společnost má tabulku 200 tisíc žádostí s příjmem, délkou zaměstnání, historií splátek a informací o defaultu. Random forest s 300 stromy dá po pár minutách trénování rozumný scoring bez škálování proměnných a permutační důležitost ukáže, že nejvíc rozhoduje poměr splátky k příjmu. Model slouží jako baseline, proti kterému se poměřuje pozdější gradient boosting.
from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier( n_estimators=300, max_features="sqrt", min_samples_leaf=5, class_weight="balanced", oob_score=True, n_jobs=-1, random_state=42, ) model.fit(X_train, y_train) print(model.oob_score_)Detekce vadných kusů ve výrobě
Linka sbírá ze senzorů 80 veličin na každý vyrobený kus, zmetků je ale jen 1,5 procenta. Random forest natrénovaný bez úpravy vah predikuje skoro vždy "v pořádku" a vypadá na 98 procentech přesnosti skvěle, ve skutečnosti nechytí nic. Po nastavení vyváženého vzorkování a vyhodnocení podle recall a PR křivky model odhalí většinu vadných kusů a zároveň ukáže, které dva senzory nesou signál.
Časté omyly
- MýtusRandom forest se nemůže přeučit, tak mu prostě dám tisíc stromů.
- Ve skutečnostiPřidávání stromů opravdu nezpůsobuje přeučení, chyba se jen ustálí. Přeučit se ale les dokáže na zašuměných datech, když jsou stromy neomezeně hluboké a listy obsahují jediný záznam. Regulace se dělá hloubkou a minimální velikostí listu, ne počtem stromů.
- MýtusRandom forest je vysvětlitelný model, protože rozhodovací strom si člověk přečte.
- Ve skutečnostiJeden strom je čitelný, průměr pěti set stromů už ne. Random forest nabízí jen agregované důležitosti příznaků; pro vysvětlení konkrétní predikce je potřeba samostatný nástroj typu SHAP nebo lokální aproximace.
- MýtusData je před trénováním potřeba standardizovat a zbavit odlehlých hodnot.
- Ve skutečnostiStromy dělí podle prahů a zajímá je pořadí hodnot, takže změna měřítka nemá na výsledek vliv. Odlehlé hodnoty ovlivní nanejvýš pár listů. Kritické je naopak korektní zacházení s chybějícími hodnotami a kategoriemi s mnoha úrovněmi.
Časté dotazy
- Kolik stromů má mít random forest?
- Počet stromů se obvykle volí mezi 100 a 500. Random forest se dalšími stromy nepřeučuje, chyba jen postupně klesá a pak se ustálí, takže horní hranici určuje čas trénování, latence predikce a spotřeba paměti. Praktický postup je sledovat out-of-bag chybu proti počtu stromů a zastavit se tam, kde se křivka vyrovná. U malých datových sad stačí 100 stromů, u zašuměných úloh s mnoha příznaky se vyplatí jít výš, protože průměrování potřebuje víc členů, aby se rozptyl skutečně srazil.
- Kdy použít random forest místo gradient boostingu?
- Random forest se hodí, když je potřeba rychlý a robustní baseline bez zdlouhavého ladění hyperparametrů, protože výchozí nastavení bývá použitelné a model je málo citlivý na jejich volbu. Trénování stromů lze navíc plně paralelizovat. Gradient boosting typicky dosáhne o něco vyšší přesnosti na tabulkových datech, ale vyžaduje ladění rychlosti učení, hloubky a počtu iterací a snadněji se přeučí. V produkci se často začíná lesem a přechází se na boosting teprve tehdy, když má rozdíl v přesnosti měřitelnou hodnotu.
- K čemu slouží out-of-bag skóre?
- Out-of-bag skóre je odhad chyby modelu spočítaný na datech, která se kvůli bootstrapovému losování nedostala do konkrétního stromu. Každý záznam se vyhodnotí jen stromy, jež ho při trénování neviděly, což dává poctivý odhad zobecnění bez oddělené validační sady. Hodí se hlavně u menších datových sad, kde by se nerado obětovalo dalších dvacet procent řádků. U časových řad nebo dat se skupinovou strukturou je ale out-of-bag skóre optimistické a je lepší použít křížovou validaci respektující čas či skupiny.
- Zvládá random forest chybějící hodnoty?
- Random forest sám o sobě chybějící hodnoty neřeší a běžné implementace, například scikit-learn, vyžadují doplněná data. Původní Breimanův algoritmus obsahoval doplňování pomocí proximit mezi záznamy, v praxi se však častěji používá jednodušší imputace mediánem či nejčastější kategorií doplněná indikátorem chybějící hodnoty. Právě ten indikátor je důležitý, protože fakt chybějícího údaje sám o sobě často nese signál. Alternativou je použít implementaci gradient boostingu, která má zpracování chybějících hodnot zabudované přímo v algoritmu dělení.
Zdroje
- Random Forests(otevře se v novém okně)
- Random forest(otevře se v novém okně)
- Bootstrap aggregating(otevře se v novém okně)
- Decision tree learning(otevře se v novém okně)