用插入符号和R绘制学习曲线

时间:2013-12-04 08:52:11

标签: r plot machine-learning supervised-learning

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

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

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

learning curve

(红色曲线是测试集)

在y轴上我设置了一个误差度量(错误分类的例子的数量或类似的东西);在x轴上'mtry'或者训练集大小。

问题:

  1. 是否已根据不同大小的训练集折叠迭代训练模型的功能?如果我必须手动编码,我该怎么做?

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

3 个答案:

答案 0 :(得分:4)

  1. 如果你设置的话,Caret会为你迭代测试很多cv模型 trainControl()函数和使用tuneGrid()的参数(例如mtry)。 然后将这两个作为控制选项传递给train() 功能。 tuneGrid参数(例如mtry,ntree)的细节对于每个参数都是不同的 型号。

  2. 是的,最终的trainFit模型将包含您的简历的所有折叠的错误率(不过您已指定)。

  3. 所以你可以指定例如一个10倍的CV乘以具有10个mtry值的网格 - 这将是100次迭代。你可能想去喝杯茶或者吃午饭。

    如果这听起来很复杂...... there is a very good example here - 插入符号是最好的文档包之一。

答案 1 :(得分:3)

我的代码是关于如何使用R包训练模型时在Caret中绘制学习曲线的问题。我在R中使用Motor Trend Car Road Tests用于说明目的。首先,我将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()

输出图如下所示:
MtCarsLearningCurve.png

答案 2 :(得分:0)

有时,在问完这个问题之后,插入符号包添加了learning_curve_dat函数,该函数可帮助评估一系列训练集大小的模型性能。

这是功能文档中的示例:

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

set.seed(29510)
# NOTE learing_curve_dat below is not a typo
lda_data <- learing_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的性能指标,并将其与Data变量(“重新采样”,“培训”以及可选的“测试”)一起保存在lda_data中。

以下是功能文档的链接:https://rdrr.io/cran/caret/man/learing_curve_dat.html

要清楚,这回答了问题的第一部分,但没有回答第二部分。