【问题标题】:Using parallelMap Package with Custom Filter in mlr在 mlr 中使用带有自定义过滤器的 parallelMap 包
【发布时间】:2017-06-29 04:15:53
【问题描述】:

我与 mlr 合作执行文本分类任务。我已经编写了一个自定义过滤器,如此处所述

Create Custom Filters

过滤器按预期工作,但是当我尝试使用 parallelization 时,我收到以下错误:

Exporting objects to slaves for mode socket: .mlr.slave.options
Mapping in parallel: mode = socket; cpus = 4; elements = 2.
Error in stopWithJobErrorMessages(inds, vcapply(result.list[inds], as.character)) : 
  Errors occurred in 2 slave jobs, displaying at most 10 of them:

00001: Error in parallel:::.slaveRSOCK() : 
  Assertion on 'method' failed: Must be element of set {'anova.test','carscore','cforest.importance','chi.squared','gain.ratio','information.gain','kruskal.test','linear.correlation','mrmr','oneR','permutation.importance','randomForest.importance','randomForestSRC.rfsrc','randomForestSRC.var.select','rank.correlation','relief','rf.importance','rf.min.depth','symmetrical.uncertainty','univariate','univariate.model.score','variance'}.

我从错误中假设我的自定义过滤器需要成为集合中的一个元素才能有机会并行工作,但如果 (a) 这是可能的,并且 (b ) 如果是,我该怎么做。

提前感谢您的帮助, 阿扎姆

添加:测试脚本 由于敏感性,我不能让您看到我正在使用的实际脚本/数据,但是这个示例重现了我看到的错误。除了自定义特征选择和数据集之外,设置学习器和评估它的步骤与我在“真实”脚本中的步骤相同。与我的实际情况一样,如果您删除了 parallelStartSocket() 命令,那么脚本会按预期运行。

我还应该补充一点,在调整带有 RBF 内核的 SVM 的超参数时,我已经成功地使用了(或者至少我没有收到错误)并行处理:除了 makeParamSet() 定义之外,脚本是相同的。

library(parallelMap)
library(mlr)
library(kernlab)

makeFilter(
  name = "nonsense.filter",
  desc = "Calculates scores according to alphabetical order of features",
  pkg = "mlr",
  supported.tasks = c("classif", "regr", "surv"),
  supported.features = c("numerics", "factors", "ordered"),
  fun = function(task, nselect, decreasing = TRUE, ...) {
    feats = getTaskFeatureNames(task)
    imp = order(feats, decreasing = decreasing)
    names(imp) = feats
    imp
  }
)

# set up svm with rbf kernal
svm.lrn <- makeLearner("classif.ksvm",predict.type = "response")  

# wrap learner with filter
svm.lrn <- makeFilterWrapper(svm.lrn, fw.method = "nonsense.filter")

# define feature selection parameters 

ps.svm = makeParamSet(
  makeDiscreteParam("fw.abs", values = seq(2, 3, 1)) 

)

# define inner search and evaluation strategy
ctrl.svm = makeTuneControlGrid()
inner.svm = makeResampleDesc("CV", iters = 5, stratify = TRUE)

svm.lrn <- makeTuneWrapper(svm.lrn, resampling = inner.svm, par.set = ps.svm, 
                           control = ctrl.svm)

# set up outer resampling
outer.svm <-  makeResampleDesc("CV", iters = 10, stratify = TRUE)

# run it...

parallelStartSocket(2)

run.svm <- resample(svm.lrn, iris.task, 
                    resampling = outer.svm, extract = getTuneResult)

parallelStop()

【问题讨论】:

  • 你能提供一个完整的例子来重现问题吗?
  • @LarsKotthoff,添加到原始帖子的示例脚本。谢谢,阿扎姆

标签: r mlr


【解决方案1】:

问题在于makeFilter 注册了 S3 方法,这些方法在单独的 R 进程中不可用。您有两个选择来完成这项工作:要么简单地使用 parallelStartMulticore(2) 以便所有内容都在同一个 R 进程中运行,要么告诉 parallelMap 需要在其他 R 进程中存在的部分。

后者有两个部分。首先,使用parallelLibrary("mlr") 将mlr 加载到任何地方,并将过滤器的定义拉出到可以使用parallelSource() 加载的单独文件中。例如:

过滤器.R:

makeFilter(
  name = "nonsense.filter",
  desc = "Calculates scores according to alphabetical order of features",
  pkg = "mlr",
  supported.tasks = c("classif", "regr", "surv"),
  supported.features = c("numerics", "factors", "ordered"),
  fun = function(task, nselect, decreasing = TRUE, ...) {
    feats = getTaskFeatureNames(task)
    imp = order(feats, decreasing = decreasing)
    names(imp) = feats
    imp
  }
)

main.R:

library(parallelMap)
library(mlr)
library(kernlab)

parallelStartSocket(2)

parallelLibrary("mlr")
parallelSource("filter.R")

# set up svm with rbf kernal
svm.lrn = makeLearner("classif.ksvm",predict.type = "response")  

# wrap learner with filter
svm.lrn = makeFilterWrapper(svm.lrn, fw.method = "nonsense.filter")

# define feature selection parameters 

ps.svm = makeParamSet(
  makeDiscreteParam("fw.abs", values = seq(2, 3, 1)) 

)

# define inner search and evaluation strategy
ctrl.svm = makeTuneControlGrid()
inner.svm = makeResampleDesc("CV", iters = 5, stratify = TRUE)

svm.lrn = makeTuneWrapper(svm.lrn, resampling = inner.svm, par.set = ps.svm, 
                           control = ctrl.svm)

# set up outer resampling
outer.svm =  makeResampleDesc("CV", iters = 10, stratify = TRUE)

# run it...
run.svm = resample(svm.lrn, iris.task, resampling = outer.svm, extract = getTuneResult)

parallelStop()

【讨论】:

  • 非常感谢。您描述的第二种方法对我有用 - 我在 Windows 下运行它,我认为它不支持 parallelStartMulticore() 变体。最好的祝愿,
猜你喜欢
  • 2012-04-24
  • 1970-01-01
  • 2021-06-21
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2014-08-16
  • 2016-01-23
相关资源
最近更新 更多