Я пытаюсь приспособить случайный лес к настройке параметров с помощью Caret / R.Это работает, но если я пытаюсь в многоядерной обработке, это больше не работает.Я использую Windows в качестве ОС.
# define parameters to tune
customRF <- list(type = "Classification", library = "randomForest", loop = NULL)
customRF$parameters <- data.frame(parameter = c("mtry", "ntree","nodesize"), class = rep("numeric", 3), label = c("mtry", "ntree","nodesize"))
customRF$grid <- function(x, y, len = NULL, search = "grid") {}
customRF$fit <- function(x, y, wts, param, lev, last, weights, classProbs, ...) {
randomForest(x, y, mtry = param$mtry, ntree=param$ntree, nodesize=param$nodesize, ...)
}
customRF$predict <- function(modelFit, newdata, preProc = NULL, submodels = NULL)
predict(modelFit, newdata)
customRF$prob <- function(modelFit, newdata, preProc = NULL, submodels = NULL)
predict(modelFit, newdata, type = "prob")
customRF$sort <- function(x) x[order(x[,1]),]
customRF$levels <- function(x) x$classes
# define values of parameters to tune
library("doParallel")
Sys.time()
control <- trainControl(method="repeatedcv", number=10,classProbs = TRUE,summaryFunction = twoClassSummary)
tunegrid <- expand.grid(.mtry=c(1,5,11), .ntree=c(20,30,40), .nodesize=c(1, 5, 10))
set.seed(123)
# train model in parallel
registerDoParallel(5)
getDoParWorkers()
Sys.time()
custom <- caret::train(churn2~., data=train05, method=customRF, metric="ROC", tuneGrid=tunegrid,
trControl=control,allowParallel= TRUE)
Sys.time()
registerDoSEQ()
При обработке parralel я получаю следующее сообщение:
Предупреждение: в nominalTrainWorkflow (x = x, y = y, wts =weights, info = trainInfo,: в пересчитанных показателях производительности отсутствовали значения.
Мои результаты также неверны. Один и тот же AUC дается для каждого пробного кода. Это не относится к многоядерной обработке.
Я проверил другие вопросы, такие как Предупреждающее сообщение: "пропущенные значения в пересчитанных показателях производительности" в caret train () с использованием rpart или parRF на каретке, не работающей для более чем одного ядра , но это не решает мою проблему.