Учебное пособие по R Random Forest с примером

Что такое случайный лес в 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-кратная перекрестная проверка функцию. R имеет функцию случайного разделения наборов данных почти одинакового размера. Например, если k=9, модель оценивается по девяти папкам и тестируется на оставшемся наборе тестов. Этот процесс повторяется до тех пор, пока не будут оценены все подмножества. Этот метод широко используется для выбора модели, особенно когда модель имеет параметры для настройки.

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

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

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

Синтаксис для Randon Forest:

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

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

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

  • Случайный поиск
  • Поиск сетки

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

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

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

Например, вы хотите опробовать модель с количеством деревьев 10, 20, 30, и каждое дерево будет проверено за количество попыток, равное 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)
...

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

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

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

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

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

  • Оцените модель с настройкой по умолчанию
  • Найдите лучшее количество попыток
  • Найдите лучшее количество максимальных узлов
  • Найдите наилучшее количество nдеревьев
  • Оцените модель на тестовом наборе данных.

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

  • курсор: библиотека машинного обучения R. Если у вас есть установить R с р-эссенциальным. Это уже есть в библиотеке
  • 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 от 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		

Итого

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

Библиотека Цель Функция Параметр
случайный лес Создать случайный лес СлучайныйЛес() формула, ntree=n, mtry=FALSE, maxnodes = NULL
знак вставки Создать перекрестную проверку папки K поездКонтроль() метод = «резюме», число = n, поиск = «сетка»
знак вставки Обучить случайный лес тренироваться() формула, df, метод = «rf», метрика = «Точность», trControl = trainControl(), TuneGrid = NULL
знак вставки Прогнозирование вне выборки предсказывать модель, новые данные = df
знак вставки Матрица путаницы и статистика путаницаМатрица() модель, тест
знак вставки переменная важность кварИмп() модель

Приложение

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

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"