代码之家  ›  专栏  ›  技术社区  ›  Katherina

cv。glmnet和略去一个CV

  •  3
  • Katherina  · 技术社区  · 7 年前

    我正在尝试使用该函数 cv.glmnet 寻找最佳lambda(使用岭回归)以预测某些对象的归属类别。 所以我使用的代码是:

    CVGLM<-cv.glmnet(x,y,nfolds=34,type.measure = "class",alpha=0,grouped = FALSE)
    

    事实上,我没有使用K-fold交叉验证,因为我的大小数据集太小,实际上我只有34行。所以,我在 nfolds 我的行数,用于计算一个遗漏CV。

    现在,我有一些问题:

    1) 首先:有 cv。glmnet公司 功能调整Hyperpameter lambda或同时测试“最终型号”?

    2) 有一次我得到了最好的lambda,我该怎么办?我必须使用 predict 作用 如果是,如果我使用所有数据查找lambda,我必须使用哪些数据,因为我使用了LOO CV?

    3) 如何计算R^2 cv。glmnet公司 作用

    1 回复  |  直到 7 年前
        1
  •  4
  •   missuse    7 年前

    以下是回答您的问题的尝试:

    1) cv.glmnet 通过使用规范的交叉验证来测试每个lambda的性能。以下是一个示例:

    library(glmnet)
    data(iris)
    

    找到虹膜预测的最佳lambda:

    CVGLM <- cv.glmnet(as.matrix(iris[,-5]),
                       iris[,5],
                       nfolds = nrow(iris),
                       type.measure = "class",
                       alpha = 0,
                       grouped = FALSE,
                       family = "multinomial")
    

    最佳lambda的未命中分类错误为

    CVGLM$cvm
    #output
    0.06
    

    如果您使用LOOCV和best lambda单独进行测试:

    z <- lapply(1:nrow(iris), function(x){
      fit <- glmnet(as.matrix(iris[-x,-5]),
                    iris[-x,5],
                    alpha = 0,
                    lambda = CVGLM$lambda.min,
                    family="multinomial")
    
       pred <- predict(fit, as.matrix(iris[x,-5]), type = "class")
    
      return(data.frame(pred, true = iris[x,5]))
    })
    
    z <- do.call(rbind, z)
    

    并检查错误率:

    sum(z$pred != z$true)/150
    #output
    0.06
    

    因此,似乎没有必要使用与cv中相同的方法来测试性能。glmnet,因为它将是相同的。

    2) 当您拥有最佳lambda时,您应该使用 glmnet 作用您在使用该模型后要做什么完全取决于您。大多数人训练模型来预测某事。

    3) 分类问题的R^2是什么?如果你能解释这一点,那么你就可以计算它。

    R^2=解释变化/总变化

    就课程而言,这是什么?

    无论如何,R^2不用于分类,而是用于AUC、偏差、精度、平衡精度、kappa、joudens J等-其中大多数用于二元分类,但有些可用于多项式分类。

    我建议 this 作为进一步阅读