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.

  • ???? Základní princip: Bagging trénuje každý strom na bootstrapovém vzorku a náhodné podmnožině prediktorů, takže jednotlivé chyby se během většinového hlasování vyruší.
  • 🧪 Nastavení ověření: trainControl(method = „cv“, number = 10, search = „grid“) opravuje desetinásobné prohledávání mřížky opakovaně používané v každém kroku ladění.
  • 🎯 Pořadí ladění: Nejprve optimalizujte mtry, poté maxnodes a nakonec ntree a v každé fázi přeneste vítěznou hodnotu dopředu.
  • 📈 Nejlepší konfigurace: Hodnoty mtry = 4, maxnodes = 24 a ntree = 800 poskytly u této datové sady nejvyšší křížově validovanou přesnost.
  • 🧮 Výsledek testu: Funkce confusionMatrix() uvádí na zadržených datech přesnost 79.43 procenta, citlivost 0.9091 a specificitu 0.6364.

Náhodný les v R

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.

  1. 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).
  2. 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ě.
  3. 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í.
  4. 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ě
  • e1071: Knihovna strojového učení R.

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"

Nejčastější dotazy

Začněte s 500, což je výchozí hodnota funkce randomForest(). Přesnost se obvykle pohybuje mezi 300 a 1000 stromy. Zvyšování hodnoty ntree nikdy neublíží přesnosti, pouze době běhu, takže ji zvyšujte, dokud se křivka chyb nezploští.

Chyba „out-of-bag“ vyhodnocuje každé pozorování pouze s použitím stromů trénovaných bez ní. Jedná se o rychlý a nezkreslený odhad, který často nahrazuje křížovou validaci, ačkoli k-násobek zůstává vhodnější při porovnávání ladicích mřížek na identických ohybech.

Ano. Zadejte číselnou odpověď a metoda randomForest() zprůměruje predikce stromu namísto hlasování. V bodě stříšky ponechte metodu = „rf“ a přepněte argument metriky z Přesnost na RMSE.

Náhodné lesy zůstávají standardním základem pro problémy s tabulkovou umělou inteligencí, jako je odliv uživatelů, podvody a hodnocení rizik. Týmy často posouvají les předtím, než se rozhodnou pro gradientní boosting nebo neuronové sítě.

Ano. Asistenti umělé inteligence mohou navrhovat ladicí mřížky, vysvětlovat převzorkování výstupu a navrhovat rozumné rozsahy metry. Vždy znovu spusťte vygenerovaný kód s pevným počtem frekvencí, aby byla zaznamenaná přesnost reprodukovatelná.

Shrňte tento příspěvek takto: