Slumpmässig skog i R-handledning: Algoritm med exempel

⚡ Smart sammanfattning

Random Forest i R bygger hundratals beslutsträd på bootstrappade samplingar och medelvärdesbildar deras röster till en robust förutsägelse. Denna genomgång finjusterar mtry, maxnodes och ntree med caret och utvärderar den slutliga modellen på Titanics överlevnadsdata.

  • ???? Kärnprincip: Bagging tränar varje träd på ett bootstrap-urval och en slumpmässig delmängd av prediktorer, så individuella fel tar ut varandra under majoritetsröstningen.
  • 🧪 Valideringsinställningar: trainControl(metod = "cv", nummer = 10, sökning = "rutnät") fixar en tiofaldig rutnätssökning som återanvänds i varje finjusteringssteg.
  • 🎯 Stämningsordning: Optimera först mtry, sedan maxnodes och sedan ntree, och bär det vinnande värdet framåt i varje steg.
  • 📈 Bästa konfiguration: mtry = 4, maxnodes = 24 och ntree = 800 gav den starkaste korsvaliderade noggrannheten på denna datauppsättning.
  • 🧮 Testresultat: confusionMatrix() rapporterar 79.43 procents noggrannhet, sensitivitet 0.9091 och specificitet 0.6364 på utelämnade data.

Slumpmässig skog i R

Vad är Random Forest i R?

Slumpmässiga skogar bygger på en enkel idé: "massans visdom". Aggregering av resultaten från flera prediktorer ger en bättre förutsägelse än den bästa individuella prediktorn. En grupp av prediktorer kallas en ensemble. Således kallas denna teknik Ensemble Learning.

I en tidigare handledning lärde du dig hur man använder beslutsträd att göra en binär förutsägelse. För att förbättra vår teknik kan vi träna en grupp av Klassificerare av beslutsträd, var och en på en annan slumpmässig delmängd av tåguppsättningen. För att göra en förutsägelse samlar du in förutsägelserna för alla individuella träd och returnerar den klass som får flest röster. Denna teknik kallas Slumpmässig skog.

Innan man skriver någon kod är det bra att se exakt hur skogen är sammansatt av de enskilda träden.

Hur fungerar slumpmässig skog i R?

Att förstå mekaniken gör det lättare att resonera kring varje inställningsparameter. En slumpmässig skog byggs i fyra steg.

  1. Bootstrap provtagning. Algoritmen ritar ett slumpmässigt urval av rader med byte från träningsmängden för varje träd. Ungefär en tredjedel av raderna utelämnas från varje urval; dessa är observationerna utanför påsen (OOB).
  2. Slumpmässigt val av funktioner. Vid varje delning beaktas endast en slumpmässig delmängd av prediktorer. Den delmängdens storlek är mtry parameter. Att begränsa valet är det som hindrar alla träd från att se likadana ut.
  3. Obeskuren trädtillväxt. Varje träd växer tills det stannarping regel som maxnoder or nodstorlekEnskilda träd tillåts medvetet överanpassa, eftersom deras fel är okorrelerade.
  4. Aggregering. För klassificering returnerar skogen klassen med flest röster; för regression returnerar den den genomsnittliga prediktionen. Detta medelvärdessteg är vad termen säckväv (bootstrap-aggregering) beskriver.

Radprovtagning plus kolumnprovtagning är hela tricket. Ett enda djupt träd har låg bias och mycket hög varians; att i genomsnitt använda hundratals av dem håller den låga biasen samtidigt som variansen sänks.

Fel vid tom påse. Eftersom varje observation exkluderas från ungefär en tredjedel av träden, kan R poängsätta varje rad med hjälp av endast de träd som aldrig såg den. Det resulterande OOB-felet är en fri, inbyggd valideringsuppskattning som skrivs 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-felet är en bekväm snabbkontroll, men den här handledningen använder tiofaldig korsvalidering med cirkumflektor så att varje justeringsrutnät jämförs på identiska vikningar.

Slumpmässig skog kontra beslutsträd i R

En slumpmässig skog är en ensemble av samma beslutsträd behandlades i den föregående handledningen, så skillnaderna är värda att tydligt ange innan du väljer mellan dem.

Kriterier Beslutsträd Slumpmässig skog
Structure Ett träd Hundratals träd kombinerade genom omröstning
Variation Hög, mycket känslig för träningsprovet Låg, medelvärdesberäkning eliminerar individuella fel
Risk för överanpassning Hög om den inte beskärs Låg även med obeskurna träd
tolkningsbarhet Fullt läsbar som ett flödesschema Endast variabel betydelse är läsbar
Utbildningskostnad Mycket snabb Proportionell mot trädet
Inbyggd validering Ingen Uppskattning av fel vid tomgångsfel
R-funktion rpart() slumpmässigForest()

Välj ett enskilt träd när du måste förklara beslutsvägen för en icke-teknisk publik. Välj en skog när prediktiv noggrannhet är viktigare än ett läsbart diagram.

Fördelar och nackdelar med Random Forest

Att veta var algoritmen är stark och svag visar när det är värt att lägga ner den framtida finjusteringen.

Fördelar

  • Noggrannhet utan beskärning: medelvärdesbildning av många okorrelerade träd ger starka resultat med väldigt lite manuell justering.
  • Motståndskraftig mot överanpassning: Att lägga till fler träd ökar aldrig generaliseringsfelet, så ntree kan höjas säkert.
  • Hanterar blandad data: Numeriska och faktorprediktorer fungerar sida vid sida, och skalning är onödig.
  • Gratis validering och ranking: OOB-felet och varImp() medför ingen extra beräkningskostnad.

Nackdelar

  • Ogenomskinliga förutsägelser: du kan inte tracen enda beslutsväg, vilket är viktigt i reglerade miljöer.
  • Sakta i stora skogar: tränings- och prediktionstidsskala linjärt med antalet träd.
  • Partiska viktighetspoäng: Kategoriska variabler med många nivåer kan se viktigare ut än de egentligen är.
  • Svag extrapolering: För regression kan skogen aldrig förutsäga utanför det intervall som ses i träning.

När teorin och avvägningarna är avklarade bygger, finjusterar och utvärderar de kommande sex stegen en slumpmässig skog från ände till ände på Titanics överlevnadsdataset.

Steg 1) Importera data

För att se till att du har samma datauppsättning som i handledningen för beslutsträd, tågsetet och testsetet finns online. Du kan importera dem utan att göra några ändringar.

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)

Steg 2) Träna modellen

Ett sätt att utvärdera en modells prestanda är att träna den på ett antal olika mindre datamängder och utvärdera dem jämfört med den andra mindre testuppsättningen. Detta kallas k-faldig korsvalidering. R har en funktion som slumpmässigt delar upp data i k delmängder av nästan samma storlek. Till exempel, om k = 10, tränas modellen på nio veck och utvärderas på den återstående vecken. Denna process upprepas tills alla delmängder har utvärderats. Denna teknik används ofta för modellval, särskilt när modellen har parametrar att finjustera.

Nu när vi har ett sätt att utvärdera vår modell måste vi bestämma vilka parametrar som generaliseras bäst till osynliga data.

Random forest väljer en slumpmässig delmängd av funktioner och bygger många beslutsträd. Modellen gör ett genomsnitt av alla förutsägelser från beslutsträden.

Random forest har vissa parametrar som kan ändras för att förbättra generaliseringen av prediktionen. Du kommer att använda funktionen randomForest() för att träna modellen.

Syntaxen för randomForest() är:

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

Anmärkningar: Slumpmässig skog kan tränas på fler parametrar. Du kan hänvisa till karikatyrerna för att se de olika parametrarna.

Att finjustera en modell är ett mödosamt arbete. Det finns många möjliga parameterkombinationer. Du har inte nödvändigtvis tid att prova alla. Ett bra alternativ är att låta maskinen hitta den bästa kombinationen för dig. Det finns två metoder tillgängliga:

  • Slumpmässig sökning
  • Rutnätssökning

Båda metoderna definieras nedan, men den här handledningen tränar modellen med hjälp av rutnätssökning.

Grid Search definition

Rutnätssökningsmetoden är enkel, modellen kommer att utvärderas över alla kombinationer du passerar i funktionen, med hjälp av korsvalidering.

Till exempel, du vill prova modellen med 10, 20, 30 antal träd och varje träd kommer att testas över ett antal mtry lika med 1, 2, 3, 4, 5. Sedan kommer maskinen att testa 15 olika 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 kommer att utvärdera:

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

Varje kombination utvärderas med korsvalidering. Nackdelen med rutnätssökning är antalet experiment: det växer explosionsartat när antalet kombinationer är högt. För att övervinna detta problem kan du använda slumpmässig sökning.

Slumpmässig sökning definition

Den stora skillnaden mellan slumpmässig sökning och rutnätssökning är att slumpmässig sökning inte utvärderar alla kombinationer av hyperparametrar i sökområdet. Istället väljer den slumpmässigt en kombination vid varje iteration. Fördelen är en mycket lägre beräkningskostnad.

Ställ in kontrollparametern

Du kommer att gå tillväga enligt följande för att konstruera och utvärdera modellen:

  • Utvärdera modellen med standardinställningen
  • Hitta det bästa antalet mtry
  • Hitta det bästa antalet maxnoder
  • Hitta det bästa antalet nträd
  • Utvärdera modellen på testdatauppsättningen

Innan du börjar med parametrarnas utforskning måste du installera två bibliotek.

  • caret: R maskininlärningsbibliotek. Om du har installera R med r-väsentligt. Den finns redan på biblioteket
    • Anakonda: conda installera -cr r-caret
  • e1071: R maskininlärningsbibliotek.
    • Anakonda: conda installera -cr r-e1071

Du kan importera dem tillsammans med randomForest:

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

Standardinställning

K-faldig korsvalidering styrs av trainControl()-funktionen

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 prova att köra modellen med standardparametrarna och se noggrannhetspoängen.

Anmärkningar: Du kommer att använda samma kontroller under hela handledningen.

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

Du kommer att använda caret-biblioteket för att utvärdera din modell. Biblioteket har en funktion som kallas train() för att utvärdera nästan alla maskininlärning algoritm. Säg annorlunda, du kan använda den här funktionen för att träna andra algoritmer.

Den grundläggande syntaxen är:

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

Låt oss bygga modellen med standardvärdena.

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 Förklaring

  • trainControl(metod="cv", nummer="10, sök="rutnät"): Utvärdera modellen med en rutnätssökning över 10 veck
  • train(...): Träna en slumpmässig skogsmodell. Bästa modellen väljs med noggrannhetsmåttet.

Produktion:

## 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 använder 500 träd och testade tre olika värden på mtry: 2, 6, 10.

Det slutliga värdet som användes för modellen var mtry = 2, med en korsvaliderad noggrannhet på 0.792. Låt oss försöka få en högre poäng.

Sök efter den bästa mtry

Du kan testa modellen med värden på mtry från 1 till 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 Förklaring

  • tuneGrid <- expand.grid(.mtry = c(1:10)): Konstruera en vektor med värden från 1 till 10

Produktion:

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

Det bästa värdet för mtry är 4. Det lagras i:

rf_mtry$bestTune$mtry

Du kan lagra den och använda den när du behöver ställa in de andra parametrarna.

max(rf_mtry$results$Accuracy)

Produktion:

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

Produktion:

## [1] 4

Steg 3) Sök efter de bästa maxnoderna

Du måste skapa en loop för att utvärdera de olika värdena för maxnoder. I följande kod kommer du:

  • Skapa en lista
  • Skapa en variabel med det bästa värdet av parametern mtry; Obligatorisk
  • Skapa slingan
  • Lagra det aktuella värdet för maxnode
  • Sammanfatta resultaten
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 förklaring:

  • store_maxnode <- list(): Resultaten av modellen kommer att lagras i denna lista
  • expand.grid(.mtry=bästa_mtry): Använd det bästa värdet av mtry
  • for (maxnodes in c(5:15)) { … }: Beräkna modellen med värden för maxnodes från 5 till 15.
  • maxnodes = maxnodes: För varje iteration är maxnodes lika med det aktuella loopvärdet, dvs. 5, 6, 7, …
  • current_iteration <- toString(maxnodes): Lagra värdet för maxnodes som en sträng.
  • store_maxnode[[current_iteration]] <- rf_maxnode: Spara resultatet av modellen i listan.
  • resamples(store_maxnode): Ordna resultaten av modellen
  • summary(results_mtry): Skriv ut sammanfattningen av alla kombinationer.

Produktion:

## 
## 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ögsta medelnoggrannheten i detta intervall (0.8099) tillhör maxnodes = 14, högst upp i det testade intervallet. Eftersom det bästa värdet ligger vid kanten av rutnätet bör du utöka sökningen uppåt.

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)

Produktion:

## 
## 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ögsta medelnoggrannheten, 0.8135, erhålls med maxnodes = 24 (maxnodes = 27 är likvärdiga med medelvärdet men har en lägre tredjekvartil). Du kommer därför att använda maxnodes = 24 för de återstående stegen.

Steg 4) Sök efter de bästa träden

Nu när du har det bästa värdet av mtry och maxnode kan du ställa in antalet träd. Metoden är exakt densamma 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)

Produktion:

## 
## 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 slutliga modell. Du kan träna den slumpmässiga skogen med följande parametrar:

  • ntree = 800: 800 träd kommer att tränas
  • mtry = 4: 4 kandidatfunktioner ritas vid varje delning
  • maxnodes = 24: Varje träd är begränsat till 24 terminalnoder (löv)
fit_rf <- train(survived~.,
    data_train,
    method = "rf",
    metric = "Accuracy",
    tuneGrid = tuneGrid,
    trControl = trControl,
    importance = TRUE,
    nodesize = 14,
    ntree = 800,
    maxnodes = 24)

Steg 5) Utvärdera modellen

Biblioteket har en funktion att göra förutsägelser.

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 använda förutsägelsen för att beräkna förvirringsmatrisen och se noggrannhetspoängen

confusionMatrix(prediction, data_test$survived)

Produktion:

## 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 noggrannhet på 0.7943, det vill säga 79.43 procent på det osedda testet, vilket är högre än standardkonfigurationen. Känsligheten är 0.9091 och specificiteten är 0.6364, så modellen känner igen icke-överlevande mycket mer tillförlitligt än överlevande.

Steg 6) Visualisera resultatet

Slutligen kan du titta på egenskapernas betydelse med funktionen varImp(). De viktigaste egenskaperna är kön och ålder. Det är inte förvånande eftersom de viktiga egenskaperna sannolikt förekommer närmare trädets rot, medan mindre viktiga egenskaper vanligtvis förekommer närmare bladen.

varImp(fit_rf)

Produktion:

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

Slumpmässig skog i R: Snabbfunktionsreferens

Tabellen nedan listar alla funktioner som används i de sex stegen, paketet som tillhandahåller den och de parametrar den förväntar sig.

Bibliotek Mål Funktion Parameter
randomForest Skapa en slumpmässig skog slumpmässigForest() formel, ntree=n, mtry=FALSE, maxnodes = NULL
markör Skapa k-faldig korsvalidering trainControl() metod = "cv", nummer = n, sök = "rutnät"
markör Träna en Random Forest tåg() formel, df, metod = "rf", metrisk = "noggrannhet", trControl = trainControl(), tuneGrid = NULL
markör Förutsäg ur provet förutse modell, newdata= df
markör Förvirringsmatris och statistik confusionMatrix() modell, y test
markör Variabel betydelse varImp() modell

Bilaga: Modeller tillgängliga inom cirkumflätad markering

Funktionen train() kan anpassas till betydligt fler än slumpmässiga skogar. Kör kommandot nedan för att skriva ut alla modellidentifierare som stöds av cirkumflektorn, och skicka sedan vilken som helst av dem till metodargumentet.

names(getModelInfo())

Produktion:

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

Vanliga frågor

Börja med 500, standardvärdet för randomForest(). Noggrannheten brukar plana ut mellan 300 och 1000 träd. Att öka ntree skadar aldrig noggrannheten, bara körtiden, så öka den tills felkurvan planar ut.

Out-of-bag-felet poängsätter varje observation med endast de träd som tränats utan det. Det är en snabb, opartisk uppskattning och ersätter ofta korsvalidering, även om k-foldning fortfarande är att föredra när man jämför finjusteringsnät på identiska foldningar.

Ja. Ange ett numeriskt svar så beräknar randomForest() medelvärdet av trädförutsägelserna istället för att rösta. I cirkumflätan, behåll metoden = "rf" och byt metrikargumentet från Noggrannhet till RMSE.

Slumpmässiga skogar är fortfarande en standardbaslinje för tabellära AI-problem som churn, bedrägerier och riskpoängsättning. Team jämför ofta en skog innan de bestämmer sig för gradientboosting eller neurala nätverk.

Ja. AI-assistenter kan utforma finjusteringsrutnät, förklara omsamplingsutdata och föreslå rimliga mätområden. Kör alltid om den genererade koden med ett fast seed-värde så att den rapporterade noggrannheten är reproducerbar.

Sammanfatta detta inlägg med: