2016-05-04 7 views
0

Ich versuche, die MAPE als Metrik zu verwenden, um die Leistung eines Modell zu bewerten.Ausgabe mit benutzerdefinierter Auswertungsfunktion in der parallelen Ausführung (caret)

Im Fall LOOCV und parallelen Ausführung funktioniert alles, aber wenn ich eine andere Resampling-Methode verwenden, bekomme ich diesen Fehler:

Error in { : task 1 failed - “could not find function ”mape“”

Statt in serieller Ausführung dieses Problem verschwindet.

Der folgende Code zeigt ein Beispiel.

Mein Betriebssystem ist El Capitan 10.11.4 und die Version von Caret ist 6.0.62.

Antwort

1

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() 
Verwandte Themen