R Random Forest урок с пример

Какво е Random Forest в R?

Случайните гори се основават на проста идея: „мъдростта на тълпата“. Съвкупността от резултатите на множество предиктори дава по-добра прогноза от най-добрия отделен предиктор. Група предиктори се нарича an ансамбъл. Така тази техника се нарича Ансамбъл обучение.

В предишния урок научихте как да използвате Решението дървета за да направите двоична прогноза. За да подобрим техниката си, можем да обучим група от Класификатори на дървото на решенията, всеки в различно произволно подмножество от комплекта влакове. За да направим прогноза, ние просто получаваме прогнозите за всички отделни дървета, след което прогнозираме класа, който получава най-много гласове. Тази техника се нарича Случайна гора.

Стъпка 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 броя дървета и всяко дърво ще бъде тествано през брой 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)
...

Всеки път произволната гора експериментира с кръстосано валидиране. Един недостатък на търсенето в мрежата е броят на експериментите. Може да стане много лесно експлозивен, когато броят на комбинациите е голям. За да преодолеете този проблем, можете да използвате произволното търсене

Определение за произволно търсене

Голямата разлика между произволното търсене и търсенето в мрежа е, че произволното търсене няма да оцени цялата комбинация от хиперпараметър в пространството за търсене. Вместо това, той произволно ще избира комбинация при всяка итерация. Предимството е, че по-ниските изчислителни разходи.

Задайте контролния параметър

Ще продължите както следва, за да конструирате и оцените модела:

  • Оценете модела с настройката по подразбиране
  • Намерете най-добрия брой mtry
  • Намерете най-добрия брой максимални възли
  • Намерете най-добрия брой n дървета
  • Оценете модела върху тестовия набор от данни

Преди да започнете с изследването на параметрите, трябва да инсталирате две библиотеки.

  • caret: R библиотека за машинно обучение. Ако имате инсталирайте 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

Можете да тествате модела със стойности на 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. В следния код ще:

  • Създайте списък
  • Създайте променлива с най-добрата стойност на параметъра 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, …
  • ключ <- toString(maxnodes): Съхранявайте като низова променлива стойността на maxnode.
  • store_maxnode[[ключ]] <- 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) Търсете най-добрите ntrees

Сега, когато имате най-добрата стойност на 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		

Oбобщение

Можем да обобщим как да обучим и оценим произволна гора с таблицата по-долу:

Библиотека Цел функция Параметър
randomForest Създайте произволна гора RandomForest() формула, ntree=n, mtry=FALSE, maxnodes = NULL
каретка Създайте кръстосано валидиране на папка K trainControl() метод = “cv”, число = n, търсене =”мрежа”
каретка Тренирайте произволна гора влак() формула, df, метод = “rf”, metric= “Точност”, trControl = trainControl(), tuneGrid = NULL
каретка Прогнозирайте извън извадката предскаже модел, нови данни= df
каретка Матрица на объркването и статистика confusionMatrix() модел, y тест
каретка променлива важност 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"

Обобщете тази публикация с: