我想研究模型调优中偏差/方差的最佳权衡。我使用R中的caret包,它允许我绘制性能指标(如AUC、准确率等)与模型超参数(如mtry、lambda等)的关系图,并自动选择最大值。这通常会返回一个不错的模型,但如果我想进一步挖掘并选择不同的偏差/方差权衡,我需要学习曲线,而不是性能曲线。
为了简单起见,假设我的模型是随机森林,只有一个超参数’mtry’。
我想绘制训练集和测试集的学习曲线。类似于这样:
(红色曲线是测试集)
在y轴上放置一个错误指标(如分类错误的样本数量等);在x轴上放置’mtry’或替代地放置训练集大小。
问题:
-
caret是否有基于不同大小的训练集折叠迭代训练模型的功能?如果我需要手动编写代码,该怎么做?
-
如果我想在x轴上放置超参数,我需要caret::train训练的所有模型,而不仅仅是最终模型(经过交叉验证后获得最大性能的模型)。这些“被丢弃”的模型在训练后是否仍然可用?
回答:
在某个时候,可能是在这个问题被提出之后,caret包添加了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上计算,并与Data变量(”Resampling”、”Training”和可选的”Testing”)一起保存在lda_data中。
这是函数文档的链接:https://rdrr.io/cran/caret/man/learning_curve_dat.html
需要明确的是,这回答了问题的第一部分,但没有回答第二部分。
注意 在至少2020年8月之前,caret包的代码和文档中有一个拼写错误。函数调用之前是learing_curve_dat
,后来更正为learning_curve_dat
。我已经更新了我的回答以反映这一变化。请确保您使用的是caret包的较新版本。