![](/img/trans.png)
[英]Unexpected behavior in R using lapply() with glm() and cv.glm()
[英]R: Elastic net prediction error calculation using cv.glm
library(glmnet)
library(boot)
data(iris)
x <- model.matrix(Sepal.Length~., iris)[,-1]
y <- iris$Sepal.Length
m <- cv.glmnet(x, y)
> cv.glm(x, m, K = 10)
Error in UseMethod("predict") :
no applicable method for 'predict' applied to an object of class "c('matrix', 'double', 'numeric')"
要么
bestLambda = m$lambda.min
m2 <- glmnet(x, y, family = "gaussian", lambda = bestLambda)
>cv.glm(x, m2, K = 10)
Error in glmnet(x = x, y = y, family = "gaussian", lambda = bestLambda, :
unused argument (data = c(3.5, 3, 3.2, 3.1, 3.6,
在参考这个问题时,我试图使用cv.glm
获得我的弹性网模型的K-fold交叉验证预测误差,但是,由于该错误,我似乎无法这样做。 我不太确定cv.glm
函数是否可用于计算类cv.glm
或glmnet
对象的预测误差。
我认为你正在将glm
与glmnet
混合(弹性网,套索和脊线惩罚)。 cv.glm
需要glm
模型,而不是glmnet
模型。
请尝试以下任一操作:
使用glmnet
来计算,其中k折交叉验证错误cv.glmnet
类似如下:
library(glmnet) library(boot) data(iris) x <- model.matrix(Sepal.Length~., iris)[,-1] y <- iris$Sepal.Length m <- cv.glmnet(x, y, nfolds=10) m$lambda.min #[1] 0.0003839539 m$lambda.1se #[1] 0.009078549 plot(m$lambda, m$cvm,type='l', xlab=expression(lambda), ylab='CV errors', main=expression(paste('CV error for different ', lambda))) lines(m$lambda, m$cvup, col='red') lines(m$lambda, m$cvlo, col='red')
[EDITED]
训练数据集上的预测误差:
mean((y-predict(m, newx=x))^2)
# [1] 0.1037433
glm
模型并使用cv.glm
计算交叉验证错误delta(无正则化)。 根据cv.glm
的文档: delta:长度为2的向量。 第一个组成部分是预测误差的原始交叉验证估计。 第二个组成部分是经过调整的交叉验证估算。 调整旨在弥补不使用留一交叉验证所引入的偏差。
df <- cbind.data.frame(x, y)
m <- glm(y~., df, family='gaussian')
cv.glm(df, m, K = 10)$delta
# [1] 0.09992177 0.09940190
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.