我正在尝试使用函数 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) 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作为进一步阅读
关于r - cv.glmnet 和 Leave-one out CV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48709211/