假设我正在使用相同的模型进行相同模型的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做但是对他们所有人一起做。
答案 0 :(得分:0)
我完全理解你的担忧,因为我的计算资源也非常有限。但是我会按如下方式处理它,而不是“构建”model3
对象。
假设您希望实现的目标是最高精度。那么您只需要评估以下内容:model1
和model2
中的哪一个我们看到了最高的准确度?然后我们只对选择最佳结果调整参数感兴趣。例如,我们看到以下内容:
> 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
。
假设您已将某些内容分解为model1
,model2
,model3
,...并希望使用它们浏览所有手动输入的参数值。
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
。