使用caret包应用k折交叉验证模型

11

首先,我要说我已经阅读了许多关于交叉验证的文章,似乎存在很多困惑。我理解的是:

  1. 进行k折交叉验证,例如10个fold,以了解在这10个fold中的平均误差。
  2. 如果可接受,则在完整数据集上训练模型。

我正尝试使用R中的rpart构建决策树,并利用caret包。以下是我使用的代码。

# load libraries
library(caret)
library(rpart)

# define training control
train_control<- trainControl(method="cv", number=10)

# train the model 
model<- train(resp~., data=mydat, trControl=train_control, method="rpart")

# make predictions
predictions<- predict(model,mydat)

# append predictions
mydat<- cbind(mydat,predictions)

# summarize results
confusionMatrix<- confusionMatrix(mydat$predictions,mydat$resp)

关于 caret train 应用,我有一个问题。我已经阅读了 A Short Introduction to the caret Package 中的 train 部分,其中指出在重采样过程中确定了“最优参数集”。

在我的示例中,我是否已正确编写代码?我是否需要在我的代码中定义 rpart 参数,还是我的代码已足够?

3个回答

22

当您执行k折交叉验证时,您已经为每个样本做出了一个预测,只是使用10个不同的模型(假设k = 10)。

没有必要对完整数据进行预测,因为您已经从k个不同的模型中获得了它们的预测结果。

您可以采取以下措施:

train_control<- trainControl(method="cv", number=10, savePredictions = TRUE)

然后

model<- train(resp~., data=mydat, trControl=train_control, method="rpart")

如果你想以漂亮的格式查看观测值和预测结果,只需输入:

model$pred

关于你提出的第二个问题,caret 应该会处理所有的参数设置。如果您想要手动调整参数,也是可以的。


2
如果您有10个不同的模型,每个模型都有一个折叠,那么您如何从它们中获取最终的整体模型?平均所有模型吗? - skan

6
重要的一点是不要混淆模型选择和模型误差估计。
您可以使用交叉验证来估计模型超参数(例如正则化参数)。
通常使用10折交叉验证,因为它对于偏差-方差权衡是一个很好的选择(2折会导致高偏差的模型,留一法交叉验证可能会导致高方差/过拟合的模型)。
之后,如果您没有独立的测试集,您可以使用交叉验证估计某些性能指标的经验分布:一旦找到了最佳的超参数,您可以使用它们来估计cv误差。
请注意,在此步骤中,超参数是固定的,但也许跨交叉验证模型的模型参数是不同的。

3
在caret软件包的简短介绍文档的第一页中,提到了通过参数选择最佳模型。 首先,必须理解交叉验证是一种选择最佳建模方法而不是模型本身的过程。CV - 最终模型选择。Caret提供了使用tuneGrid的网格搜索选项,其中可以提供要测试的参数值列表。在训练完成后,最终模型将具有优化的参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接