Предоставление нескольких методов в цикле и сохранение вывода - PullRequest
0 голосов
/ 17 января 2019

РЕДАКТИРОВАТЬ: На самом деле, глядя на метод показывает, что он использует только один метод, как я могу написать цикл, чтобы выбрать метод, заданный вектор методов?!

Я посмотрел на пару вопросов ( Цикл в R: как сохранить результаты? ), но, похоже, не могу понять, как сохранить выходные данные этих моделей. Вот моя «функция»:

library(caret)
Control<-trainControl(method="cv",number=5)
metric<-"Accuracy"
modeler<-function(df,yname,xname,method,metric,control){
  df<-df
  methods1<-method
 f1<-as.formula(paste0(yname,"~",xname))
 for(method in methods1){
   fit<-do.call("train",list(data=quote(df),f1,metric=metric,trControl=control,
                             method=method)) 

 }
fit
}

Реализация "функции":

methods1<-c("rf","rpart")
modeler(iris,yname="Species",xname=".",method = methods1,control=Control,
        metric = metric)

Теперь я могу сохранить выше, как:

mod1<-modeler(iris,yname="Species",xname=".",method = methods1,control=Control,
        metric = metric)

А потом:

sapply(mod1,"[",1)

Это работает, но возвращает только последнюю модель и не самые лучшие дисплеи. Как я могу оптимизировать этот процесс?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Вот краткий ответ для ключевых частей.
С методами1 как вектором методов можно использовать функцию lapply:

methods1<-c("rf","rpart")

#use lapply to loop through the methods
#fit will be a list of the results from modeler
fit<-lapply(methods1, function(met) {
  modeler(iris,yname="Species",xname=".",method = met,control=Control, metric = metric)
})

Если вычисления занимают много времени, можно легко выполнить функцию lapply параллельно с пакетом parallel.

0 голосов
/ 17 января 2019

На основании комментария @ Dave2e: Вот как мне удалось «решить» это:

library(caret)
Control<-trainControl(method="cv",number=5)
metric<-"Accuracy"
modeler<-function(df,yname,xname,method,metric,control){
  df<-df
  methods1<-method
 f1<-as.formula(paste0(yname,"~",xname))
 for(method in methods1){
   fit<-do.call("train",list(data=quote(df),f1,metric=metric,trControl=control,
                             method=methods1)) 

 }
data.frame(fit$results,Type=fit$modelInfo$tags[1])
}

Реализация:

methods1<-c("rf","rpart")
lapply(methods1, function(met) {modeler(iris,yname="Species",xname=".",
                              method = met,control=Control, metric = metric)})

Результат без семени: этого по-прежнему не хватает, но это работает так;

[[1]]
  mtry  Accuracy Kappa AccuracySD    KappaSD          Type
1    2 0.9533333  0.93 0.03800585 0.05700877 Random Forest
2    3 0.9533333  0.93 0.03800585 0.05700877 Random Forest
3    4 0.9533333  0.93 0.03800585 0.05700877 Random Forest

[[2]]
    cp  Accuracy Kappa AccuracySD    KappaSD             Type
1 0.00 0.9533333  0.93 0.02981424 0.04472136 Tree-Based Model
2 0.44 0.7733333  0.66 0.14605935 0.21908902 Tree-Based Model
3 0.50 0.3333333  0.00 0.00000000 0.00000000 Tree-Based Model
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...