在并行执行中使用自定义汇总函数的问题(插入符号)

时间:2016-05-04 07:54:52

标签: r r-caret doparallel

我尝试使用MAPE作为评估模型性能的指标。

在LOOCV和并行执行的情况下,一切正常但如果我使用另一种重采样方法,我会收到此错误:

  

{:任务1失败 - “无法找到功能”mape“”

出错

而不是在串行执行中,这个问题就消失了。

下面的代码提供了一个示例。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primary_dark</item>
</style>

我的操作系统是El Capitan 10.11.4,插入符号的版本是6.0.62。

1 个答案:

答案 0 :(得分:2)

如消息所示,您的并行处理无法找到mape功能。

最简单的解决方案是将mape函数放在mapeSummary函数中,如下所示。然后您的并行进程将正常工作。

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
}

<强>奖金:

您还可以使用clusterEvalQ函数,clusterApply函数之一。这个工作如下,但不是最优雅的解决方案,需要更多的输入:

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