k折交叉验证 - 如何自动获取预测?

3
这可能是一个愚蠢的问题,但我找不到一个能够实现这个功能的软件包......我知道我可以编写一些代码来得到我想要的结果,但有一个自动化的函数会很好!
基本上,我想为glm模型执行k折交叉验证。我希望自动获取每个验证集的预测值和实际值。因此,如果我要进行10倍交叉验证,我希望有一个函数将返回10个验证集的实际响应和预测值。 提前感谢!

1
你尝试过 caret 包吗? - Fernando
2个回答

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
如果你错过了想要查看每个折叠结果的话,只需在trainControl选项中添加savePred=T选项,然后它们将出现在你的模型对象的pred字段中。 - David
一个问题:我想拟合一个速率模型(带有偏移的泊松模型)。我使用glm函数得到的原始模型和使用您的代码(train函数然后fit$finalModel)得到的模型非常非常不同。有什么想法为什么会这样?我不确定"train"函数是否能处理所有类型的glm模型。 - zhifff
我假设你想要逻辑回归(因此我的例子),我编辑了我的帖子,展示了泊松链接的例子。 - David
是的,这正是我所做的...但是模型与使用glm拟合整个数据集时的模型非常不同。也许原因是由于偏移量。 - zhifff
我的模型类似于y~offset(log(x1))+x2+x3,使用泊松链接。因此,它实际上是一个速率模型,其响应为y/x1。 - zhifff
caret只是一个包装器,所以您可以使用glm的任何参数。当您查看帮助文档并看到train(x, ...)时,...表示您传递到train调用中的任何额外内容都将作为参数传递到您正在调用的方法函数中。这就是为什么我能够简单地在上面的train调用中添加family=poisson(link = "log")。长话短说,如果您愿意,并且如果在此之后仍然感到困惑,请在发布新问题之前将原始模型的确切参数添加到train调用中,因为它可能与caret的自动调整有关。 - David

2
我建议使用boot软件包中的cv.glm,因为您正在使用glm模型。另一个选择是cvTools软件包。不过,我发现编写自己的交叉验证(CV)函数更有用。听起来你想要一个CV函数只运行到一半,而我见过的大多数CV函数都会将所有验证集上的预测误差平均化,并返回平均值(当然,这就是交叉验证的定义)。

有没有想过如何使用cv.glm保存预测结果?自己编写代码有点麻烦,特别是我想进行一次留一交叉验证... - zhifff
我写了自己的代码。我有一个包含4000条记录的样本。进行一次留一操作需要很长时间...有人知道更有效率的方法吗..? - zhifff

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