1

mlr を使用してテキスト分類タスクを実行しています。ここで説明されているように、カスタムフィルターを作成しました

カスタム フィルターの作成

フィルターは意図したとおりに機能しますが、並列化を試みて使用すると、次のエラーが表示されます。

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

1 に答える 1