Запуск списка функций с разными параметрами одной командой

Я хочу проверить результаты различных алгоритмов регрессии/классификации (например, svm, nnet, rpart, randomForest, naiveBayes и т. д.) на одних и тех же данных, чтобы увидеть, какой из них работает лучше. Но мне нужно, чтобы мой код был как можно короче и чище. Чтобы протестировать все алгоритмы, я хочу запустить их, используя один вызов mclapply() пакета 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 команд, но есть ли более простое решение?


person Ali    schedule 28.03.2013    source источник
comment
Вы можете попробовать заменить nnet оберткой: algorithms[[3]] <- function(...) nnet(...,size=your_size)   -  person Ferdinand.kraft    schedule 29.03.2013


Ответы (2)


Одна вещь, которую вы можете сделать, это заменить те в algorithms, которые требуют дополнительных аргументов, частичными функциями, например.

algorithms <- c(knn3, ctree, function(...) nnet(..., size=2))
person Matthew Plourde    schedule 28.03.2013
comment
Аналогично, с пакетом functional вы можете использовать Curry(nnet, size=2) в качестве функции. - person Brian Diggs; 29.03.2013
comment
Это отличное решение. Я думаю, можем ли мы легко присвоить имена алгоритмов names() результата mclapply() без дополнительного определения переменной: т.е. alg.names <- c("knn3",... - person Ali; 29.03.2013
comment
@BrianDiggs ага, Curry! Я знал, что это где-то там. - person Matthew Plourde; 29.03.2013
comment
Атомные векторы @Ali принимают имена, поэтому вы можете сделать c(knn3=knn3, nnet=function(...) nnet(..., 2), etc.). Я не могу вспомнить, сохранит ли mclapply эти имена, но в любом случае вы можете использовать names(model) <- names(algorithms). - person Matthew Plourde; 29.03.2013

Пакет 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 показывает вызов функции вместе со сводкой, а вызов функции здесь довольно длинный.

редактировать: Небольшая настройка.

person Jouni Helske    schedule 28.03.2013