我执行了一个带惩罚的逻辑回归,并使用 caret (glmnet) 训练了一个模型。
model_fit <- train(Data[,-1], Data[,1], method = "glmnet", family="binomial", metric = "ROC", maximize="TRUE", trControl = ctrl, preProc = c("center", "scale"), tuneGrid=expand.grid(.alpha=0.5,.lambda=lambdaSeq) )
根据 caret 的文档,函数 train
“[…] 计算基于重采样的性能度量” 并且 “在每个数据集中,计算保留样本的性能,并为每种组合总结均值和标准差。”
results
是一个数据框,包含“训练错误率和调优参数的值。”
model_fit$results$ROC
是否是一个向量(其大小等于我的调优参数 lambda
的大小),其中包含跨重采样的性能度量的均值?(而不是在对每个 lambda
值重新估计整个样本上的模型后,计算整个样本上的性能度量?)
回答:
model_fit$results$ROC
是否是一个向量(其大小等于我的调优参数lambda
的大小),其中包含跨重采样的性能度量的均值?
是的;确切地说,其长度将等于你的 tuneGrid
的行数,在这里恰好与你的 lambdaSeq
的长度一致(因为另一个参数 alpha
被保持不变)。
这里有一个快速示例,改编自 caret
文档(使用的是 gbm
和 Accuracy
度量,但原理是相同的):
library(caret)library(mlbench)data(Sonar)set.seed(998)inTraining <- createDataPartition(Sonar$Class, p = .75, list = FALSE)training <- Sonar[ inTraining,]testing <- Sonar[-inTraining,]fitControl <- trainControl(method = "cv", number = 5)set.seed(825)gbmGrid <- expand.grid(interaction.depth = 3, n.trees = (1:3)*50, shrinkage = 0.1, n.minobsinnode = 20)gbmFit1 <- train(Class ~ ., data = training, method = "gbm", trControl = fitControl, tuneGrid = gbmGrid, ## 这个最后的选项实际上是给 gbm() 的一个选项,它会传递过去 verbose = FALSE)
在这里,gbmGrid
有3行,即它仅包含三个(3)不同的 n.trees
值,而其他参数保持不变;因此,对应的 gbmFit1$results$Accuracy
将是一个长度为3的向量:
gbmGrid# interaction.depth n.trees shrinkage n.minobsinnode# 1 3 50 0.1 20# 2 3 100 0.1 20# 3 3 150 0.1 20gbmFit1$results# shrinkage interaction.depth n.minobsinnode n.trees Accuracy Kappa AccuracySD KappaSD# 1 0.1 3 20 50 0.7450672 0.4862194 0.05960941 0.1160537# 2 0.1 3 20 100 0.7829704 0.5623801 0.05364031 0.1085451# 3 0.1 3 20 150 0.7765188 0.5498957 0.05263735 0.1061387gbmFit1$results$Accuracy# [1] 0.7450672 0.7829704 0.7765188
返回的3个 Accuracy
值中的每一个都是我们在作为重采样技术的5折交叉验证的验证折中的度量结果;更具体地说,它是这5个折中计算的验证准确率的均值(你可以看到有一个 AccuracySD
列,也包含了它的标准差)。
而不是在对每个 lambda 值重新估计整个样本上的模型后,计算整个样本上的性能度量?
正确,不是那样的。