Mir*_*rko 5 parallel-processing r machine-learning reproducible-research random-seed
我无法设置种子值来从中获得可重复的结果parallelSVM()。
library(e1071)
library(parallelSVM)
data(iris)
x <- subset(iris, select = -Species)
y <- iris$Species
set.seed(1)
model <- parallelSVM(x, y)
parallelPredictions <- predict(model, x)
set.seed(1)
model2 <- parallelSVM(x, y)
parallelPredictions2 <- predict(model2, x)
all.equal(parallelPredictions,parallelPredictions2)
Run Code Online (Sandbox Code Playgroud)
我知道这不是为多核操作设置种子值的正确方法,但是我不知道该怎么做。
我知道使用时有一个选项,mclapply但这对我的情况没有帮助。
编辑:
我已经发现通过改变功能的溶液trainSample()内的parallelSVM具有trace和doRNG包装用于与种子foreach循环。
有人知道更好的解决方案吗?
简而言之,没有实现的方法来parallelSVM处理这个问题。然而,该包使用foreach和doParallel包来处理它的并行操作。在 stackoverflow 上努力挖掘解决方案是可能的!
感谢这个答案,关于包的使用doRNG,以及这个答案给了我一个更简单的封闭解决方案的想法。
在parallelSVM包中,并行化是通过parallelSVM::registerCores函数进行的。该函数仅doParallel::registerDoParallel使用核心数量进行调用,没有其他参数。我的想法只是改变parallelSVM::registerCores函数,以便它在创建新集群后自动设置种子。
当执行并行计算时,您需要并行种子,您需要确保两件事
幸运的是,该doRNG包处理了第一个,并使用了一个在 2 上可以使用的种子。使用unlockNamespace和 的组合,assign我们可以覆盖parallelSVM::registerCores,这样它就包含了doRNG::registerDoRNG对适当种子的调用(答案末尾的函数)。这样做我们实际上可以获得适当的再现性,如下所示:
library(parallelSVM)
library(e1071)
data(magicData)
set.seed.parallelSWM(1) #<=== set seed as we would normally.
#Example from help(parallelSVM)
system.time(parallelSvm1 <- parallelSVM(V11 ~ ., data = trainData[,-1],
numberCores = 4, samplingSize = 0.2,
probability = TRUE, gamma=0.1, cost = 10))
system.time(parallelSvm2 <- parallelSVM(V11 ~ ., data = trainData[,-1],
numberCores = 4, samplingSize = 0.2,
probability = TRUE, gamma=0.1, cost = 10))
pred1 <- predict(parallelSvm1)
pred2 <- predict(parallelSvm2)
all.equal(pred1, pred2)
[1] TRUE
identical(parallelSvm1, parallelSvm2)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
请注意,identical没有能力正确评估由parallel::parallelSvm,因此预测最好检查模型是否相同。
为了安全起见,让我们检查问题中的可重现示例是否也是这种情况
x <- subset(iris, select = -Species)
y <- iris$Species
set.seed.parallelSWM(1) #<=== set seed as we would normally (not necessary if above example has been run).
model <- parallelSVM(x, y)
model2 <- parallelSVM(x, y)
parallelPredicitions <- predict(model, x)
parallelPredicitions2 <- predict(model2, x)
all.equal(parallelPredicitions, parallelPredicitions2)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
唷..
最后,如果我们完成了,或者如果我们再次想要随机种子,我们可以通过执行来重置种子
set.seed.parallelSWM() #<=== set seed to random each execution (standard).
#check:
model <- parallelSVM(x, y)
model2 <- parallelSVM(x, y)
parallelPredicitions <- predict(model, x)
parallelPredicitions2 <- predict(model2, x)
all.equal(parallelPredicitions, parallelPredicitions2)
[1] "3 string mismatches"
Run Code Online (Sandbox Code Playgroud)
(由于未设置 RNNG 种子,输出会有所不同)
归功于这个答案。请注意,我们可能不必在作业上加倍,但在这里我只是简单地复制了答案,而没有检查代码是否可以进一步减少。
set.seed.parallelSWM <- function(seed, once = TRUE){
if(missing(seed) || is.character(seed)){
out <- function (numberCores)
{
cluster <- parallel::makeCluster(numberCores)
doParallel::registerDoParallel(cluster)
}
}else{
require("doRNG", quietly = TRUE, character.only = TRUE)
out <- function(numberCores){
cluster <- parallel::makeCluster(numberCores)
doParallel::registerDoParallel(cluster)
doRNG::registerDoRNG(seed = seed, once = once)
}
}
unlockBinding("registerCores", as.environment("package:parallelSVM"))
assign("registerCores", out, "package:parallelSVM")
lockBinding("registerCores", as.environment("package:parallelSVM"))
unlockBinding("registerCores", getNamespace("parallelSVM"))
assign("registerCores", out, getNamespace("parallelSVM"))
lockBinding("registerCores", getNamespace("parallelSVM"))
#unlockBinding("registerCores", as.environment("package:parallelSVM"))
invisible()
}
Run Code Online (Sandbox Code Playgroud)