2017-02-10 7 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

としてカスタムフィルタを書かれており、かつustilise parallelizationています私のカスタムフィルタがセット内の要素であり、同時に動作する可能性があるが、(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

makeFilterはS3メソッドを登録していますが、これは別のRプロセスでは利用できません。この作業を行うには2つの選択肢があります:parallelStartMulticore(2)を使用して、すべて同じRプロセスで実行するか、またはparallelMapに他のRプロセスに存在する必要があることを伝えます。

後者には2つの部分があります。まず、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

ありがとう。私が説明している2番目の方法は私のために働いています - 私はparallelStartMulticore()バリアントをサポートしていないと私は思っています。ご多幸を祈る、 –

関連する問題