R 循环cv.glmnet并获取';最佳';系数

R 循环cv.glmnet并获取';最佳';系数,r,cross-validation,glmnet,coefficients,R,Cross Validation,Glmnet,Coefficients,如cv.glmnet的帮助中所述,“cv.glmnet的结果是随机的,因为折叠是随机选择的。用户可以通过多次运行cv.glmnet并平均误差曲线来减少这种随机性。” 如果我循环n次cv.glmnet,如何提取“最佳”系数?我通常使用以下命令获取系数: coe<- coef(cvfit, s = "lambda.min") coe当您执行coef(cvfit,s=“lambda.min”)时,您将从最佳lambda中获取1个标准误差的lambda,请参见,以便您可以在不同的cv运行中平均M

如cv.glmnet的帮助中所述,“cv.glmnet的结果是随机的,因为折叠是随机选择的。用户可以通过多次运行cv.glmnet并平均误差曲线来减少这种随机性。”

如果我循环n次cv.glmnet,如何提取“最佳”系数?我通常使用以下命令获取系数:

coe<- coef(cvfit, s = "lambda.min")
coe当您执行
coef(cvfit,s=“lambda.min”)
时,您将从最佳lambda中获取1个标准误差的lambda,请参见,以便您可以在不同的cv运行中平均MSE

library(glmnet)
library(mlbench)
data(BostonHousing)
X = as.matrix(BostonHousing[,-c(4,14)])
Y = BostonHousing[,14]
nfolds = 5
nreps = 10

res = lapply(1:nreps,function(i){
fit = cv.glmnet(x=X,y=Y,nfolds=nfolds)
data.frame(MSE_mean=fit$cvm,lambda=fit$lambda,se=fit$cvsd)
})
res = do.call(rbind,res)
我们可以总结结果,标准偏差仅通过取平均值来近似,但如果您想要精确,可能需要研究以下因素:

当您执行
coef(cvfit,s=“lambda.min”)
时,您将从最佳lambda中获取1个标准误差的lambda,请参见,以便您可以在不同的cv运行中平均MSE

library(glmnet)
library(mlbench)
data(BostonHousing)
X = as.matrix(BostonHousing[,-c(4,14)])
Y = BostonHousing[,14]
nfolds = 5
nreps = 10

res = lapply(1:nreps,function(i){
fit = cv.glmnet(x=X,y=Y,nfolds=nfolds)
data.frame(MSE_mean=fit$cvm,lambda=fit$lambda,se=fit$cvsd)
})
res = do.call(rbind,res)
我们可以总结结果,标准偏差仅通过取平均值来近似,但如果您想要精确,可能需要研究以下因素:


或者您可以增加接近LOOCV的折叠数,这样您就不必重复CV。或者您可以增加接近LOOCV的折叠数,这样您就不必重复CV。
library(ggplot2)
ggplot(res,aes(x=log(lambda),y=MSE_mean)) + stat_summary(fun=mean,size=2,geom="point") + 
geom_vline(xintercept=c(lambda.min,lambda_1se))