Err*_*404 12 partitioning r prediction glm cross-validation
我正在尝试对我之前在R中构建的一些glm模型进行10倍交叉验证.虽然我已经阅读了很多帮助文件,但我cv.glm()对boot包中的函数有点困惑.当我提供以下公式时:
library(boot)
cv.glm(data, glmfit, K=10)
Run Code Online (Sandbox Code Playgroud)
这里的"数据"参数是指整个数据集还是仅指测试集?
到目前为止我看到的例子提供了"数据"参数作为测试集,但这并没有真正有意义,例如为什么在同一测试集上有10倍?它们都会给出完全相同的结果(我假设!).
不幸的是,?cv.glm它以模糊的方式解释:
data:包含数据的矩阵或数据帧.行应为case,列对应变量,其中一个是响应
我的另一个问题是$delta[1]结果.这是10次试验的平均预测误差吗?如果我想获得每个折叠的错误怎么办?
这是我的脚本的样子:
##data partitioning
sub <- sample(nrow(data), floor(nrow(x) * 0.9))
training <- data[sub, ]
testing <- data[-sub, ]
##model building
model <- glm(formula = groupcol ~ var1 + var2 + var3,
family = "binomial", data = training)
##cross-validation
cv.glm(testing, model, K=10)
Run Code Online (Sandbox Code Playgroud)
Jak*_*rew 15
对于使用各种包装10倍交叉验证方法,我总是有点谨慎.我有自己的简单脚本来手动为任何机器学习包创建测试和训练分区:
#Randomly shuffle the data
yourData<-yourData[sample(nrow(yourData)),]
#Create 10 equally size folds
folds <- cut(seq(1,nrow(yourData)),breaks=10,labels=FALSE)
#Perform 10 fold cross validation
for(i in 1:10){
#Segement your data by fold using the which() function
testIndexes <- which(folds==i,arr.ind=TRUE)
testData <- yourData[testIndexes, ]
trainData <- yourData[-testIndexes, ]
#Use test and train data partitions however you desire...
}
Run Code Online (Sandbox Code Playgroud)
@Roman在他的评论中提供了一些答案,但是,通过检查代码来提供问题的答案cv.glm:
我相信这段代码会将数据随机分成K-folds,如果K不分割n,则根据需要排列舍入:
if ((K > n) || (K <= 1))
stop("'K' outside allowable range")
K.o <- K
K <- round(K)
kvals <- unique(round(n/(1L:floor(n/2))))
temp <- abs(kvals - K)
if (!any(temp == 0))
K <- kvals[temp == min(temp)][1L]
if (K != K.o)
warning(gettextf("'K' has been set to %f", K), domain = NA)
f <- ceiling(n/K)
s <- sample0(rep(1L:K, f), n)
Run Code Online (Sandbox Code Playgroud)
此位显示delta值不是均方根误差.正如帮助文件所说的那是The default is the average squared error function.什么意思?我们可以通过检查函数声明来看到这个:
function (data, glmfit, cost = function(y, yhat) mean((y - yhat)^2),
K = n)
Run Code Online (Sandbox Code Playgroud)
这表明在每个折叠中,我们计算误差平方的平均值,其中误差在预测响应与实际响应之间的通常意义上.
delta[1]只是每个折叠的所有这些术语的SUM 的加权平均值,请参阅以下代码中的内联注释cv.glm:
for (i in seq_len(ms)) {
j.out <- seq_len(n)[(s == i)]
j.in <- seq_len(n)[(s != i)]
Call$data <- data[j.in, , drop = FALSE]
d.glm <- eval.parent(Call)
p.alpha <- n.s[i]/n #create weighted average for later
cost.i <- cost(glm.y[j.out], predict(d.glm, data[j.out,
, drop = FALSE], type = "response"))
CV <- CV + p.alpha * cost.i # add weighted average error to running total
cost.0 <- cost.0 - p.alpha * cost(glm.y, predict(d.glm,
data, type = "response"))
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20915 次 |
| 最近记录: |