cv.glmnet 和留一简历

cv.glmnet and Leave-one out CV

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

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

实际上我没有使用 K 折交叉验证,因为我的数据集太小了,实际上我只有 34 行。因此,我在 nfolds 中使用我的行数来计算留一法式 CV。

现在,我有一些问题:

1) 首先:cv.glmnet 函数是调整 Hyperpameter lambda 还是测试 "final model"?

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

3)如何从cv.glmnet函数计算出R^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")

best lambda 的 miss classification error 在

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 作为进一步阅读