Машинное обучение с помощью карета: как указать время ожидания? - PullRequest
0 голосов
/ 19 мая 2018

Можно ли указать время ожидания при обучении модели в R с использованием train из библиотеки caret?Если нет, существует ли конструкция R, которая оборачивает код и может быть завершена через определенное время?

1 Ответ

0 голосов
/ 19 мая 2018

Параметры каретки настраиваются с помощью объекта 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().

  1. Для кодирования сценария R для использования параллельной обработки требуются пакеты parallel и doParallel(), и это многоэтапный процесс.
  2. Изменение 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...