R插入:重新组合几个火车对象

时间:2018-04-26 17:51:21

标签: r merge r-caret

假设我正在使用相同的模型进行相同模型的seveal运行,但只使用不同的复杂度参数,使用插入符号包进行相同(种子固定)交叉验证,例如:

library(caret)
data(iris)

# controls are the same for every models
c = trainControl(method = "cv",number=10,verboseIter = TRUE) 
d = iris # data is also the same 
f = Species ~ . # formula is also the same 
m = "rpart" # method is also the same 


set.seed(1234)
model1 <- train(form = f, data = d, trControl = c, method = m,
                tuneGrid = expand.grid(cp = c(0,0.5)))
set.seed(1234)
model2 <- train(form = f, data = d, trControl = c, method = m,
                tuneGrid = expand.grid(cp = c(0.1,0.2)))

set.seed(1234)
model3 <- train(form = f, data = d, trControl = c, method = m,
                tuneGrid = expand.grid(cp = c(0,0.5,0.1,0.2)))

有没有办法只能从model1和model2“建立”model3训练对象? 计算很长,我没有在同一个插入符调用中运行所有不同的调整。但是,在同一列车对象中进行每次运行都会更容易进行比较(通过绘图功能,更新功能,重采样功能等等)。

我特别想找一种方法来做同样的事情plot.train做但是对他们所有人一起做。

1 个答案:

答案 0 :(得分:0)

我完全理解你的担忧,因为我的计算资源也非常有限。但是我会按如下方式处理它,而不是“构建”model3对象。

假设您希望实现的目标是最高精度。那么您只需要评估以下内容:model1model2中的哪一个我们看到了最高的准确度?然后我们只对选择最佳结果调整参数感兴趣。例如,我们看到以下内容:

> model1$bestTune$cp
[1] 0
> model2$bestTune$cp
[1] 0.2
> model1$results$Accuracy ## Respectively for cp = 0.0 and cp = 0.5
[1] 0.9333 0.3333
> model2$results$Accuracy ## Respectively for cp = 0.1 and cp = 0.2
[1] 0.9267 0.9267    

我们会选择cp = 0

假设您已将某些内容分解为model1model2model3,...并希望使用它们浏览所有手动输入的参数值。

k = 2 ## Here we only have model1 and model2 to compare
evaluate <- list()
for (i in 1:k) {
  model = eval(parse(text = paste0("model", i)))
  evaluate[["cp"]][[paste0("model", i)]] <- 
    model$finalModel$tuneValue$cp
  evaluate[["accuracy"]][[paste0("model", i)]] <- 
    model$results$Accuracy[[which(model$results$cp == model$bestTune$cp)]]
}    

然后在我们的evaluate列表中,我们有以下内容:

> evaluate
$cp
model1 model2 
   0.0    0.2 
$accuracy
model1 model2 
0.9333 0.9267 

在此之后,我们可以做到

> which(evaluate$accuracy == max(evaluate$accuracy))
model1 
     1 
> evaluate$cp[[which(evaluate$accuracy == max(evaluate$accuracy))]]
[1] 0

现在我们可以愉快地选择cp = 0,我们也知道最优cp的结果存储在model1中。

如果您仍希望“建立”model3,您可以在选择后简单地替换某些组件(例如results,其中包含AccuracySD,KappaSD和此类指标)在这种情况下,我们评估的最佳模型--- model1