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

时间:2014-05-14 14:35:01

标签: 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

有没有办法在不重复代码的情况下运行多个交叉验证?

1 个答案:

答案 0 :(得分:8)

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

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

  1. 将完整数据集随机拆分为五个大小相等的部分。
  2. 对于i = 1到5,将模型拟合到除第i部分之外的所有数据上。
  3. 评估从合体中伸出的部分的AUC。
  4. 平均五个AUC结果。
  5. 此过程可重复多次,以估计样本外估计的均值和方差。

    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")
    

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

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