4

我正在寻找在相同数据上测试不同回归/分类算法(即 svm、nnet、rpart、randomForest、naiveBayes 等)的结果,看看哪个效果更好。但我需要让我的代码尽可能短而干净。为了测试所有算法,我想使用一次mclapply()package 调用来运行它们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设置参数。当然这可以通过几个if,else命令来解决,但是有没有更简单的解决方案?

4

2 回答 2

5

您可以做的一件事是algorithms用部分函数替换那些需要额外参数的参数,例如

algorithms <- c(knn3, ctree, function(...) nnet(..., size=2))
于 2013-03-28T20:01:19.183 回答
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,这个示例的输出(通过 command )看起来有点糟糕,因为打印lmglm显示了函数调用以及摘要,并且这里的函数调用很长。

编辑:一些小的调整。

于 2013-03-28T21:03:51.317 回答