R Random Forest Tutorial med eksempel

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 tidligere opplæring lærte du hvordan du bruker Beslutningstrær å lage en binær prediksjon. For å forbedre vår teknikk kan vi trene en gruppe på Decision Tree klassifiserere, hver på et annet tilfeldig delsett av togsettet. For å lage en spådom innhenter vi bare spådommene til alle individuelle trær, og forutsier deretter klassen som får flest stemmer. Denne teknikken kalles Tilfeldig skog.

Trinn 1) Importer dataene

For å være sikker på at du har samme datasett som i opplæringen for avgjørelse trær, er togtesten og testsettet lagret på internett. 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 over det andre mindre testsettet. Dette kalles F-fold kryssvalidering funksjonen. R har en funksjon for å dele antall datasett av nesten samme størrelse tilfeldig. For eksempel, hvis k=9, blir modellen evaluert over de ni mappene og testet på det gjenværende testsettet. Denne prosessen gjentas til alle delsettene er evaluert. Denne teknikken er mye brukt for modellvalg, spesielt når modellen har parametere som skal justeres.

Nå som vi har en måte å evaluere modellen vår på, må vi finne ut hvordan vi velger parametrene som best generaliserte dataene.

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

Tilfeldig skog har noen parametere som kan endres for å forbedre generaliseringen av prediksjonen. Du skal bruke funksjonen RandomForest() for å trene modellen.

Syntaks for Randon Forest 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 candidates draw to feed the algorithm. By default, it is the square of the number of columns.
- maxnodes: Set the maximum amount of terminal nodes in the forest
- 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.

Å stille inn en modell er veldig kjedelig arbeid. Det er mange kombinasjoner mulig mellom parameterne. Du har ikke nødvendigvis tid til å prøve dem alle. Et godt alternativ er å la maskinen finne den beste kombinasjonen for deg. Det er to tilgjengelige metoder:

  • Tilfeldig søk
  • Rutenett søk

Vi vil definere begge metodene, men i løpet av opplæringen vil vi trene modellen ved å bruke 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 gang eksperimenterer den tilfeldige skogen med en kryssvalidering. En mangel ved rutenettsøket er antall eksperimenter. Det kan bli veldig lett eksplosivt når antallet kombinasjoner er høyt. For å løse dette problemet kan du bruke det tilfeldige søket

Definisjon av tilfeldig søk

Den store forskjellen mellom tilfeldig søk og rutenettsøk er at tilfeldig søk ikke vil evaluere all kombinasjonen av hyperparameter i søkeområdet. I stedet vil den tilfeldig velge kombinasjon ved hver iterasjon. Fordelen er at det reduserer beregningskostnadene.

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 folders to create
- search = "grid": Use the search grid method. For randomized method, use "grid"
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 prøve å 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)

Kode Forklaring

  • trainControl(method=”cv”, number=10, search=”grid”): Evaluer modellen med et rutenettsøk på 10 mapper
  • 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 nøyaktighet på 0.78. La oss prøve å få en høyere poengsum.

Trinn 2) Søk best mtry

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)

Kode Forklaring

  • tuneGrid <- expand.grid(.mtry=c(3:10)): Konstruer en vektor med verdi fra 3:10

Den endelige verdien som ble brukt for modellen var mtry = 4.

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 av mtry 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)

Kodeforklaring:

  • store_maxnode <- list(): Resultatene av modellen vil bli lagret i denne listen
  • expand.grid(.mtry=best_mtry): Bruk den beste verdien av mtry
  • for (maksnoder i c(15:25)) { … }: Beregn modellen med verdier for maksnoder som starter fra 15 til 25.
  • maxnodes=maxnodes: For hver iterasjon er maxnodes lik gjeldende verdi av maxnodes. dvs. 15, 16, 17, …
  • key <- toString(maxnodes): Lagre som en strengvariabel verdien til maxnode.
  • store_maxnode[[key]] <- 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 siste verdien av maxnode har høyest nøyaktighet. Du kan prøve med høyere verdier for å se om du kan få en høyere poengsum.

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 nøyaktighetsscore oppnås med en verdi på maxnode lik 22.

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 skal trenes
  • mtry=4: 4 funksjoner er valgt for hver iterasjon
  • maxnodes = 24: Maksimalt 24 noder i terminalnodene (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             
## 

Du har en nøyaktighet på 0.7943 prosent, som er høyere enn standardverdien

Trinn 6) Visualiser resultatet

Til slutt kan du se på funksjonens betydning med funksjonen varImp(). Det ser ut til at de viktigste egenskapene er kjønn og alder. Det er ikke overraskende fordi de viktige funksjonene sannsynligvis vises nærmere roten av treet, mens mindre viktige funksjoner ofte vil virke lukket for bladene.

varImpPlot(fit_rf)

Utgang:

varImp(fit_rf)
## 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		

Oppsummering

Vi kan oppsummere hvordan man trener og evaluerer en tilfeldig skog med tabellen nedenfor:

Bibliotek Målet Funksjon Parameter
randomForest Lag en tilfeldig skog RandomForest() formel, ntree=n, mtry=FALSE, maxnodes = NULL
vaktmester Opprett kryssvalidering av K-mappe 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 cvarImp() modell

Vedlegg

Liste over modeller brukt i caret

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"