Учебное пособие по алгоритму случайного леса в R: алгоритм с примером.
⚡ Умное резюме
Алгоритм Random Forest в R строит сотни деревьев решений на основе бутстрапированных выборок и усредняет их голоса, получая одно надежное предсказание. В этом пошаговом руководстве настраиваются параметры mtry, maxnodes и ntree с помощью caret, а затем оценивается итоговая модель на данных о выживаемости пассажиров «Титаника».

Что такое случайный лес в R?
Случайные леса основаны на простой идее: «мудрости толпы». Совокупность результатов нескольких предикторов дает лучший прогноз, чем лучший индивидуальный предиктор. Группа предикторов называется вместе. Таким образом, эта технология называется Обучение ансамблю.
В предыдущем уроке вы научились использовать деревья решений сделать бинарный прогноз. Чтобы улучшить нашу технику, мы можем обучить группу Классификаторы дерева решенийКаждый из них обрабатывается на разном случайном подмножестве обучающего набора данных. Для прогнозирования собираются прогнозы всех отдельных деревьев, и возвращается класс, получивший наибольшее количество голосов. Этот метод называется Случайный Лес.
Прежде чем писать код, полезно точно представить, как лес состоит из отдельных деревьев.
Как работает алгоритм случайного леса в R?
Понимание механики упрощает осмысление каждого параметра настройки. Случайный лес строится в четыре этапа.
- Bootstrap выборки. Алгоритм выбирает случайную выборку строк. с заменой из обучающего набора для каждого дерева. Примерно одна треть строк исключается из каждой выборки; это наблюдения вне выборки (OOB).
- Случайный выбор признаков. При каждом разделении рассматривается только случайное подмножество предикторов. Размер этого подмножества определяется следующим образом: mtry параметр. Ограничение выбора предотвращает сходство всех деревьев.
- Необрезанные побеги деревьев. Каждое дерево растёт, пока не остановится.ping правило, например максузлы or размер узлаОтдельным деревьям намеренно позволяют переобучаться, поскольку их ошибки не коррелируют.
- Агрегация. Для классификации алгоритм возвращает класс с наибольшим количеством голосов; для регрессии он возвращает среднее предсказание. Этот этап усреднения и есть то, что называется... мешковина (агрегирование методом бутстрапа) описывает.
Вся хитрость заключается в использовании построчной и столбцовой выборки. Одно глубокое дерево имеет низкое смещение и очень высокую дисперсию; усреднение сотен таких деревьев позволяет сохранить низкое смещение, одновременно снижая дисперсию.
Ошибка, связанная с выходом за пределы упаковки. Поскольку каждое наблюдение исключается примерно из трети деревьев, R может оценить каждую строку, используя только те деревья, которые ее никогда не видели. Полученная ошибка OOB представляет собой бесплатную, встроенную оценку проверки, выводимую функцией randomForest():
rf_oob <- randomForest(survived~., data = data_train, ntree = 800, mtry = 4) print(rf_oob) # reports the OOB estimate of error rate
Ошибка OOB — это удобная быстрая проверка, но в этом руководстве используется десятикратная перекрестная проверка с помощью caret, поэтому каждая сетка настройки сравнивается на идентичных фолдах.
Случайный лес против дерева решений в R
Случайный лес — это ансамбль одинаковых деревья решений Мы уже рассматривали этот вопрос в предыдущем уроке, поэтому стоит четко обозначить различия, прежде чем делать выбор.
| Критерии | Древо решений | Случайный Лес |
|---|---|---|
| Структура: | Одно дерево | Сотни деревьев объединены голосованием |
| дисперсия | Высокая чувствительность к обучающей выборке. | Низкий уровень, усреднение компенсирует отдельные ошибки. |
| Риск переобучения | Высокий, если не обрезать. | Низкий уровень даже при отсутствии обрезки деревьев. |
| Интерпретируемость | Полностью читаемая блок-схема. | Читать можно только информацию о важности переменных. |
| Стоимость обучения | Очень быстро | Пропорционально ntree |
| Встроенная проверка | Ничто | Оценка ошибки вне выборки |
| Функция R | рчасть() | randomForest() |
Выбирайте однодерево, когда необходимо объяснить путь принятия решения неспециалисту. Выбирайте лес, когда точность прогнозирования важнее, чем понятная диаграмма.
Преимущества и недостатки случайного леса
Знание сильных и слабых сторон алгоритма позволяет определить, когда стоит вложить усилия в его оптимизацию.
Преимущества
- Точность без обрезки: Усреднение множества некоррелированных деревьев дает хорошие результаты при минимальной ручной настройке.
- Устойчивость к переобучению: Добавление большего количества деревьев никогда не увеличивает ошибку обобщения, поэтому значение ntree можно безопасно увеличить.
- Обрабатывает смешанные данные: Числовые и факторные предикторы работают параллельно, и масштабирование не требуется.
- Бесплатная проверка и ранжирование: Ошибка OOB и функция varImp() не требуют дополнительных вычислительных затрат.
Недостатки
- Непрозрачные прогнозы: ты не можешь tracEA — это единственный путь принятия решения, что имеет значение в регулируемой среде.
- Медленно в больших лесных массивах: Время обучения и прогнозирования масштабируется линейно с количеством деревьев.
- Смещенные оценки важности: Категориальные переменные с множеством уровней могут казаться более важными, чем они есть на самом деле.
- Слабая экстраполяция: При регрессионном анализе лес никогда не сможет предсказывать результаты за пределами диапазона, наблюдаемого в обучающей выборке.
После того, как теория и компромиссы были определены, следующие шесть шагов включают в себя создание, настройку и сквозную оценку случайного леса на наборе данных о выживших на «Титанике».
Шаг 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) Обучите модель
Один из способов оценить производительность модели — обучить её на нескольких разных, меньших по размеру наборах данных и оценить результаты на другом, меньшем по размеру тестовом наборе. Это называется K-кратная перекрестная проверка. R Существует функция, которая случайным образом разбивает данные на k подмножеств почти одинакового размера. Например, если k = 10, модель обучается на девяти фолдах и оценивается на оставшемся фолде. Этот процесс повторяется до тех пор, пока не будут оценены все подмножества. Этот метод широко используется для выбора модели, особенно когда у модели есть параметры для настройки.
Теперь, когда у нас есть способ оценить нашу модель, нам нужно решить, какие параметры лучше всего обобщаются на ранее не встречавшиеся данные.
Случайный лес выбирает случайное подмножество функций и строит множество деревьев решений. Модель усредняет все прогнозы деревьев решений.
В алгоритме случайного леса есть несколько параметров, которые можно изменять для улучшения обобщающей способности прогнозирования. Для обучения модели вы будете использовать функцию randomForest().
Синтаксис функции 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 candidate variables drawn at each split. By default, it is the square root of the number of predictors for classification. - maxnodes: Set the maximum number of terminal nodes each tree can have - importance=TRUE: Whether independent variables importance in the random forest be assessed
Внимание: Случайный лес можно обучать по большему количеству параметров. Вы можете обратиться к виньетка чтобы увидеть различные параметры.
Настройка модели — утомительная работа. Существует множество возможных комбинаций параметров. У вас не всегда есть время, чтобы перепробовать их все. Хорошая альтернатива — позволить машине найти наилучшую комбинацию за вас. Доступны два метода:
- Случайный поиск
- Поиск сетки
Оба метода описаны ниже, но в этом руководстве обучение модели проводится с использованием метода перебора по сетке.
Определение поиска по сетке
Метод поиска по сетке прост: модель будет оцениваться по всей комбинации, которую вы передаете в функцию, с использованием перекрестной проверки.
Например, вы хотите опробовать модель с количеством деревьев 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 с р-эссенциальным. Это уже есть в библиотеке
- Анаконда: conda install -cr r-caret
- e1071: Библиотека машинного обучения R.
- Анаконда: установка conda -cr r-e1071
Вы можете импортировать их вместе со 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 folds to create - search = "grid": Use the grid search method. For the randomized method, use "random" Note: You can refer to the vignette to see the other arguments of the function.
Вы можете попробовать запустить модель с параметрами по умолчанию и посмотреть оценку точности.
Внимание: вы будете использовать одни и те же элементы управления на протяжении всего урока.
# 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)
Code объяснение
- 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.792. Давайте попробуем получить более высокий балл.
Найдите лучшие варианты 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)
Code объяснение
- tuneGrid <- expand.grid(.mtry = c(1:10)): Создает вектор со значениями от 1 до 10
Выход:
## 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 равно 4. Оно хранится в:
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)
Code объяснение:
- store_maxnode <- list(): результаты модели будут храниться в этом списке.
- expand.grid(.mtry=best_mtry): используйте лучшее значение mtry.
- for (maxnodes in c(5:15)) { … }: Вычислите модель со значениями maxnodes от 5 до 15.
- maxnodes = maxnodes: Для каждой итерации maxnodes равно текущему значению цикла, т.е. 5, 6, 7, …
- current_iteration <- toString(maxnodes): Сохраняет значение maxnodes в виде строки.
- store_maxnode[[current_iteration]] <- 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
Наивысшая средняя точность в этом диапазоне (0.8099) достигается при значении maxnodes = 14, в верхней части тестируемого интервала. Поскольку наилучшее значение находится на краю сетки, следует расширить область поиска вверх.
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
Наивысшая средняя точность, 0.8135, достигается при значении maxnodes = 24 (maxnodes = 27 имеет такое же среднее значение, но более низкий третий квартиль). Поэтому для оставшихся шагов вы будете использовать maxnodes = 24.
Шаг 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, то есть 79.43 процента на невидимом тестовом наборе, что выше, чем при конфигурации по умолчанию. Чувствительность составляет 0.9091, а специфичность — 0.6364, поэтому модель распознает умерших гораздо надежнее, чем выживших.
Шаг 6) Визуализируйте результат
Наконец, вы можете оценить важность признаков с помощью функции varImp(). Наиболее важными признаками являются пол и возраст. Это неудивительно, поскольку важные признаки, как правило, располагаются ближе к корню дерева, в то время как менее важные признаки обычно находятся ближе к листьям.
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
Случайный лес в R: краткий справочник функций
В таблице ниже перечислены все функции, используемые на всех шести этапах, пакет, который их предоставляет, и ожидаемые параметры.
| Библиотека | Цель | Функция | Параметр |
|---|---|---|---|
| случайный лес | Создать случайный лес | randomForest() | формула, ntree=n, mtry=FALSE, maxnodes = NULL |
| знак вставки | Создайте k-кратную перекрестную проверку. | поездКонтроль() | метод = «резюме», число = n, поиск = «сетка» |
| знак вставки | Обучить случайный лес | тренироваться() | формула, df, метод = «rf», метрика = «Точность», trControl = trainControl(), TuneGrid = NULL |
| знак вставки | Прогнозирование вне выборки | предсказывать | модель, новые данные = df |
| знак вставки | Матрица путаницы и статистика | путаницаМатрица() | модель, тест |
| знак вставки | Важность переменных | varImp() | модели |
Приложение: Модели, доступные в caret
Функция train() может подбирать модели не только из случайных лесов. Выполните команду ниже, чтобы вывести все идентификаторы моделей, поддерживаемые функцией caret, а затем передайте любой из них в качестве аргумента метода.
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"
