Параметры каретки настраиваются с помощью объекта trainControl()
.У него нет параметра для указания периода ожидания.
Два параметра в trainControl()
, которые оказывают наибольшее влияние на производительность во время выполнения, это method=
и number=
.По умолчанию в каретке используется метод boot
или начальная загрузка.Значение по умолчанию number
для метода начальной загрузки - 25, если method="cv"
.
Таким образом, randomForest
запуск с каретой будет выполнять 25 итераций образцов начальной загрузки, очень медленный процесс, особенно если он выполняется в одном потоке процессора.
Форсирование тайм-аута
*Для функций 1018 * R можно задать период ожидания с помощью функции
withTimeout()
из пакета
R.utils
.
Например, мы будем запускать случайный лес с помощью каретки с помощью mtcarsнабора данных и выполнить 500 итераций выборки при начальной загрузке, чтобы train()
работал дольше 15 секунд.Мы будем использовать withTimeout()
, чтобы остановить обработку после 15 секунд процессорного времени.
data(mtcars)
library(randomForest)
library(R.utils)
library(caret)
fitControl <- trainControl(method = "boot",
number = 500,
allowParallel = FALSE)
withTimeout(
theModel <- train(mpg ~ .,data=mtcars,method="rf",trControl=fitControl)
,timeout=15)
... и первая часть вывода:
> withTimeout(
+ theModel <- train(mpg ~ .,data=mtcars,method="rf",trControl=fitControl)
+ ,timeout=15)
[2018-05-19 07:32:37] TimeoutException: task 2 failed - "reached elapsed time limit" [cpu=15s, elapsed=15s]
Улучшение caret
производительности
Помимо простого отключения функции caret::train()
, мы можем использовать два метода для повышения производительности caret::train()
, параллельной обработки и корректировки параметров trainControl()
.
- Для кодирования сценария R для использования параллельной обработки требуются пакеты
parallel
и doParallel()
, и это многоэтапный процесс. - Изменение
method="boot"
на method="cv"
(перекрестная проверка в k-кратном размере) и уменьшение number=
до 3
или 5
значительно улучшат производительность во время выполнения caret::train()
.
Методы суммирования, которые я ранее описывал в Повышение производительности произвольного леса с помощью caret :: train () , в следующем коде используется набор данных Sonar
для реализации параллельной обработки с caret
и randomForest
.
#
# Sonar example from caret documentation
#
library(mlbench)
library(randomForest) # needed for varImpPlot
data(Sonar)
#
# review distribution of Class column
#
table(Sonar$Class)
library(caret)
set.seed(95014)
# create training & testing data sets
inTraining <- createDataPartition(Sonar$Class, p = .75, list=FALSE)
training <- Sonar[inTraining,]
testing <- Sonar[-inTraining,]
#
# Step 1: configure parallel processing
#
library(parallel)
library(doParallel)
cluster <- makeCluster(detectCores() - 1) # convention to leave 1 core for OS
registerDoParallel(cluster)
#
# Step 2: configure trainControl() object for k-fold cross validation with
# 5 folds
#
fitControl <- trainControl(method = "cv",
number = 5,
allowParallel = TRUE)
#
# Step 3: develop training model
#
system.time(fit <- train(Class ~ ., method="rf",data=Sonar,trControl = fitControl))
#
# Step 4: de-register cluster
#
stopCluster(cluster)
registerDoSEQ()
#
# Step 5: evaluate model fit
#
fit
fit$resample
confusionMatrix.train(fit)
#average OOB error from final model
mean(fit$finalModel$err.rate[,"OOB"])
plot(fit,main="Accuracy by Predictor Count")
varImpPlot(fit$finalModel,
main="Variable Importance Plot: Random Forest")
sessionInfo()