cv.glmnet和Leave-one out CV

时间:2018-02-09 15:35:38

标签: r lambda glmnet

我正在尝试使用函数cv.glmnet来找到最好的lambda(使用RIDGE回归),以便预测某些对象的归属类。 所以我使用的代码是:

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

实际上我没有使用K折交叉验证,因为我的尺寸数据集太小,实际上我只有34行。所以,我在nfolds中使用了我的行数来计算一个离开的CV。

现在,我有一些问题:

1)首先:cv.glmnet函数是否调整Hyperpameter lambda还是测试“最终模型”?

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

3)如何从cv.glmnet函数计算R ^ 2?

1 个答案:

答案 0 :(得分:2)

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

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和最佳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进一步阅读