Wie die Nachrichtenzustände können Ihre parallel Vorarb die mape Funktion nicht finden.
Die einfachste Lösung ist die mape Funktion in der mapeSummary Funktion wie unten zu setzen. Dann werden Ihre parallelen Prozesse korrekt funktionieren.
mapeSummary <- function (data, lev = NULL, model = NULL) {
mape <- function(y, yhat) mean(abs((y - yhat)/y))
out <- mape(data$obs, data$pred)
names(out) <- "MAPE"
out
}
Bonus:
Sie dort auch die clusterEvalQ
Funktion, einer der clusterApply Funktionen machen können. Dies funktioniert wie unten, ist aber nicht die eleganteste Lösung und mehr Typisierung erfordert:
cl <- makePSOCKcluster(detectCores()-1)
clusterEvalQ(cl, mape <- function(y, yhat) mean(abs((y - yhat)/y)))
registerDoParallel(cl)
mapeSummary <- function (data, lev = NULL, model = NULL) {
out <- mape(data$obs, data$pred)
names(out) <- "MAPE"
out
}
#Bootstrapping - parallel
trControlBootPar <- trainControl(allowParallel = T,
verboseIter = T,
method = "boot",
summaryFunction = mapeSummary)
train(y = environmental$ozone,
x = environmental[, -1],
method = "glmnet",
trControl = trControlBootPar,
metric = "MAPE",
maximize = FALSE)
stopCluster(cl)
registerDoSEQ()