R glm - 如何进行多次交叉验证

tuc*_*son 2 r cross-validation

我有训练数据,我随机分成两部分:

  • 70% - > train_train
  • 30% - > train_cv(用于交叉验证)

我使用train_train拟合glm(glmnet)模型,然后使用train_cv进行交叉验证.

我的问题是train_train和train_cv的不同随机分割返回不同的交叉验证结果(使用曲线下面积,"AUC"评估):

AUC = 0.6381583第一次

AUC = 0.6164524第二次

有没有办法运行多个交叉验证,而不重复代码?

Jam*_*ing 8

这里有一些令人困惑的事情.我认为你所描述的更多是标准的训练/测试分裂,交叉验证这个词的使用方式通常不同.所以你已经拿出30%的数据用于测试,这很好,你可以用它来了解你的列车对AUC的估计是多么乐观.但是当然估计取决于你如何进行训练/测试分裂,并且知道这个测试性能变化多少会很好.您可以使用多次交叉验证来实现此目的.

交叉验证仅仅是使用保留集 - 例如,五次交叉验证涉及以下步骤:

  1. 随机将完整数据集拆分为五个大小相等的部分.
  2. 对于i = 1到5,将模型拟合到除第i部分之外的所有数据.
  3. 评估从拟合中伸出的部分的AUC.
  4. 平均五个AUC结果.

该过程可以重复多次以估计样本外估计的均值和方差.

R包cvTools允许您这样做.例如

library(ROCR)
library(cvTools)

calc_AUC <- function(pred, act) {
  u<-prediction(pred, act)
  return(performance(u, "auc")@y.values[[1]])
}

cvFit(m, data = train, y = train$response, 
    cost = calc_AUC, predictArgs = "response")
Run Code Online (Sandbox Code Playgroud)

将使用AUC作为性能指标,执行模型m的5倍交叉验证.cvFit还需要参数K(交叉验证折叠的R数量)和(使用不同随机分割执行交叉验证的次数).

有关交叉验证的更多信息,请参阅http://en.wikipedia.org/wiki/Cross-validation_(statistics).