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,
关于this问题,我试图使用cv.glm
获取我的弹性网模型的K折交叉验证预测误差,但是,我不能似乎是由于错误而这样做。我不太确定cv.glm
函数是否可用于计算类cv.glm
或glmnet
对象的预测误差。
答案 0 :(得分:0)
我认为你正在混淆glm
和glmnet
(弹性网,套索和脊线惩罚)。 cv.glm
需要glm
模型,而不是glmnet
模型。
请尝试以下任一方法:
使用glmnet
与cv.glmnet
计算k-fold交叉验证错误,如下所示:
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
计算交叉验证错误增量(不进行正则化)。根据{{1}}:delta:长度为2的向量。第一个组件是原始组件 预测误差的交叉验证估计。第二个组成部分是 调整后的交叉验证估算。调整旨在 弥补不使用留一法引入的偏见 交叉验证。
cv.glm