所以,到目前为止,我只写了一些R代码(准确地说是2个项目),这可能证明了这个问题的愚蠢程度,这对于经验丰富的程序员来说似乎是正确的。
我正在尝试并行化我的K折叠交叉验证代码,该代码旨在找到用于最终模型的最佳变量集。
代码有点像这样
child <- foreach(i=icount(ncol(parentModel)-1),.combine = 'rbind') %:%{
childModel<-parentModel
childModel[,i]<-NULL
filteredTestMTM <-foreach(j = icount(nFolds),.combine = c, .export = c("DataSplit","getProbabilityThreshold","SharpeRatio")) %dopar% {
splitData <- DataSplit(childModel, nFolds = nFolds, testFold=j)
testData<-splitData$testData
trainingData<-splitData$trainingData
trainingMTM <- trainingData[,ncol(trainingData)]
testMTM <- testData[,ncol(testData)]
Trade <- (trainingMTM > 0.001)*1.0 #mtmThreshold to be used here instead of 0.001
trainingData <- trainingData[,1:(ncol(trainingData)-1),drop=FALSE]
trainingData <- cbind(trainingData, Trade)
logmodel <- glm(Trade ~ .,data=trainingData, family = "binomial"(link="logit") )
trainingData <- trainingData[,1:(ncol(trainingData)-1),drop=FALSE]
trainingResults <- predict(logmodel, newdata=trainingData, type="response")
probabilityThreshold <- getProbabilityThreshold(trainingResults, trainingMTM, 0.001) #new Probability function to be defined to use optimParam
tR <- predict(logmodel, newdata=testData, type="response")
tMTM <- testMTM * ((tR>probabilityThreshold)*1.0)
return(tMTM)
}
totalSharpe <- (mean(filteredTestMTM)/sd(filteredTestMTM))
if (is.nan(totalSharpe)) {
totalSharpe = 0.0
}
return(c(totalSharpe,i ))
}
总结 - 我采用parentModel,逐个删除变量,运行K折叠交叉验证,并收集结果。但是我一直收到错误
Error in `[<-.data.frame`(`*tmp*`, , i, value = NULL) :
object 'i' not found
有人可以帮帮我吗?
编辑:我在Windows 7上。
答案 0 :(得分:1)
我认为问题在于您没有正确使用嵌套运算符%:%
。您必须使用以下表单:
foreach(...) %:%
foreach(...) %dopar% {
..
}
您不能在%:%
之后使用大括号在内部foreach循环之前和之后包含其他操作。
我建议您将代码更改为:
foreach(...) %dopar% {
childModel<-parentModel
childModel[,i]<-NULL
filteredTestMTM <- foreach(...) %do% {
...
}
totalSharpe <- (mean(filteredTestMTM)/sd(filteredTestMTM))
if (is.nan(totalSharpe)) {
totalSharpe = 0.0
}
return(c(totalSharpe,i ))
}
请注意,内部foreach循环是顺序的,这避免了与嵌套并行循环相关的问题。仅平行化外环通常会产生良好的结果并且更简单。如果外部循环没有足够的迭代来使用你的所有内核,我只会烦扰嵌套并行性。
答案 1 :(得分:0)
在处理并行时,您必须确保所需的变量可用于您的核心(&#34;环境&#34;)。
您可以通过force(i)
之类的命令实现此目的 - 有关详细信息,请查看这http://www.win-vector.com/blog/2016/01/parallel-computing-in-r/