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