2013-03-28 29 views
4

我期待在相同數據上測試不同迴歸/分類算法(即svm,nnet,rpart,randomForest,naiveBayes等)的結果,以查看哪些效果更好。但我需要讓我的代碼儘可能簡短和乾淨。爲了測試所有的算法,我想用包multicoremclapply()調用運行它們:使用單個命令運行帶有不同參數的函數列表

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命令修復,但有沒有更簡單的解決方案?

+2

您可以嘗試用wrapper替換'nnet':算法[[3]] < - function(...)nnet(...,size = your_size)' –

回答

5

你可以做的一件事是替換那些需要部分功能的附加參數的algorithms,例如,

algorithms <- c(knn3, ctree, function(...) nnet(..., size=2)) 
+0

與'functional'軟件包相同,你可以使用'Curry(nnet,size = 2)'作爲函數。 –

+0

這是一個很好的解決方案。我在想如果我們可以很容易地將算法的名字賦給'mclapply()'結果的'names()',而不需要額外的變量定義:即'alg.names < - c(「knn3」,...' – Ali

+0

@BrianDiggs我知道這是在那裏。 –

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)看起來有點不可靠,因爲lmglm的打印顯示函數調用以及摘要,並且函數調用在此處相當長。

編輯:一些小調整。