【问题标题】:Supplying several methods in a loop and saving the output在循环中提供几种方法并保存输出
【发布时间】:2019-01-17 18:07:02
【问题描述】:

编辑:实际上查看该方法表明它只使用一种方法,我如何编写一个循环来选择一个给定方法向量的方法?!

我查看了几个问题 (Loop in R: how to save the outputs?),但似乎无法弄清楚如何保存这些模型的输出。这是我的“功能”:

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)

这可行,但只返回最后一个模型,而不是最好的显示。 如何优化此流程?

【问题讨论】:

  • 试试lapply(methods1, function(met) {modeler(iris,yname="Species",xname=".",method = met,control=Control, metric = metric)}),结果现在会在一个列表中。
  • 完美!如果您不介意,您可以将其发布为答案吗?
  • 哦,是的!你仍然可以发帖,我会接受的。

标签: r r-caret


【解决方案1】:

以下是关键部分的简要答案。
使用 methods1 作为方法向量,可以使用 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 包并行运行。

【讨论】:

    【解决方案2】:

    基于@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
    

    【讨论】:

      猜你喜欢
      • 2019-03-30
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2020-05-30
      • 2019-10-24
      • 2018-05-24
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多