在循环中提供多种方法并保存输出
Supplying several methods in a loop and saving the output
编辑:实际查看该方法表明它只使用一种方法,我如何编写一个循环到 select 给定方法向量的方法?!
我查看了几个问题(Loop in R: how to save the outputs?),但似乎无法弄清楚如何保存这些模型的输出。这是我的 "function":
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
}
"function"的实现:
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)
这有效,但 returns 仅适用于最后一个模型,而不是最好的显示。
我怎样才能优化这个过程?
根据@Dave2e 的评论:以下是我如何设法 "solve" 它:
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
这里是关键部分的简答。
使用 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
包并行进行 运行。
编辑:实际查看该方法表明它只使用一种方法,我如何编写一个循环到 select 给定方法向量的方法?!
我查看了几个问题(Loop in R: how to save the outputs?),但似乎无法弄清楚如何保存这些模型的输出。这是我的 "function":
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
}
"function"的实现:
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)
这有效,但 returns 仅适用于最后一个模型,而不是最好的显示。 我怎样才能优化这个过程?
根据@Dave2e 的评论:以下是我如何设法 "solve" 它:
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
这里是关键部分的简答。
使用 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
包并行进行 运行。