【问题标题】:R caret : Regroup several train objectR caret :重新组合几个火车对象
【发布时间】:2018-04-26 17:51:21
【问题描述】:

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

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 做的事情,但要一起做。

【问题讨论】:

    标签: r merge r-caret


    【解决方案1】:

    我完全理解您的担忧,因为我的计算资源也非常有限。但是我会按如下方式处理它,而不是“构建”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,您可以在选择我们评估为最好的模型---model1 在这种情况下。

    【讨论】:

    • 您好,虽然您的解决方案很有趣,但它并没有回答我的问题。要点不是能够比较模型,而是能够以与 caret::plot.train 相同的方式绘制不同对象的指标(例如分类的准确性)。我已经能够通过将 object$results 对象“合并”到两个模型之一中来做到这一点,然后将其绘制出来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2018-02-09
    • 2015-04-13
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多