k-fold交叉验证 - 如何自动获得预测?

时间:2013-08-28 19:30:08

标签: r cross-validation

这可能是一个愚蠢的问题,但我找不到一个包来做...我知道我可以写一些代码来得到我想要的东西但是有一个功能自动完成它会很好!

所以基本上我想对glm模型进行k折交叉验证。我想自动获得每个验证集的预测和实际值。因此,如果我正在做10倍的CV,我想要一个函数来返回10个验证集,其中包含实际的响应和预测。

提前谢谢!

2 个答案:

答案 0 :(得分:14)

正如评论中所述,caret使交叉验证变得非常简单。只需使用“glm”方法,如下所示:

> library(caret)
> set.seed(2)
> dat <- data.frame(label=round(runif(100,0,5)),v1=rnorm(100),v2=rnorm(100))
> tc <- trainControl("cv",10,savePred=T)
> (fit <- train(label~.,data=dat,method="glm",trControl=tc,family=poisson(link = "log")))
100 samples
  2 predictors

No pre-processing
Resampling: Cross-Validation (10 fold) 

Summary of sample sizes: 90, 91, 91, 90, 90, 89, ... 

Resampling results

  RMSE  Rsquared  RMSE SD  Rsquared SD
  1.53  0.146     0.131    0.235      


> fit$finalModel$family

Family: poisson 
Link function: log 

> head(fit$pred)
      pred obs rowIndex .parameter Resample
1 2.684367   1        1       none   Fold01
2 2.165246   1       18       none   Fold01
3 2.716165   3       35       none   Fold01
4 2.514789   3       36       none   Fold01
5 2.249137   5       47       none   Fold01
6 2.328514   2       48       none   Fold01

答案 1 :(得分:2)

我建议您从包cv.glm调查boot,因为您正在使用glm模型。另一种选择是包cvTools。不过,我发现为CV编写自己的函数更有用。听起来你想要一个中途结束的CV函数,我见过的大多数CV函数会平均所有验证集的预测误差,只返回平均值(当然,这是交叉验证的定义)。 / p>