我如何使用插入符来训练模型并在验证集上给出分类指标?

How can I use caret to train models and give the classification metrics over a validation set?

我这里有训练集、验证集和测试集。我想知道如何使用不同参数(由插入符号上的网格定义)训练模型,但使用在验证集上计算的分类指标?

如果我有以下语法...

TARGET <- iris$Species
trainX <- iris[,-5]

ctrl <- trainControl(method = "cv")

svm.tune <- train(x=trainX,
              y= TARGET,
              method = "svmRadial",   
              tuneLength = 9,                    
              preProc = c("center","scale"),
              metric="ROC",
              trControl=ctrl)

svm.tune

是否有直接形式获取验证集上的指标作为svm.tune的打印?或者我应该用 'predict' 手工认为合适吗?

由于我是插入符号语法的新手,我知道如何获取交叉验证的指标,但我想将计算重定向到此验证集。我应该使用哪些参数?

编辑:有没有办法使用验证集而不是交叉验证来显示网格每组参数的分类指标?

您可以通过为 trainControl 指定 indexindexOut 参数来做到这一点。我将使用来自 ggplot2 包的 diamonds 数据的示例来突出显示。

library(caret)
data(diamonds, package = "ggplot2")
# create a mock training and validation set
training = diamonds[1:10000,]
validation = diamonds[10001:11000,]

然后使用 createFolds 函数为每个模型拟合创建一些交叉验证折叠。默认 returnTrain = FALSE 通常会 return 保留而不是保留,因此它的规范为 TRUE。

trainIndex = createFolds(training$price, returnTrain = TRUE)

现在我们将创建一个包含训练集和验证集的数据框,并创建一个长度与训练折叠数相等的保持指数列表。请注意,这些指标仅对应于作为验证集的我的数据行。

dat = rbind(training,validation)
valIndex = lapply(trainIndex,function(i) 10001:11000)

然后在 trainControl 对象的规范中,我们将这两个指标列表传递给参数 indexindexOut,分别用于拟合和测试的指标并训练我们的模型。 ("lm"这里是为了速度)

trControl = trainControl(method = "cv",
                         index = trainIndex,
                         indexOut = valIndex)
train(price~., method = "lm", data = dat, trControl = trControl)
## Linear Regression 
##
## 11000 samples
##     9 predictors
##
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
##
## Summary of sample sizes: 8999, 8999, 9000, 9000, 8999, 9000, ... 
##
## Resampling results
##
##   RMSE      Rsquared   RMSE SD  Rsquared SD 
##   508.0062  0.9539221  2.54004  0.0002948073

你可以说服自己你确实在做你的目标,要么保留所有重采样信息并通过手动拟合测试其中一个(你知道用于拟合的指标,所以可以这样做)。或者也许只是看到如果我们只使用训练数据我们会得到不同的重采样结果。 (由于折叠最初是固定的,所以如果它不使用验证集,我们会期望相同,摆脱重新运行时的随机性 train

train(price~., method = "lm", data = training,trControl = trainControl(
  method = "cv", index = trainIndex
))
## Resampling results
##
##   RMSE      Rsquared   RMSE SD   Rsquared SD
##   337.6474  0.9074643  9.916053  0.008115761

希望对您有所帮助。

编辑:

OK 刚刚注意到 OP 询问了分类示例,但是答案对两者都适用。