我希望在同一数据上测试不同回归/分类算法(即svm,nnet,rpart,randomForest,naiveBayes等)的结果,看看哪种算法效果更好。但我需要让我的代码尽可能短而干净。要测试所有算法,我想使用包mclapply()
的{{1}}调用来运行它们:
multicore
问题是某些算法需要额外的参数,即invisible(lapply(c("party","nnet","caret","klaR","randomForest","e1071","rpart",
"multicore"), require, character.only = T))
algorithms <- c(knn3, NaiveBayes, nnet, ctree, randomForest, svm, naiveBayes, rpart)
data(iris)
model <- mclapply(algorithms, function(alg) alg(Species ~ ., iris))
需要设置参数nnet()
。当然,这可以通过几个size
命令来修复,但有没有更简单的解决方案?
答案 0 :(得分:5)
您可以做的一件事就是替换algorithms
中需要使用部分函数的其他参数的那些,例如。
algorithms <- c(knn3, ctree, function(...) nnet(..., size=2))
答案 1 :(得分:1)
软件包multicore
似乎不适用于Windows,但这是一种方式,只有普通lapply
的简单示例:
# names of the functions as strings
algorithms <- c("lm", "glm")
# arguments for each function (empty list for those which do not need any)
arguments <- list(lm=list(model=FALSE),glm=list(family = gaussian),lm=list())
# Use lapply with do.call
output<-lapply(1:length(algorithms), function(i) do.call(what=algorithms[i],
args=c(list(formula=y ~ .,data=freeny),arguments[[i]])))
names(output)<-algorithms #Add names to output
现在列表output
包含每个算法的输出。请注意,首先看一下此示例的输出(通过命令output$lm
)看起来有点糟糕,因为lm
和glm
的打印显示了函数调用以及摘要,并且函数调用是这里很长。
编辑:一些小调整。