我正在尝试使用函数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?
答案 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进一步阅读