Náhodný les v R Tutoriál: Algoritmus s příkladem
⚡ Chytré shrnutí
Náhodný les v R vytváří stovky rozhodovacích stromů na bootstrapovaných vzorcích a zprůměruje jejich hlasy do jedné robustní predikce. Tento návod ladí mtry, maxnodes a ntree s caret a vyhodnocuje finální model na datech o přežití Titanicu.

Co je Random Forest v R?
Náhodné lesy jsou založeny na jednoduché myšlence: „Moudrost davu“. Součet výsledků více prediktorů poskytuje lepší předpověď než nejlepší individuální prediktor. Skupina prediktorů se nazývá an soubor. Tak se tato technika nazývá Ensemble Learning.
V předchozím tutoriálu jste se naučili, jak používat rozhodovací stromy udělat binární předpověď. Abychom zlepšili naši techniku, můžeme trénovat skupinu Klasifikátory rozhodovacího stromu, každý na jiné náhodné podmnožině vlakové sady. Pro provedení predikce shromáždíte predikce všech jednotlivých stromů a vrátíte třídu, která získá nejvíce hlasů. Tato technika se nazývá Náhodný les.
Než začnete psát jakýkoli kód, je užitečné vidět, jak přesně je les z těchto jednotlivých stromů sestaven.
Jak funguje náhodný les v R?
Pochopení mechaniky usnadňuje uvažování o každém parametru ladění. Náhodný les se vytváří ve čtyřech fázích.
- Bootstrap vzorkování. Algoritmus vybere náhodný vzorek řádků s náhradou z trénovací sady pro každý strom. Z každého vzorku je vynechána zhruba třetina řádků; jedná se o pozorování „out-of-bag“ (OOB).
- Náhodný výběr rysů. Při každém rozdělení se bere v úvahu pouze náhodná podmnožina prediktorů. Velikost této podmnožiny je mtry parametr. Omezení výběru brání tomu, aby všechny stromy vypadaly stejně.
- Neprořezaný růst stromů. Každý strom roste, dokud se nezastavíping pravidlo jako například maxnodes or velikost uzluJednotlivým stromům je záměrně dovoleno převyšovat jejich tvar, protože jejich chyby nekorelují.
- Agregace. Pro klasifikaci les vrací třídu s nejvyšším počtem hlasů; pro regresi vrací průměrnou predikci. Tento krok průměrování je termín pytlování (bootstrapová agregace) popisuje.
Celý trik spočívá v řádkovém a sloupcovém vzorkování. Jeden hluboký strom má nízké zkreslení a velmi vysoký rozptyl; průměrování stovek stromů udržuje nízké zkreslení a zároveň snižuje rozptyl.
Chyba „mimo obal“. Protože každé pozorování je vyloučeno z přibližně třetiny stromů, R může vyhodnotit každý řádek pouze s použitím stromů, které ho nikdy neviděly. Výsledná chyba OOB je volně dostupný, vestavěný validační odhad vytištěný funkcí randomForest():
rf_oob <- randomForest(survived~., data = data_train, ntree = 800, mtry = 4) print(rf_oob) # reports the OOB estimate of error rate
Chyba OOB je pohodlná rychlá kontrola, ale tento tutoriál používá desetinásobnou křížovou validaci pomocí stříšky, takže každá ladicí mřížka je porovnávána na identických záhybech.
Náhodný les vs. rozhodovací strom v R
Náhodný les je souborem stejných rozhodovací stromy probrány v předchozím tutoriálu, takže je vhodné si rozdíly jasně uvést, než si mezi nimi vyberete.
| Kritéria | Rozhodovací strom | Náhodný les |
|---|---|---|
| Struktura | Jeden strom | Stovky stromů se spojily hlasováním |
| odchylka | Vysoká, velmi citlivá na trénovací vzorek | Nízké, průměrování ruší jednotlivé chyby |
| Riziko nadměrného vybavení | Vysoká, pokud není prořezána | Nízká i u neprořezaných stromů |
| Interpretovatelnost | Plně čitelný jako vývojový diagram | Čitelná je pouze proměnná důležitost |
| Náklady na školení | Velmi rychlá | Úměrné ntree |
| Vestavěné ověřování | Nevyplněno | Odhad chybovosti po vybalení z obalu |
| R funkce | rpart() | randomForest() |
Pokud musíte vysvětlit rozhodovací cestu netechnickému publiku, zvolte jeden strom. Pokud je prediktivní přesnost důležitější než čitelný diagram, zvolte les.
Výhody a nevýhody náhodného lesa
Vědět, kde je algoritmus silný a slabý, vám napoví, kdy se vyplatí vynaložit další úsilí na ladění.
Výhody
- Přesnost bez prořezávání: Průměrování mnoha nekorelovaných stromů poskytuje silné výsledky s velmi malým ručním laděním.
- Odolné vůči přeplnění: Přidání dalších stromů nikdy nezvýší chybu zobecnění, takže ntree lze bezpečně vyvolat.
- Zpracovává smíšená data: Numerické a faktorové prediktory fungují vedle sebe a škálování není nutné.
- Bezplatné ověření a hodnocení: Chyba OOB a varImp() se neobjevují bez dalších výpočetních nákladů.
Nevýhody
- Neprůhledné předpovědi: nemůžeš tracjediná rozhodovací cesta, na které záleží v regulovaném prostředí.
- Pomalá jízda ve velkých lesích: Čas trénování a predikce se lineárně škáluje s počtem stromů.
- Zkreslené skóre důležitosti: Kategorické proměnné s mnoha úrovněmi se mohou jevit důležitější, než ve skutečnosti jsou.
- Slabá extrapolace: Pro regresi les nikdy nemůže předpovídat mimo rozsah pozorovaný při trénování.
Po stanovení teorie a kompromisů následuje dalších šest kroků, kdy se vytvoří, vyladí a vyhodnotí náhodný les od začátku do konce na datové sadě o přežití Titanicu.
Krok 1) Importujte data
Abyste se ujistili, že máte stejnou datovou sadu jako v tutoriálu pro rozhodovací stromy, vlaková souprava a testovací sada jsou hostovány online. Můžete je importovat bez provedení jakýchkoli změn.
library(dplyr) data_train <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/train.csv") glimpse(data_train) data_test <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv") glimpse(data_test)
Krok 2) Trénujte model
Jedním ze způsobů, jak vyhodnotit výkon modelu, je trénovat ho na několika různých menších datových sadách a vyhodnotit je v rámci druhé menší testovací sady. Tomu se říká k-násobná křížová validace. R má funkci, která náhodně rozděluje data do k podmnožin téměř stejné velikosti. Například pokud k = 10, model je trénován na devíti násobcích a vyhodnocen na zbývající násobku. Tento proces se opakuje, dokud nejsou vyhodnoceny všechny podmnožiny. Tato technika se široce používá pro výběr modelu, zejména když má model parametry k ladění.
Nyní, když máme způsob, jak vyhodnotit náš model, musíme se rozhodnout, které parametry se nejlépe zobecní na neviditelná data.
Náhodný les vybírá náhodnou podmnožinu funkcí a vytváří mnoho rozhodovacích stromů. Model zprůměruje všechny předpovědi stromů rozhodnutí.
Náhodný les má některé parametry, které lze změnit pro zlepšení zobecnění predikce. K trénování modelu použijete funkci randomForest().
Syntaxe funkce randomForest() je:
randomForest(formula, ntree=n, mtry=FALSE, maxnodes = NULL) Arguments: - Formula: Formula of the fitted model - ntree: number of trees in the forest - mtry: Number of candidate variables drawn at each split. By default, it is the square root of the number of predictors for classification. - maxnodes: Set the maximum number of terminal nodes each tree can have - importance=TRUE: Whether independent variables importance in the random forest be assessed
Hodnocení: Náhodný les lze trénovat na více parametrech. Můžete odkazovat na viněta abyste viděli různé parametry.
Ladění modelu je únavná práce. Existuje mnoho možných kombinací parametrů. Nemusíte nutně mít čas vyzkoušet je všechny. Dobrou alternativou je nechat stroj, aby pro vás našel nejlepší kombinaci. Existují dvě dostupné metody:
- Náhodné vyhledávání
- Vyhledávání v mřížce
Obě metody jsou definovány níže, ale tento tutoriál trénuje model pomocí vyhledávání v mřížce.
Definice Grid Search
Metoda vyhledávání v mřížce je jednoduchá, model bude vyhodnocen přes všechny kombinace, které předáte ve funkci, pomocí křížové validace.
Například chcete vyzkoušet model s počtem 10, 20, 30 stromů a každý strom bude testován na počtu mtry rovnajícím se 1, 2, 3, 4, 5. Potom stroj otestuje 15 různých modelů:
.mtry ntrees 1 1 10 2 2 10 3 3 10 4 4 10 5 5 10 6 1 20 7 2 20 8 3 20 9 4 20 10 5 20 11 1 30 12 2 30 13 3 30 14 4 30 15 5 30
Algoritmus vyhodnotí:
randomForest(formula, ntree=10, mtry=1) randomForest(formula, ntree=10, mtry=2) randomForest(formula, ntree=10, mtry=3) randomForest(formula, ntree=20, mtry=2) ...
Každá kombinace je vyhodnocena křížovou validací. Nedostatkem mřížkového vyhledávání je počet experimentů: explozivně roste, když je počet kombinací vysoký. K překonání tohoto problému lze použít náhodné vyhledávání.
Definice náhodného vyhledávání
Velký rozdíl mezi náhodným vyhledáváním a vyhledáváním v mřížce spočívá v tom, že náhodné vyhledávání nevyhodnocuje všechny kombinace hyperparametrů v prohledávacím prostoru. Místo toho náhodně vybírá kombinaci v každé iteraci. Výhodou jsou mnohem nižší výpočetní náklady.
Nastavte parametr ovládání
Při konstrukci a vyhodnocení modelu budete postupovat následovně:
- Vyhodnoťte model s výchozím nastavením
- Najděte nejlepší počet mtry
- Najděte nejlepší počet maxnodů
- Najděte nejlepší počet nstromů
- Vyhodnoťte model na testovací datové sadě
Než začnete s průzkumem parametrů, musíte nainstalovat dvě knihovny.
- stříška: Knihovna strojového učení R. Pokud máte nainstalovat R s r-essential. Už je v knihovně
- Anaconda: conda install -cr r-caret
- e1071: Knihovna strojového učení R.
- Anaconda: conda install -cr r-e1071
Můžete je importovat spolu s randomForest:
library(randomForest) library(caret) library(e1071)
Výchozí nastavení
Křížová validace K-fold je řízena funkcí trainControl().
trainControl(method = "cv", number = n, search ="grid") arguments - method = "cv": The method used to resample the dataset. - number = n: Number of folds to create - search = "grid": Use the grid search method. For the randomized method, use "random" Note: You can refer to the vignette to see the other arguments of the function.
Můžete zkusit spustit model s výchozími parametry a zobrazit skóre přesnosti.
Hodnocení: Během celého kurzu budete používat stejné ovládací prvky.
# Define the control trControl <- trainControl(method = "cv", number = 10, search = "grid")
K vyhodnocení modelu použijete knihovnu stříšek. Knihovna má jednu funkci nazvanou train() pro vyhodnocení téměř všech strojové učení algoritmus. Řekněme jinak, tuto funkci můžete použít k trénování jiných algoritmů.
Základní syntaxe je:
train(formula, df, method = "rf", metric= "Accuracy", trControl = trainControl(), tuneGrid = NULL) argument - `formula`: Define the formula of the algorithm - `method`: Define which model to train. Note, at the end of the tutorial, there is a list of all the models that can be trained - `metric` = "Accuracy": Define how to select the optimal model - `trControl = trainControl()`: Define the control parameters - `tuneGrid = NULL`: Return a data frame with all the possible combination
Sestavme model s výchozími hodnotami.
set.seed(1234) # Run the model rf_default <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", trControl = trControl) # Print the results print(rf_default)
Code Vysvětlení
- trainControl(method=”cv”, number=10, search=”grid”): Vyhodnoťte model pomocí prohledávání mřížky přes 10 záhybů
- vlak(…): Trénujte náhodný model lesa. Nejlepší model je vybrán s mírou přesnosti.
Výstup:
## Random Forest ## ## 836 samples ## 7 predictor ## 2 classes: 'No', 'Yes' ## ## No pre-processing ## Resampling: Cross-Validated (10 fold) ## Summary of sample sizes: 753, 752, 753, 752, 752, 752, ... ## Resampling results across tuning parameters: ## ## mtry Accuracy Kappa ## 2 0.7919248 0.5536486 ## 6 0.7811245 0.5391611 ## 10 0.7572002 0.4939620 ## ## Accuracy was used to select the optimal model using the largest value. ## The final value used for the model was mtry = 2.
Algoritmus používá 500 stromů a testoval tři různé hodnoty mtry: 2, 6, 10.
Konečná hodnota použitá pro model byla mtry = 2 s křížově validovanou přesností 0.792. Zkusme dosáhnout vyššího skóre.
Hledat nejlepší mtry
Model můžete testovat s hodnotami mtry od 1 do 10
set.seed(1234) tuneGrid <- expand.grid(.mtry = c(1: 10)) rf_mtry <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, ntree = 300) print(rf_mtry)
Code Vysvětlení
- tuneGrid <- expand.grid(.mtry = c(1:10)): Sestrojí vektor s hodnotami od 1 do 10
Výstup:
## Random Forest ## ## 836 samples ## 7 predictor ## 2 classes: 'No', 'Yes' ## ## No pre-processing ## Resampling: Cross-Validated (10 fold) ## Summary of sample sizes: 753, 752, 753, 752, 752, 752, ... ## Resampling results across tuning parameters: ## ## mtry Accuracy Kappa ## 1 0.7572576 0.4647368 ## 2 0.7979346 0.5662364 ## 3 0.8075158 0.5884815 ## 4 0.8110729 0.5970664 ## 5 0.8074727 0.5900030 ## 6 0.8099111 0.5949342 ## 7 0.8050918 0.5866415 ## 8 0.8050918 0.5855399 ## 9 0.8050631 0.5855035 ## 10 0.7978916 0.5707336 ## ## Accuracy was used to select the optimal model using the largest value. ## The final value used for the model was mtry = 4.
Nejlepší hodnota mtry je 4. Je uložena v:
rf_mtry$bestTune$mtry
Můžete jej uložit a použít, když potřebujete doladit ostatní parametry.
max(rf_mtry$results$Accuracy)
Výstup:
## [1] 0.8110729
best_mtry <- rf_mtry$bestTune$mtry best_mtry
Výstup:
## [1] 4
Krok 3) Vyhledejte nejlepší maxnody
Musíte vytvořit smyčku pro vyhodnocení různých hodnot maxnodes. V následujícím kódu budete:
- Vytvořte seznam
- Vytvořte proměnnou s nejlepší hodnotou parametru mtry; Povinný
- Vytvořte smyčku
- Uložte aktuální hodnotu maxnode
- Shrňte výsledky
store_maxnode <- list() tuneGrid <- expand.grid(.mtry = best_mtry) for (maxnodes in c(5: 15)) { set.seed(1234) rf_maxnode <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, maxnodes = maxnodes, ntree = 300) current_iteration <- toString(maxnodes) store_maxnode[[current_iteration]] <- rf_maxnode } results_mtry <- resamples(store_maxnode) summary(results_mtry)
Code vysvětlení:
- store_maxnode <- seznam(): Výsledky modelu budou uloženy v tomto seznamu
- expand.grid(.mtry=best_mtry): Použijte nejlepší hodnotu mtry
- for (maxnodes in c(5:15)) { … }: Vypočítejte model s hodnotami maxnodes od 5 do 15.
- maxnodes = maxnodes: Pro každou iteraci se maxnodes rovná aktuální hodnotě smyčky, tj. 5, 6, 7, …
- current_iteration <- toString(maxnodes): Uloží hodnotu maxnodes jako řetězec.
- store_maxnode[[current_iteration]] <- rf_maxnode: Uloží výsledek modelu do seznamu.
- resamples(store_maxnode): Uspořádání výsledků modelu
- Summary(results_mtry): Vytiskne souhrn všech kombinací.
Výstup:
## ## Call: ## summary.resamples(object = results_mtry) ## ## Models: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ## Number of resamples: 10 ## ## Accuracy ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 5 0.6785714 0.7529762 0.7903758 0.7799771 0.8168388 0.8433735 0 ## 6 0.6904762 0.7648810 0.7784710 0.7811962 0.8125000 0.8313253 0 ## 7 0.6904762 0.7619048 0.7738095 0.7788009 0.8102410 0.8333333 0 ## 8 0.6904762 0.7627295 0.7844234 0.7847820 0.8184524 0.8433735 0 ## 9 0.7261905 0.7747418 0.8083764 0.7955250 0.8258749 0.8333333 0 ## 10 0.6904762 0.7837780 0.7904475 0.7895869 0.8214286 0.8433735 0 ## 11 0.7023810 0.7791523 0.8024240 0.7943775 0.8184524 0.8433735 0 ## 12 0.7380952 0.7910929 0.8144005 0.8051205 0.8288511 0.8452381 0 ## 13 0.7142857 0.8005952 0.8192771 0.8075158 0.8403614 0.8452381 0 ## 14 0.7380952 0.7941050 0.8203528 0.8098967 0.8403614 0.8452381 0 ## 15 0.7142857 0.8000215 0.8203528 0.8075301 0.8378873 0.8554217 0 ## ## Kappa ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 5 0.3297872 0.4640436 0.5459706 0.5270773 0.6068751 0.6717371 0 ## 6 0.3576471 0.4981484 0.5248805 0.5366310 0.6031287 0.6480921 0 ## 7 0.3576471 0.4927448 0.5192771 0.5297159 0.5996437 0.6508314 0 ## 8 0.3576471 0.4848320 0.5408159 0.5427127 0.6200253 0.6717371 0 ## 9 0.4236277 0.5074421 0.5859472 0.5601687 0.6228626 0.6480921 0 ## 10 0.3576471 0.5255698 0.5527057 0.5497490 0.6204819 0.6717371 0 ## 11 0.3794326 0.5235007 0.5783191 0.5600467 0.6126720 0.6717371 0 ## 12 0.4460432 0.5480930 0.5999072 0.5808134 0.6296780 0.6717371 0 ## 13 0.4014252 0.5725752 0.6087279 0.5875305 0.6576219 0.6678832 0 ## 14 0.4460432 0.5585005 0.6117973 0.5911995 0.6590982 0.6717371 0 ## 15 0.4014252 0.5689401 0.6117973 0.5867010 0.6507194 0.6955990 0
Nejvyšší průměrná přesnost v tomto rozsahu (0.8099) patří uzlu maxnodes = 14, na vrcholu testovaného intervalu. Protože nejlepší hodnota leží na okraji mřížky, měli byste vyhledávání rozšířit směrem nahoru.
store_maxnode <- list() tuneGrid <- expand.grid(.mtry = best_mtry) for (maxnodes in c(20: 30)) { set.seed(1234) rf_maxnode <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, maxnodes = maxnodes, ntree = 300) key <- toString(maxnodes) store_maxnode[[key]] <- rf_maxnode } results_node <- resamples(store_maxnode) summary(results_node)
Výstup:
## ## Call: ## summary.resamples(object = results_node) ## ## Models: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 ## Number of resamples: 10 ## ## Accuracy ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 20 0.7142857 0.7821644 0.8144005 0.8075301 0.8447719 0.8571429 0 ## 21 0.7142857 0.8000215 0.8144005 0.8075014 0.8403614 0.8571429 0 ## 22 0.7023810 0.7941050 0.8263769 0.8099254 0.8328313 0.8690476 0 ## 23 0.7023810 0.7941050 0.8263769 0.8111302 0.8447719 0.8571429 0 ## 24 0.7142857 0.7946429 0.8313253 0.8135112 0.8417599 0.8690476 0 ## 25 0.7142857 0.7916667 0.8313253 0.8099398 0.8408635 0.8690476 0 ## 26 0.7142857 0.7941050 0.8203528 0.8123207 0.8528758 0.8571429 0 ## 27 0.7023810 0.8060456 0.8313253 0.8135112 0.8333333 0.8690476 0 ## 28 0.7261905 0.7941050 0.8203528 0.8111015 0.8328313 0.8690476 0 ## 29 0.7142857 0.7910929 0.8313253 0.8087063 0.8333333 0.8571429 0 ## 30 0.6785714 0.7910929 0.8263769 0.8063253 0.8403614 0.8690476 0 ## ## Kappa ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 20 0.3956835 0.5316120 0.5961830 0.5854366 0.6661120 0.6955990 0 ## 21 0.3956835 0.5699332 0.5960343 0.5853247 0.6590982 0.6919315 0 ## 22 0.3735084 0.5560661 0.6221836 0.5914492 0.6422128 0.7189781 0 ## 23 0.3735084 0.5594228 0.6228827 0.5939786 0.6657372 0.6955990 0 ## 24 0.3956835 0.5600352 0.6337821 0.5992188 0.6604703 0.7189781 0 ## 25 0.3956835 0.5530760 0.6354875 0.5912239 0.6554912 0.7189781 0 ## 26 0.3956835 0.5589331 0.6136074 0.5969142 0.6822128 0.6955990 0 ## 27 0.3735084 0.5852459 0.6368425 0.5998148 0.6426088 0.7189781 0 ## 28 0.4290780 0.5589331 0.6154905 0.5946859 0.6356141 0.7189781 0 ## 29 0.4070588 0.5534173 0.6337821 0.5901173 0.6423101 0.6919315 0 ## 30 0.3297872 0.5534173 0.6202632 0.5843432 0.6590982 0.7189781 0
Nejvyšší průměrná přesnost, 0.8135, je dosažena s maxnodes = 24 (maxnodes = 27 se shoduje s průměrem, ale má dolní třetí kvartil). Pro zbývající kroky proto použijete maxnodes = 24.
Krok 4) Vyhledejte nejlepší nstromy
Nyní, když máte nejlepší hodnotu mtry a maxnode, můžete vyladit počet stromů. Metoda je úplně stejná jako u maxnode.
store_maxtrees <- list() for (ntree in c(250, 300, 350, 400, 450, 500, 550, 600, 800, 1000, 2000)) { set.seed(5678) rf_maxtrees <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, maxnodes = 24, ntree = ntree) key <- toString(ntree) store_maxtrees[[key]] <- rf_maxtrees } results_tree <- resamples(store_maxtrees) summary(results_tree)
Výstup:
## ## Call: ## summary.resamples(object = results_tree) ## ## Models: 250, 300, 350, 400, 450, 500, 550, 600, 800, 1000, 2000 ## Number of resamples: 10 ## ## Accuracy ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 250 0.7380952 0.7976190 0.8083764 0.8087010 0.8292683 0.8674699 0 ## 300 0.7500000 0.7886905 0.8024240 0.8027199 0.8203397 0.8452381 0 ## 350 0.7500000 0.7886905 0.8024240 0.8027056 0.8277623 0.8452381 0 ## 400 0.7500000 0.7886905 0.8083764 0.8051009 0.8292683 0.8452381 0 ## 450 0.7500000 0.7886905 0.8024240 0.8039104 0.8292683 0.8452381 0 ## 500 0.7619048 0.7886905 0.8024240 0.8062914 0.8292683 0.8571429 0 ## 550 0.7619048 0.7886905 0.8083764 0.8099062 0.8323171 0.8571429 0 ## 600 0.7619048 0.7886905 0.8083764 0.8099205 0.8323171 0.8674699 0 ## 800 0.7619048 0.7976190 0.8083764 0.8110820 0.8292683 0.8674699 0 ## 1000 0.7619048 0.7976190 0.8121510 0.8086723 0.8303571 0.8452381 0 ## 2000 0.7619048 0.7886905 0.8121510 0.8086723 0.8333333 0.8452381 0 ## ## Kappa ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 250 0.4061697 0.5667400 0.5836013 0.5856103 0.6335363 0.7196807 0 ## 300 0.4302326 0.5449376 0.5780349 0.5723307 0.6130767 0.6710843 0 ## 350 0.4302326 0.5449376 0.5780349 0.5723185 0.6291592 0.6710843 0 ## 400 0.4302326 0.5482030 0.5836013 0.5774782 0.6335363 0.6710843 0 ## 450 0.4302326 0.5449376 0.5780349 0.5750587 0.6335363 0.6710843 0 ## 500 0.4601542 0.5449376 0.5780349 0.5804340 0.6335363 0.6949153 0 ## 550 0.4601542 0.5482030 0.5857118 0.5884507 0.6396872 0.6949153 0 ## 600 0.4601542 0.5482030 0.5857118 0.5884374 0.6396872 0.7196807 0 ## 800 0.4601542 0.5667400 0.5836013 0.5910088 0.6335363 0.7196807 0 ## 1000 0.4601542 0.5667400 0.5961590 0.5857446 0.6343666 0.6678832 0 ## 2000 0.4601542 0.5482030 0.5961590 0.5862151 0.6440678 0.6656337 0
Máte svůj finální model. Náhodný les můžete trénovat s následujícími parametry:
- ntree = 800: Bude natrénováno 800 stromů
- mtry = 4: Při každém rozdělení jsou vykresleny 4 kandidátské prvky
- maxnodes = 24: Každý strom je omezen na 24 koncových uzlů (listů)
fit_rf <- train(survived~., data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, ntree = 800, maxnodes = 24)
Krok 5) Vyhodnoťte model
Stříška knihovny má funkci pro předpovídání.
predict(model, newdata= df)
argument
- `model`: Define the model evaluated before.
- `newdata`: Define the dataset to make prediction
prediction <-predict(fit_rf, data_test)
Predikci můžete použít k výpočtu matice zmatků a zobrazit skóre přesnosti
confusionMatrix(prediction, data_test$survived)
Výstup:
## Confusion Matrix and Statistics ## ## Reference ## Prediction No Yes ## No 110 32 ## Yes 11 56 ## ## Accuracy : 0.7943 ## 95% CI : (0.733, 0.8469) ## No Information Rate : 0.5789 ## P-Value [Acc > NIR] : 3.959e-11 ## ## Kappa : 0.5638 ## Mcnemar's Test P-Value : 0.002289 ## ## Sensitivity : 0.9091 ## Specificity : 0.6364 ## Pos Pred Value : 0.7746 ## Neg Pred Value : 0.8358 ## Prevalence : 0.5789 ## Detection Rate : 0.5263 ## Detection Prevalence : 0.6794 ## Balanced Accuracy : 0.7727 ## ## 'Positive' Class : No ##
Model dosahuje přesnosti 0.7943, což je 79.43 procenta na neviditelné testovací sadě, což je více než výchozí konfigurace. Citlivost je 0.9091 a specificita 0.6364, takže model rozpoznává nepřeživší mnohem spolehlivěji než přeživší.
Krok 6) Vizualizujte výsledek
Nakonec se můžete podívat na důležitost znaků pomocí funkce varImp(). Nejdůležitějšími znaky jsou pohlaví a věk. To není překvapivé, protože důležité znaky se pravděpodobně objeví blíže ke kořeni stromu, zatímco méně důležité znaky se obvykle objevují blíže k listům.
varImp(fit_rf)
Výstup:
## rf variable importance ## ## Importance ## sexmale 100.000 ## age 28.014 ## pclassMiddle 27.016 ## fare 21.557 ## pclassUpper 16.324 ## sibsp 11.246 ## parch 5.522 ## embarkedC 4.908 ## embarkedQ 1.420 ## embarkedS 0.000
Náhodný les v R: Rychlý přehled funkcí
V následující tabulce jsou uvedeny všechny funkce použité v šesti krocích, balíček, který je poskytuje, a parametry, které očekává.
| Knihovna | Objektivní | funkce | Parametr |
|---|---|---|---|
| náhodnýLes | Vytvořte náhodný les | randomForest() | vzorec, ntree=n, mtry=FALSE, maxnodes = NULL |
| stříbro | Vytvořte křížovou validaci k-fold | trainControl() | metoda = „cv“, číslo = n, hledání = „mřížka“ |
| stříbro | Trénujte náhodný les | vlak() | vzorec, df, metoda = “rf”, metric= “Přesnost”, trControl = trainControl(), tuneGrid = NULL |
| stříbro | Předpověď mimo vzorek | předpovědět | model, newdata= df |
| stříbro | Matice zmatení a statistika | confusionMatrix() | model, y test |
| stříbro | Proměnlivá důležitost | varImp() | model |
Dodatek: Modely dostupné ve stříšce
Funkce train() pojme mnohem více než jen náhodné lesy. Spuštěním níže uvedeného příkazu vypíšete všechny identifikátory modelu, které kurzor podporuje, a poté kterýkoli z nich předáte argumentu metody.
names(getModelInfo())
Výstup:
## [1] "ada" "AdaBag" "AdaBoost.M1" ## [4] "adaboost" "amdai" "ANFIS" ## [7] "avNNet" "awnb" "awtan" ## [10] "bag" "bagEarth" "bagEarthGCV" ## [13] "bagFDA" "bagFDAGCV" "bam" ## [16] "bartMachine" "bayesglm" "binda" ## [19] "blackboost" "blasso" "blassoAveraged" ## [22] "bridge" "brnn" "BstLm" ## [25] "bstSm" "bstTree" "C5.0" ## [28] "C5.0Cost" "C5.0Rules" "C5.0Tree" ## [31] "cforest" "chaid" "CSimca" ## [34] "ctree" "ctree2" "cubist" ## [37] "dda" "deepboost" "DENFIS" ## [40] "dnn" "dwdLinear" "dwdPoly" ## [43] "dwdRadial" "earth" "elm" ## [46] "enet" "evtree" "extraTrees" ## [49] "fda" "FH.GBML" "FIR.DM" ## [52] "foba" "FRBCS.CHI" "FRBCS.W" ## [55] "FS.HGD" "gam" "gamboost" ## [58] "gamLoess" "gamSpline" "gaussprLinear" ## [61] "gaussprPoly" "gaussprRadial" "gbm_h3o" ## [64] "gbm" "gcvEarth" "GFS.FR.MOGUL" ## [67] "GFS.GCCL" "GFS.LT.RS" "GFS.THRIFT" ## [70] "glm.nb" "glm" "glmboost" ## [73] "glmnet_h3o" "glmnet" "glmStepAIC" ## [76] "gpls" "hda" "hdda" ## [79] "hdrda" "HYFIS" "icr" ## [82] "J48" "JRip" "kernelpls" ## [85] "kknn" "knn" "krlsPoly" ## [88] "krlsRadial" "lars" "lars2" ## [91] "lasso" "lda" "lda2" ## [94] "leapBackward" "leapForward" "leapSeq" ## [97] "Linda" "lm" "lmStepAIC" ## [100] "LMT" "loclda" "logicBag" ## [103] "LogitBoost" "logreg" "lssvmLinear" ## [106] "lssvmPoly" "lssvmRadial" "lvq" ## [109] "M5" "M5Rules" "manb" ## [112] "mda" "Mlda" "mlp" ## [115] "mlpKerasDecay" "mlpKerasDecayCost" "mlpKerasDropout" ## [118] "mlpKerasDropoutCost" "mlpML" "mlpSGD" ## [121] "mlpWeightDecay" "mlpWeightDecayML" "monmlp" ## [124] "msaenet" "multinom" "mxnet" ## [127] "mxnetAdam" "naive_bayes" "nb" ## [130] "nbDiscrete" "nbSearch" "neuralnet" ## [133] "nnet" "nnls" "nodeHarvest" ## [136] "null" "OneR" "ordinalNet" ## [139] "ORFlog" "ORFpls" "ORFridge" ## [142] "ORFsvm" "ownn" "pam" ## [145] "parRF" "PART" "partDSA" ## [148] "pcaNNet" "pcr" "pda" ## [151] "pda2" "penalized" "PenalizedLDA" ## [154] "plr" "pls" "plsRglm" ## [157] "polr" "ppr" "PRIM" ## [160] "protoclass" "pythonKnnReg" "qda" ## [163] "QdaCov" "qrf" "qrnn" ## [166] "randomGLM" "ranger" "rbf" ## [169] "rbfDDA" "Rborist" "rda" ## [172] "regLogistic" "relaxo" "rf" ## [175] "rFerns" "RFlda" "rfRules" ## [178] "ridge" "rlda" "rlm" ## [181] "rmda" "rocc" "rotationForest" ## [184] "rotationForestCp" "rpart" "rpart1SE" ## [187] "rpart2" "rpartCost" "rpartScore" ## [190] "rqlasso" "rqnc" "RRF" ## [193] "RRFglobal" "rrlda" "RSimca" ## [196] "rvmLinear" "rvmPoly" "rvmRadial" ## [199] "SBC" "sda" "sdwd" ## [202] "simpls" "SLAVE" "slda" ## [205] "smda" "snn" "sparseLDA" ## [208] "spikeslab" "spls" "stepLDA" ## [211] "stepQDA" "superpc" "svmBoundrangeString"## [214] "svmExpoString" "svmLinear" "svmLinear2" ## [217] "svmLinear3" "svmLinearWeights" "svmLinearWeights2" ## [220] "svmPoly" "svmRadial" "svmRadialCost" ## [223] "svmRadialSigma" "svmRadialWeights" "svmSpectrumString" ## [226] "tan" "tanSearch" "treebag" ## [229] "vbmpRadial" "vglmAdjCat" "vglmContRatio" ## [232] "vglmCumulative" "widekernelpls" "WM" ## [235] "wsrf" "xgbLinear" "xgbTree" ## [238] "xyf"
