我想研究模型调整的偏差/方差之间的最佳权衡。我正在使用插入符号R,它允许我根据模型的超参数(mtry,lambda等)绘制性能指标(AUC,准确度......)并自动选择最大值。这通常会返回一个好的模型,但如果我想进一步挖掘并选择不同的偏差/方差权衡,我需要学习曲线,而不是性能曲线。
为了简单起见,假设我的模型是一个随机森林,它只有一个超参数'mtry'
我想绘制训练和测试集的学习曲线。像这样:
(红色曲线是测试集)
在y轴上我设置了一个误差度量(错误分类的例子的数量或类似的东西);在x轴上'mtry'或者训练集大小。
问题:
是否已根据不同大小的训练集折叠迭代训练模型的功能?如果我必须手动编码,我该怎么做?
如果我想将超参数放在x轴上,我需要所有由caret :: train训练的模型,而不仅仅是最终模型(在CV之后获得最大性能的模型)。这些“废弃”型号在火车后仍然可用吗?
答案 0 :(得分:4)
如果你设置的话,Caret会为你迭代测试很多cv模型
trainControl()
函数和使用tuneGrid()
的参数(例如mtry)。
然后将这两个作为控制选项传递给train()
功能。 tuneGrid参数(例如mtry,ntree)的细节对于每个参数都是不同的
型号。
是的,最终的trainFit
模型将包含您的简历的所有折叠的错误率(不过您已指定)。
所以你可以指定例如一个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()
答案 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
要清楚,这回答了问题的第一部分,但没有回答第二部分。