Учебники

29) R Случайный Лес Учебник

Что такое случайный лес в R?

Случайные леса основаны на простой идее: «мудрость толпы». Совокупность результатов нескольких предикторов дает лучший прогноз, чем лучший индивидуальный предиктор. Группа предикторов называется ансамблем . Таким образом, эта методика называется ансамблевым обучением .

В предыдущем уроке вы узнали, как использовать деревья решений для бинарного предсказания. Чтобы улучшить нашу технику, мы можем обучить группу классификаторов Дерева решений , каждый из которых находится в отдельном случайном подмножестве набора поездов. Чтобы сделать прогноз, мы просто получаем прогнозы всех деревьев индивидов, а затем прогнозируем класс, который получит большинство голосов. Эта техника называется случайным лесом .

Мы продолжим обучать Случайный Лес следующим образом:

Шаг 1) Импортируйте данные

Чтобы убедиться, что у вас тот же набор данных, что и в учебном пособии для деревьев решений, тесты поездов и набор тестов хранятся в Интернете. Вы можете импортировать их без каких-либо изменений.

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)

Шаг 2) Обучаем модель

Один из способов оценки производительности модели состоит в том, чтобы обучить ее нескольким различным меньшим наборам данных и оценить их по сравнению с другим меньшим набором тестирования. Это называется функцией перекрестной проверки F-Fold . R имеет функцию случайного разделения количества наборов данных практически одинакового размера. Например, если k = 9, модель оценивается по девяти папкам и тестируется на оставшемся тестовом наборе. Этот процесс повторяется до тех пор, пока все подмножества не будут оценены. Этот метод широко используется для выбора модели, особенно когда модель имеет параметры для настройки.

Теперь, когда у нас есть способ оценить нашу модель, нам нужно выяснить, как выбрать параметры, которые лучше всего обобщают данные.

Случайный лес выбирает случайный набор функций и строит множество деревьев решений. Модель усредняет все предсказания деревьев Решений.

Случайный лес имеет некоторые параметры, которые можно изменить, чтобы улучшить обобщение прогноза. Вы будете использовать функцию RandomForest () для обучения модели.

Синтаксис для Рэндон Форест

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

Примечание : Случайный лес можно обучить по большему количеству параметров. Вы можете обратиться к виньетке, чтобы увидеть различные параметры.

Тюнинг модели — очень утомительная работа. Существует много возможных комбинаций между параметрами. У вас не обязательно есть время, чтобы попробовать все из них. Хорошая альтернатива — позволить машине найти лучшую комбинацию для вас. Доступны два метода:

  • Случайный поиск
  • Grid Search

Мы определим оба метода, но во время урока мы будем обучать модель с использованием сетки поиска

Определение сетки поиска

Метод поиска по сетке прост, модель будет оцениваться по всей комбинации, которую вы передаете в функцию, используя перекрестную проверку.

Например, вы хотите попробовать модель с количеством деревьев 10, 20, 30, и каждое дерево будет протестировано на количестве mtry, равном 1, 2, 3, 4, 5. Затем машина протестирует 15 различных моделей:

    .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	

Алгоритм оценит:

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

Каждый раз случайный лес экспериментирует с перекрестной проверкой. Одним из недостатков поиска по сетке является количество экспериментов. Это может стать очень легко взрывоопасным, когда число комбинаций велико. Чтобы преодолеть эту проблему, вы можете использовать случайный поиск

Определение случайного поиска

Большая разница между случайным поиском и сеточным поиском заключается в том, что случайный поиск не оценивает всю комбинацию гиперпараметра в пространстве поиска. Вместо этого он будет случайным образом выбирать комбинацию на каждой итерации. Преимущество состоит в том, что это снижает вычислительные затраты.

Установите параметр управления

Вы будете действовать следующим образом, чтобы построить и оценить модель:

  • Оцените модель с настройкой по умолчанию
  • Найти лучшее количество МТР
  • Найдите лучшее количество maxnodes
  • Найти лучшее количество деревьев
  • Оценить модель по тестовому набору данных

Прежде чем начать исследование параметров, вам необходимо установить две библиотеки.

  • Caret: R библиотека машинного обучения. Если у вас установлена ​​R с r-essential. Это уже в библиотеке
  • e1071: R библиотека машинного обучения.

Вы можете импортировать их вместе с RandomForest

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

Настройки по умолчанию

K-кратная перекрестная проверка контролируется функцией trainControl ()

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.

Вы можете попробовать запустить модель с параметрами по умолчанию и посмотреть оценку точности.

Примечание : вы будете использовать одни и те же элементы управления в течение всего урока.

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

Вы будете использовать библиотеку карет для оценки вашей модели. Библиотека имеет одну функцию под названием train () для оценки почти всех алгоритмов машинного обучения. Другими словами, вы можете использовать эту функцию для обучения других алгоритмов.

Основной синтаксис:

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

Давайте попробуем построить модель со значениями по умолчанию.

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)

Код Объяснение

  • trainControl (method = «cv», number = 10, search = «grid»): оцените модель с помощью поиска по сетке из 10 папок
  • train (…): обучить случайную модель леса. Лучшая модель выбрана с мерой точности.

Вывод:

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

Алгоритм использует 500 деревьев и протестировал три разных значения mtry: 2, 6, 10.

Конечное значение, используемое для модели, было mtry = 2 с точностью 0,78. Давайте попробуем получить более высокий балл.

Шаг 2) Поиск лучших mtry

Вы можете протестировать модель со значениями mtry от 1 до 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)

Код Объяснение

  • tuneGrid <- expand.grid (.mtry = c (3:10)): создать вектор со значением 3:10

Конечное значение, используемое для модели, было mtry = 4.

Вывод:

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

Наилучшее значение mtry хранится в:

rf_mtry$bestTune$mtry

Вы можете сохранить его и использовать, когда вам нужно настроить другие параметры.

max(rf_mtry$results$Accuracy)

Вывод:

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

Вывод:

## [1] 4

Шаг 3) Поиск лучших maxnodes

Вам нужно создать цикл для оценки различных значений maxnodes. В следующем коде вы будете:

  • Создать список
  • Создайте переменную с наилучшим значением параметра mtry; обязательное
  • Создать цикл
  • Сохранить текущее значение maxnode
  • Подвести итоги
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)

Объяснение кода:

  • store_maxnode <- list (): результаты модели будут сохранены в этом списке
  • expand.grid (.mtry = best_mtry): используйте лучшее значение mtry
  • for (maxnodes in c (15:25)) {…}: вычислить модель со значениями maxnodes, начиная с 15 до 25.
  • maxnodes = maxnodes: для каждой итерации maxnodes равно текущему значению maxnodes. то есть 15, 16, 17, …
  • key <- toString (maxnodes): сохранить в качестве строковой переменной значение maxnode.
  • store_maxnode [[key]] <- rf_maxnode: сохранить результат модели в списке.
  • resamples (store_maxnode): упорядочить результаты модели
  • summary (results_mtry): вывести сводку по всей комбинации.

Вывод:

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

Последнее значение maxnode имеет самую высокую точность. Вы можете попробовать с более высокими значениями, чтобы увидеть, если вы можете получить более высокий балл.

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)

Вывод:

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

Наивысшая оценка точности достигается при значении maxnode, равном 22.

Шаг 4) Поиск лучших деревьев

Теперь, когда у вас есть лучшие значения mtry и maxnode, вы можете настроить количество деревьев. Метод точно такой же, как 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)

Вывод:

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

У тебя есть твоя последняя модель. Вы можете обучить случайный лес по следующим параметрам:

  • ntree = 800: 800 деревьев будут обучены
  • mtry = 4: 4 функции выбираются для каждой итерации
  • maxnodes = 24: максимум 24 узла в конечных узлах (листья)
fit_rf <- train(survived~.,
    data_train,
    method = "rf",
    metric = "Accuracy",
    tuneGrid = tuneGrid,
    trControl = trControl,
    importance = TRUE,
    nodesize = 14,
    ntree = 800,
    maxnodes = 24)

Шаг 5) Оценить модель

Библиотека карета имеет функцию прогнозирования.

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

Вы можете использовать прогноз для расчета матрицы путаницы и увидеть оценку точности

confusionMatrix(prediction, data_test$survived)

Вывод:

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

У вас есть точность 0,7943 процента, что выше значения по умолчанию

Шаг 6) Визуализация результата

Наконец, вы можете посмотреть на важность функции с помощью функции varImp (). Кажется, что наиболее важными чертами являются пол и возраст. Это неудивительно, потому что важные элементы могут появляться ближе к корню дерева, в то время как менее важные элементы часто оказываются закрытыми для листьев.

varImpPlot(fit_rf)

Вывод:

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		

Резюме

Мы можем суммировать, как обучать и оценивать случайный лес, используя следующую таблицу:

Библиотека Задача функция параметр
RandomForest Создать случайный лес RandomForest () формула, ntree = n, mtry = FALSE, maxnodes = NULL
знак вставки Перекрестная проверка папки K trainControl () method = «cv», number = n, search = «grid»
знак вставки Обучить случайный лес поезд() формула, df, method = «rf», metric = «Accuracy», trControl = trainControl (), tuneGrid = NULL
знак вставки Прогноз из образца прогнозировать модель, newdata = df
знак вставки Матрица путаницы и статистика confusionMatrix () модель, у тест
знак вставки переменная важность cvarImp () модель

аппендикс

Список моделей, используемых в карете

names>(getModelInfo())

Вывод:

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