8

我想研究模型调整的偏差/方差之间的最佳权衡。我在 R 中使用插入符号,它允许我根据模型的超参数(mtry、lambda 等)绘制性能指标(AUC、准确度...)并自动选择最大值。这通常会返回一个好的模型,但如果我想进一步挖掘并选择不同的偏差/方差权衡,我需要一个学习曲线,而不是性能曲线。

为了简单起见,假设我的模型是一个随机森林,它只有一个超参数“mtry”

我想绘制训练集和测试集的学习曲线。像这样的东西:

学习曲线

(红色曲线是测试集)

在 y 轴上,我放置了一个错误度量(错误分类示例的数量或类似的东西);在 x 轴“mtry”或训练集大小上。

问题:

  1. 插入符号是否具有基于不同大小的训练集折叠迭代训练模型的功能?如果我必须手动编码,我该怎么做?

  2. 如果我想将超参数放在 x 轴上,我需要使用 caret::train 训练的所有模型,而不仅仅是最终模型(在 CV 之后获得最大性能的模型)。这些“废弃”的模型在训练后是否仍然可用?

4

3 回答 3

4
  1. 如果您 trainControl()使用tuneGrid(). 然后将这两个作为控制选项传递给train() 函数。tuneGrid 参数的细节(例如 mtry、ntree)对于每种模型类型都会有所不同。

  2. 是的,最终trainFit模型将包含 CV 所有折叠的错误率(无论您如何指定)。

因此,您可以指定例如 10 倍 CV 乘以具有 10 个 mtry 值的网格 - 这将是 100 次迭代。你可能想去喝杯茶或午餐。

如果这听起来很复杂……这里有一个很好的例子——插入符号是最好的文档包之一。

于 2013-12-04T09:51:14.383 回答
4

这是我的代码,关于我在R使用Caret包训练模型时如何处理绘制学习曲线的问题。我将Motor Trend Car Road Testsin R 用于说明目的。首先,我将数据集随机化并拆分mtcars为训练集和测试集。21 条训练记录和 13 条测试集记录。响应功能mpg在此示例中。

# set seed for reproducibility
set.seed(7)

# randomize mtcars
mtcars <- mtcars[sample(nrow(mtcars)),]

# split iris data into training and test sets
mtcarsIndex <- createDataPartition(mtcars$mpg, p = .625, list = F)
mtcarsTrain <- mtcars[mtcarsIndex,]
mtcarsTest <- mtcars[-mtcarsIndex,]

# create empty data frame 
learnCurve <- data.frame(m = integer(21),
                     trainRMSE = integer(21),
                     cvRMSE = integer(21))

# test data response feature
testY <- mtcarsTest$mpg

# Run algorithms using 10-fold cross validation with 3 repeats
trainControl <- trainControl(method="repeatedcv", number=10, repeats=3)
metric <- "RMSE"

# loop over training examples
for (i in 3:21) {
    learnCurve$m[i] <- i
    
    # train learning algorithm with size i
    fit.lm <- train(mpg~., data=mtcarsTrain[1:i,], method="lm", metric=metric,
             preProc=c("center", "scale"), trControl=trainControl)        
    learnCurve$trainRMSE[i] <- fit.lm$results$RMSE
    
    # use trained parameters to predict on test data
    prediction <- predict(fit.lm, newdata = mtcarsTest[,-1])
    rmse <- postResample(prediction, testY)
    learnCurve$cvRMSE[i] <- rmse[1]
}

pdf("LinearRegressionLearningCurve.pdf", width = 7, height = 7, pointsize=12)

# plot learning curves of training set size vs. error measure
# for training set and test set
plot(log(learnCurve$trainRMSE),type = "o",col = "red", xlab = "Training set size",
          ylab = "Error (RMSE)", main = "Linear Model Learning Curve")
lines(log(learnCurve$cvRMSE), type = "o", col = "blue")
legend('topright', c("Train error", "Test error"), lty = c(1,1), lwd = c(2.5, 2.5),
       col = c("red", "blue"))

dev.off()

输出图如下所示:
在此处输入图像描述

于 2016-11-30T09:52:14.420 回答
2

在某个时候,可能在提出这个问题之后,插入符号包添加了learning_curve_dat有助于评估模型在一系列训练集大小上的性能的功能。

以下是函数文档中的示例:

library(caret)
set.seed(1412)
class_dat <- twoClassSim(1000)

set.seed(29510)
lda_data <- learning_curve_dat(dat = class_dat, 
                               outcome = "Class",
                               test_prop = 1/4, 
                               ## `train` arguments:
                               method = "lda", 
                               metric = "ROC",
                               trControl = trainControl(classProbs = TRUE, 
                                                        summaryFunction = twoClassSummary))

ggplot(lda_data, aes(x = Training_Size, y = ROC, color = Data)) + 
  geom_smooth(method = loess, span = .8)

为每个 Training_Size 找到性能指标,并与数据变量(“重采样”、“训练”和可选的“测试”)一起保存在 lda_data 中。

这是函数文档的链接:https ://rdrr.io/cran/caret/man/learning_curve_dat.html

需要明确的是,这回答了问题的第一部分,而不是第二部分。

注意至少在 2020 年 8 月之前,插入符号包代码和文档中存在拼写错误。函数调用learing_curve_dat在被更正为learning_curve_dat. 我已经更新了我的答案以反映这一变化。确保您使用的是最新版本的 caret 包。

于 2018-11-20T11:05:38.163 回答