2017-02-10 8 views
0

나는 mlr을 사용하여 텍스트 분류 작업을 수행합니다.mlr의 사용자 정의 필터와 함께 parallelMap 패키지 사용

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'}. 

내가로부터 있으리라 믿고있어 : 의도 한대로

Create Custom Filters

이 필터는, 그러나 나는 시도하고 나는 다음과 같은 오류가 발생 parallelization을 ustilise 작품

때 여기에 설명 된 바와 같이 나는 사용자 정의 필터를 작성했습니다 내 사용자 지정 필터가 집합에서 병렬로 작업 할 수있는 기회가 될 필요가 있지만 (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() 
+0

이 문제를하시기 바랍니다 재현 할 수있는 완전한 예제를 제공 할 수 있을까요? –

+0

@LarsKotthoff, 원본 게시물에 예제 스크립트가 추가되었습니다. 고마워요, Azam –

답변

1

문제는 R makeFilter 별도 공정에서 사용할 수없는 S3 방법을 등록하는 것이다. 이 작업을 수행하는 데는 두 가지 옵션이 있습니다. parallelStartMulticore(2)을 사용하여 모든 것이 동일한 R 프로세스에서 실행되도록하거나 parallelMap에 다른 R 프로세스에 있어야 할 부분을 지정하십시오.

두 부분으로 나뉩니다. 먼저 parallelLibrary("mlr")을 사용하여 모든 곳에서 mlr을로드하고 필터의 정의를 parallelSource()을 사용하여로드 할 수있는 별도의 파일로 추출합니다.

filter.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() 
+0

고마워요. 두 번째 방법은 나를 위해 일했다 - 나는 parallelStartMulticore() 변종을 지원하지 않습니다 믿는 Windows에서 실행 해요. 기원합니다. –