Tilfeldig skog i R-opplæring: Algoritme med eksempel

⚡ Smart oppsummering

Random Forest i R bygger hundrevis av beslutningstrær på bootstrappede prøver og gjennomsnittliggjør stemmene deres til én robust prediksjon. Denne gjennomgangen finjusterer mtry, maxnodes og ntree med caret og evaluerer den endelige modellen på overlevelsesdataene fra Titanic.

  • ???? Kjerneprinsipp: Bagging trener hvert tre på et bootstrap-utvalg og et tilfeldig delsett av prediktorer, slik at individuelle feil kansellerer ut under flertallsavstemningen.
  • 🧪 Valideringsoppsett: trainControl(metode = "cv", tall = 10, søk = "rutenett") fikser et tifoldig rutenettsøk som gjenbrukes på tvers av hvert justeringstrinn.
  • 🎯 Tuningrekkefølge: Optimaliser mtry først, deretter maxnodes, deretter ntree, og bær vinnerverdien fremover i hvert trinn.
  • 📈 Beste konfigurasjon: mtry = 4, maxnodes = 24 og ntree = 800 ga den sterkeste kryssvaliderte nøyaktigheten på dette datasettet.
  • 🧮 Prøve resultater: confusionMatrix() rapporterer 79.43 prosent nøyaktighet, sensitivitet 0.9091 og spesifisitet 0.6364 på data som ikke ble brukt.

Tilfeldig skog i R

Hva er Random Forest i R?

Tilfeldige skoger er basert på en enkel idé: "menighetens visdom". Aggregering av resultatene fra flere prediktorer gir en bedre prediksjon enn den beste individuelle prediktoren. En gruppe prediktorer kalles en ensemble. Derfor kalles denne teknikken Ensemble læring.

I en tidligere veiledning lærte du hvordan du bruker avgjørelse trær å lage en binær prediksjon. For å forbedre vår teknikk kan vi trene en gruppe på Decision Tree klassifiserere, hver på et ulikt tilfeldig delsett av togsettet. For å lage en prediksjon samler du prediksjonene til alle de individuelle trærne og returnerer klassen som får flest stemmer. Denne teknikken kalles Tilfeldig skog.

Før man skriver kode, er det nyttig å se nøyaktig hvordan skogen er satt sammen av de individuelle trærne.

Hvordan fungerer tilfeldig skog i R?

Å forstå mekanikken gjør det enklere å resonnere rundt hver avstemmingsparametere. En tilfeldig skog bygges i fire trinn.

  1. Bootstrap prøvetaking. Algoritmen trekker et tilfeldig utvalg av rader med utskifting fra treningssettet for hvert tre. Omtrent en tredjedel av radene er utelatt fra hvert utvalg; dette er observasjonene utenfor posen (OOB).
  2. Tilfeldig valg av funksjoner. Ved hver deling vurderes bare et tilfeldig delsett av prediktorer. Denne delsettstørrelsen er mtry parameter. Det er å begrense valget som hindrer alle trærne i å se like ut.
  3. Ubeskjært trevekst. Hvert tre vokser til det stopper oppping regel som f.eks. maxnoder or nodestørrelseIndividuelle trær får bevisst lov til å overtilpasse seg, fordi feilene deres er ukorrelerte.
  4. Aggregering. For klassifisering returnerer skogen klassen med flest stemmer; for regresjon returnerer den gjennomsnittlig prediksjon. Dette gjennomsnittstrinnet er hva begrepet posing (bootstrap-aggregering) beskriver.

Radutvalg pluss kolonneutvalg er hele trikset. Et enkelt dypt tre har lav bias og veldig høy varians; å bruke hundrevis av dem i gjennomsnitt holder den lave biasen samtidig som variansen reduseres.

Feil ved utpakking. Fordi hver observasjon er ekskludert fra omtrent en tredjedel av trærne, kan R score hver rad ved å bare bruke trærne som aldri så den. Den resulterende OOB-feilen er et fritt, innebygd valideringsestimat som skrives ut av randomForest():

rf_oob <- randomForest(survived~., data = data_train, ntree = 800, mtry = 4)
print(rf_oob)   # reports the OOB estimate of error rate

OOB-feilen er en praktisk rask sjekk, men denne veiledningen bruker tifoldig kryssvalidering gjennom cirkumflekstegn, slik at hvert justeringsnett sammenlignes på identiske folder.

Tilfeldig skog vs. beslutningstre i R

En tilfeldig skog er et ensemble av det samme avgjørelse trær dekket i forrige veiledning, så forskjellene er verdt å si tydelig før du velger mellom dem.

Kriterier Beslutningstre Tilfeldig skog
Structure Ett tre Hundrevis av trær kombinert ved avstemning
Avviks Høy, veldig følsom for treningsprøven Lav, gjennomsnittsverdien kansellerer individuelle feil
Risiko for overtilpasning Høy med mindre beskjæring Lav selv med ubeskjærte trær
interpretability Fullt lesbar som et flytskjema Bare variabel viktighet er lesbar
Treningskostnad Veldig rask Proporsjonal med ntree
Innebygd validering none Estimat av feil ved tom pose
R funksjon rpart() tilfeldigSkog()

Velg et enkelt tre når du må forklare beslutningsveien til et ikke-teknisk publikum. Velg en skog når prediktiv nøyaktighet er viktigere enn et lesbart diagram.

Fordeler og ulemper med tilfeldig skog

Å vite hvor algoritmen er sterk og svak forteller deg når det er verdt å bruke den fremoverrettede innsatsen.

Fordeler

  • Nøyaktighet uten beskjæring: Gjennomsnittsmåling av mange ukorrelerte trær gir sterke resultater med svært lite manuell justering.
  • Motstandsdyktig mot overmontering: Å legge til flere trær øker aldri generaliseringsfeilen, så ntree kan heves trygt.
  • Håndterer blandede data: Numeriske og faktorprediktorer fungerer side om side, og skalering er unødvendig.
  • Gratis validering og rangering: OOB-feilen og varImp() kommer uten ekstra beregningskostnader.

Ulemper

  • Ugjennomsiktige spådommer: du kan ikke tracén enkelt beslutningsvei, noe som er viktig i regulerte miljøer.
  • Sakte i store skoger: trenings- og prediksjonstidsskala lineært med antall trær.
  • Skjulte viktighetspoeng: Kategoriske variabler med mange nivåer kan se viktigere ut enn de egentlig er.
  • Svak ekstrapolering: For regresjon kan skogen aldri forutsi utenfor området sett i trening.

Når teorien og avveiningene er avgjort, bygger, finjusterer og evaluerer de neste seks trinnene en tilfeldig skog ende-til-ende på Titanic-overlevelsesdatasettet.

Trinn 1) Importer dataene

For å være sikker på at du har samme datasett som i opplæringen for avgjørelse trær, togsettet og testsettet ligger på nett. Du kan importere dem uten å gjøre noen endringer.

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)

Trinn 2) Tren modellen

En måte å evaluere ytelsen til en modell på er å trene den på en rekke forskjellige mindre datasett og evaluere dem opp mot det andre mindre testsettet. Dette kalles k-fold kryssvalidering. R har en funksjon som tilfeldig deler dataene inn i k delsett av nesten samme størrelse. Hvis for eksempel k = 10, trenes modellen på ni folder og evalueres på den gjenværende foldingen. Denne prosessen gjentas til alle delsettene er evaluert. Denne teknikken er mye brukt for modellvalg, spesielt når modellen har parametere som må justeres.

Nå som vi har en måte å evaluere modellen vår på, må vi bestemme hvilke parametere som generaliserer best til usynlige data.

Tilfeldig skog velger en tilfeldig undergruppe av funksjoner og bygger mange beslutningstrær. Modellen gjennomsnitt ut alle spådommene til beslutningstrærene.

Random forest har noen parametere som kan endres for å forbedre generaliseringen av prediksjonen. Du skal bruke randomForest()-funksjonen til å trene modellen.

Syntaksen for randomForest() er:

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

Merknader: Tilfeldig skog kan trenes på flere parametere. Du kan referere til vignett for å se de forskjellige parameterne.

Å finjustere en modell er et kjedelig arbeid. Det finnes mange mulige kombinasjoner av parametere. Du har ikke nødvendigvis tid til å prøve alle. Et godt alternativ er å la maskinen finne den beste kombinasjonen for deg. Det finnes to metoder:

  • Tilfeldig søk
  • Rutenett søk

Begge metodene er definert nedenfor, men denne veiledningen trener modellen ved hjelp av rutenettsøk.

Definisjon av rutenettsøk

Rutenettsøkemetoden er enkel, modellen vil bli evaluert over all kombinasjonen du passerer i funksjonen, ved bruk av kryssvalidering.

For eksempel vil du prøve modellen med 10, 20, 30 antall trær og hvert tre vil bli testet over et antall mtry lik 1, 2, 3, 4, 5. Deretter vil maskinen teste 15 forskjellige modeller:

    .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	

Algoritmen vil evaluere:

randomForest(formula, ntree=10, mtry=1)
randomForest(formula, ntree=10, mtry=2)
randomForest(formula, ntree=10, mtry=3)
randomForest(formula, ntree=20, mtry=2)
...

Hver kombinasjon evalueres med kryssvalidering. Ulempen med rutenettsøk er antallet eksperimenter: det vokser eksplosivt når antallet kombinasjoner er høyt. For å løse dette problemet kan du bruke tilfeldig søk.

Definisjon av tilfeldig søk

Den store forskjellen mellom tilfeldig søk og rutenettsøk er at tilfeldig søk ikke vil evaluere alle kombinasjoner av hyperparametere i søkerommet. I stedet vil det tilfeldig velge kombinasjoner ved hver iterasjon. Fordelen er mye lavere beregningskostnader.

Still inn kontrollparameteren

Du vil fortsette som følger for å konstruere og evaluere modellen:

  • Evaluer modellen med standardinnstillingen
  • Finn det beste antallet mtry
  • Finn det beste antallet maksnoder
  • Finn det beste antallet ntre
  • Evaluer modellen på testdatasettet

Før du begynner med parameterutforskningen, må du installere to biblioteker.

  • caret: R maskinlæringsbibliotek. Hvis du har installer R med r-essensielt. Den ligger allerede på biblioteket
  • e1071: R maskinlæringsbibliotek.

Du kan importere dem sammen med randomForest:

library(randomForest)
library(caret)
library(e1071)

Standardinnstilling

K-fold kryssvalidering styres av trainControl()-funksjonen

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.

Du kan prøve å kjøre modellen med standardparametrene og se nøyaktighetsscore.

Merknader: Du vil bruke de samme kontrollene under hele opplæringen.

# Define the control
trControl <- trainControl(method = "cv",
    number = 10,
    search = "grid")

Du vil bruke caret-biblioteket til å evaluere modellen din. Biblioteket har en funksjon kalt train() for å evaluere nesten alle maskinlæring algoritme. Si annerledes, du kan bruke denne funksjonen til å trene andre algoritmer.

Den grunnleggende syntaksen er:

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

La oss bygge modellen med standardverdiene.

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 Forklaring

  • trainControl(method=”cv”, number=10, search=”grid”): Evaluer modellen med et gridsøk over 10 folder
  • tog(...): Tren en tilfeldig skogmodell. Beste modell er valgt med nøyaktighetsmålet.

Utgang:

## 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.

Algoritmen bruker 500 trær og testet tre forskjellige verdier av mtry: 2, 6, 10.

Den endelige verdien som ble brukt for modellen var mtry = 2, med en kryssvalidert nøyaktighet på 0.792. La oss prøve å få en høyere poengsum.

Søk etter det beste mtry-et

Du kan teste modellen med verdier på mtry fra 1 til 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 Forklaring

  • tuneGrid <- expand.grid(.mtry = c(1:10)): Konstruer en vektor med verdier fra 1 til 10

Utgang:

## 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.

Den beste verdien for mtry er 4. Den er lagret i:

rf_mtry$bestTune$mtry

Du kan lagre den og bruke den når du trenger å stille inn de andre parameterne.

max(rf_mtry$results$Accuracy)

Utgang:

## [1] 0.8110729
best_mtry <- rf_mtry$bestTune$mtry 
best_mtry

Utgang:

## [1] 4

Trinn 3) Søk etter de beste maxnodene

Du må lage en løkke for å evaluere de forskjellige verdiene til maxnodes. I følgende kode vil du:

  • Lag en liste
  • Lag en variabel med den beste verdien av parameteren mtry; Obligatorisk
  • Lag løkken
  • Lagre gjeldende verdi for maxnode
  • Oppsummer resultatene
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 forklaring:

  • store_maxnode <- list(): Resultatene av modellen vil bli lagret i denne listen
  • expand.grid(.mtry=best_mtry): Bruk den beste verdien av mtry
  • for (maxnodes in c(5:15)) { … }: Beregn modellen med verdier av maxnodes fra 5 til 15.
  • maxnodes = maxnodes: For hver iterasjon er maxnodes lik den nåværende løkkeverdien, dvs. 5, 6, 7, …
  • current_iteration <- toString(maxnodes): Lagre verdien av maxnodes som en streng.
  • store_maxnode[[current_iteration]] <- rf_maxnode: Lagre resultatet av modellen i listen.
  • resamples(store_maxnode): Ordne resultatene av modellen
  • summary(results_mtry): Skriv ut sammendraget av alle kombinasjonene.

Utgang:

## 
## 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

Den høyeste gjennomsnittlige nøyaktigheten i dette området (0.8099) tilhører maxnodes = 14, øverst i det testede intervallet. Fordi den beste verdien ligger i kanten av rutenettet, bør du utvide søket oppover.

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)

Utgang:

## 
## 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

Den høyeste gjennomsnittlige nøyaktigheten, 0.8135, oppnås med maxnodes = 24 (maxnodes = 27 er lik gjennomsnittet, men har en lavere tredje kvartil). Du vil derfor bruke maxnodes = 24 for de resterende trinnene.

Trinn 4) Søk i de beste treene

Nå som du har den beste verdien av mtry og maxnode, kan du justere antall trær. Metoden er nøyaktig den samme som 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)

Utgang:

## 
## 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

Du har din endelige modell. Du kan trene den tilfeldige skogen med følgende parametere:

  • ntree = 800: 800 trær vil bli trent
  • mtry = 4: 4 kandidatfunksjoner tegnes ved hver deling
  • maxnodes = 24: Hvert tre er begrenset til 24 terminalnoder (blader)
fit_rf <- train(survived~.,
    data_train,
    method = "rf",
    metric = "Accuracy",
    tuneGrid = tuneGrid,
    trControl = trControl,
    importance = TRUE,
    nodesize = 14,
    ntree = 800,
    maxnodes = 24)

Trinn 5) Vurder modellen

Biblioteket har en funksjon for å forutsi.

predict(model, newdata= df)
argument
- `model`: Define the model evaluated before. 
- `newdata`: Define the dataset to make prediction
prediction <-predict(fit_rf, data_test)

Du kan bruke prediksjonen til å beregne forvirringsmatrisen og se nøyaktighetsscore

confusionMatrix(prediction, data_test$survived)

Utgang:

## 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             
## 

Modellen når en nøyaktighet på 0.7943, det vil si 79.43 prosent på det usynlige testsettet, noe som er høyere enn standardkonfigurasjonen. Sensitiviteten er 0.9091 og spesifisiteten er 0.6364, slik at modellen gjenkjenner ikke-overlevende mye mer pålitelig enn overlevende.

Trinn 6) Visualiser resultatet

Til slutt kan du se på viktigheten av funksjonene med varImp()-funksjonen. De viktigste funksjonene er kjønn og alder. Det er ikke overraskende, fordi de viktige funksjonene sannsynligvis vises nærmere roten av treet, mens mindre viktige funksjoner vanligvis vises nærmere bladene.

varImp(fit_rf)

Utgang:

## 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		

Tilfeldig skog i R: Hurtigfunksjonsreferanse

Tabellen nedenfor viser alle funksjonene som brukes på tvers av de seks trinnene, pakken som leverer den, og parameterne den forventer.

Bibliotek Målet Funksjon Parameter
randomForest Lag en tilfeldig skog tilfeldigSkog() formel, ntree=n, mtry=FALSE, maxnodes = NULL
vaktmester Lag k-fold kryssvalidering trainControl() metode = "cv", tall = n, søk = "rutenett"
vaktmester Tren en tilfeldig skog tog() formel, df, metode = "rf", metrisk = "Nøyaktighet", trControl = trainControl(), tuneGrid = NULL
vaktmester Forutsi ut av prøven forutsi modell, newdata= df
vaktmester Forvirringsmatrise og statistikk confusionMatrix() modell, y test
vaktmester Variabel betydning varImp() modell

Tillegg: Modeller tilgjengelig i cirkumfleks

train()-funksjonen kan passe til langt mer enn tilfeldige skoger. Kjør kommandoen nedenfor for å skrive ut alle modellidentifikatorer som støtter cirkumfleks, og send deretter hvilken som helst av dem til metodeargumentet.

names(getModelInfo())

Utgang:

##   [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"

Spørsmål og svar

Start med 500, standardverdien for randomForest(). Nøyaktigheten flater vanligvis ut mellom 300 og 1000 trær. Å øke ntree skader aldri nøyaktigheten, bare kjøretiden, så øk den til feilkurven flater ut.

Ut-av-pose-feilen scorer hver observasjon ved kun å bruke trærne som ble trent uten den. Det er et raskt, objektivt estimat og erstatter ofte kryssvalidering, selv om k-folding fortsatt er å foretrekke når man sammenligner tuninggitter på identiske folder.

Ja. Oppgi et numerisk svar, og randomForest() beregner gjennomsnittet av treforutsigelsene i stedet for å stemme. I cirkumflekstegnet, behold metoden = "rf" og bytt metrisk argument fra Nøyaktighet til RMSE.

Tilfeldige skoger er fortsatt en standard grunnlinje for tabellære AI-problemer som churn, svindel og risikovurdering. Team sammenligner ofte en skog før de forplikter seg til gradientboosting eller nevrale nettverk.

Ja. AI-assistenter kan utarbeide tuning-rutenett, forklare resampling-utdata og foreslå fornuftige måleområder. Kjør alltid den genererte koden på nytt med et fast frø, slik at den rapporterte nøyaktigheten er reproduserbar.

Oppsummer dette innlegget med: