假设我有数据集:
mydata=data.frame(
status = as.factor(c(0,0,0,0,0,1,1,1,1,1)),
a = c(1,3,4,5,6,1,2,3,4,5),
b = c(4,2,3,6,2,1,3,4,5,6)
)
我构建了一个glm模型,对其中一半的观察结果进行训练,并使用该模型预测另一半观察结果的响应。
train=sample(1:nrow(mydata), nrow(mydata)/2)
test=mydata[-train,]
test.response=status[-train]
fit=glm(status~., data=mydata, family="binomial", subset=train)
probs=predict(fit, test, type="response")
pred=rep(0,5)
pred[probs>0.5]=1
table(pred, test.response)
这告诉我有多少真正的肯定和真实的否定(我分别有2和2)。
test.response
pred 0 1
0 2 0
1 1 2
不是手动编码火车和测试数据集,而是转向cv.glm
,以便R可以为我交叉验证。
library(boot)
fit2=glm(status~., data=mydata, family="binomial")
cv.fit=cv.glm(mydata, fit2, K=2)
我的问题是,如何使用交叉验证模型来预测我的响应变量?我之前使用的是probs=predict(fit, test, type="response")
,但在这种情况下,我不知道test
是什么。
答案 0 :(得分:3)
我相信这就是你想要的:
require(boot)
require(glmnet)
status <- c(0,0,0,0,0,1,1,1,1,1)
ymat <- as.matrix(status)
xdata <- data.frame(a,b)
xmat <- as.matrix(xdata)
fit.cv <- cv.glmnet(y = ymat, x = xmat, family="binomial")
lmin <- fit.cv$lambda.min
l1se <- fit.cv$lambda.1se
net <- glmnet(y = ymat, x = xmat, family="binomial")
predict(net, s=lmin, type = "nonzero")
colnames(status)[predict(net, s=lmin,type="nonzero")$X1]
plot(cv.glmnet(y = ymat,x = xmat, family= "binomial", type = "class"))
plot(cv.glmnet(y = ymat,x = xmat, family= "binomial", type = "mae"))
plot(cv.glmnet(y = ymat,x = xmat, family= "binomial", type = "deviance"))
plot(cv.glmnet(y = ymat,x = xmat, family= "binomial", type = "mse"))
plot(cv.glmnet(y = ymat,x = xmat, family= "binomial", type = "auc")) #needs more data
数据集非常小,所以我建议在更大的数据集上尝试这个以避免警告/错误。