R:使用cv.glm计算弹性网预测误差

时间:2017-01-11 05:26:59

标签: r machine-learning

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.glmglmnet对象的预测误差。

1 个答案:

答案 0 :(得分:0)

我认为你正在混淆glmglmnet(弹性网,套索和脊线惩罚)。 cv.glm需要glm模型,而不是glmnet模型。

请尝试以下任一方法:

  1. 使用glmnetcv.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')
    

    enter image description here

  2. <强> [EDITED]

    训练数据集的预测错误:

    mean((y-predict(m, newx=x))^2)
    # [1] 0.1037433
    
    1. 安装glm模型并使用cv.glm计算交叉验证错误增量(不进行正则化)。根据{{​​1}}:
    2. 的文档
        

      delta:长度为2的向量。第一个组件是原始组件   预测误差的交叉验证估计。第二个组成部分是   调整后的交叉验证估算。调整旨在   弥补不使用留一法引入的偏见   交叉验证。

      cv.glm