r - R caret :重新组合几个火车对象
问题描述
假设我正在使用插入符号包进行相同(种子固定)交叉验证,但仅使用不同的复杂度参数对同一模型进行多次运行,例如:
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 做但所有这些都在一起。
解决方案
我完全理解您的担忧,因为我的计算资源也非常有限。但是我会按如下方式处理它,而不是“构建”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
在这种情况下.
推荐阅读
- javascript - 如何通过使用Angular通过属性名称检查属性名称到对象数组来从对象分配值
- c# - Azure Functions C# 如何使用反射将自定义消息从一个类记录到天蓝色监控日志或分析监控日志
- c# - 以编程方式发送电子邮件需要很长时间才能加速?
- python - 在 matplotlib 中绘制组合 3 个变量和重新定位图例的难度
- apache-spark - 如何从数据框中选择聚合列
- python - 使用 Tornado 上传 Excel 文件
- c# - 如何在设计时在控件属性的下拉列表中列出表单上 typeX 组件的所有实例
- chronicle-queue - Chronicle Queue 中的第一个数据文件总是被触及
- vue.js - Nuxt keep-alive 不适用于路由器外部。NuxtJS
- java - 填充 ListView 列表