cv.glmnet和留一法交叉验证

3

我正在尝试使用cv.glmnet函数(使用RIDGE回归)找到最佳λ值,以预测某些对象所属的类别。

因此,我使用的代码是:

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

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

现在,我有一些问题:

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

2)一旦得到最佳lambda,我该怎么做?我需要使用predict函数吗?如果是的话,由于我使用了留一交叉验证,如果我使用所有数据来找到lambda,那么我应该使用哪些数据呢?

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

1个回答

4

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

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等。其中大多数用于二元分类,但有些也适用于多项式分类。

我建议这篇文章作为进一步阅读。


1
首先感谢您的回答。当我谈论R ^ 2时,我指的是模型准确性的系数,这是一个参数,可以“说”找到的模型是否好。 - Katherina
1
@Katherina 很高兴我能帮到你。模型的准确性包含在 CVGLM$cvm 中,它代表了总误差,因此准确性为 1 - CVGLM$cvm - missuse
1
啊,好的。我明白了!再次感谢! - Katherina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接