使用 glmnet 和非常高的 Lambda 值进行交叉验证?

数据挖掘 机器学习 特征选择 交叉验证
2022-01-21 12:36:02

我正在尝试在我的数据集上使用 glmnet 库运行交叉验证 (folds=10)。我感兴趣的结果是 BMI,预测变量包括一组临床变量。我的最终目标是使用弹性网络回归来选择特征并预测 BMI。对于交叉验证,我使用 0 到 1 的 alpha 范围,增量为 0.1。我正在使用 min CVM 来确定 lambda 的值,使用我当前的代码,我对 lambda 的估计值非常高。更高的 lambda 值是否可以接受,或者我在这里看不到?下面是我的代码片段。感谢您的所有帮助和评论。

size <- floor(nrow(DataFile) * 0.7)
Train_rows <- sample(rownames(DataFile),size=size,replace=FALSE)
Train_Data <- DataFile[Train_rows,]
Train_bmi <- phenoFile[Train_rows,]$BMI

####### Cross Validation Alpha and Lambda #####

myAlpha <-  seq(0,1,by=0.1)


findAlpha_lambda <- function(iAlpha){
   Train_Data <- as.matrix(Train_Data)
   crossModel <- cv.glmnet(Train_Data,Train_bmi,alpha=iAlpha)
   myLambda <- crossModel$lambda.min
   myCVM <- min(crossModel$cvm)
   title <- paste(iAlpha,myLambda,sep="_")
   return(c(iAlpha,myLambda,myCVM))
}

myFrame <- as.data.frame(do.call(rbind,lapply(myAlpha,findAlpha_lambda)))
colnames(myFrame) <- c('Alpha','Lamda','CVM')
myFrame <- myFrame[order(myFrame$CVM),]
print(myFrame)


     Alpha      Lamda      CVM
1    0.0 50.9839208 54.25337
2    0.1  1.7901432 54.37151
3    0.2  3.1427680 54.75240
4    0.3  2.1949422 57.68935
5    0.4  1.8927376 61.68384
9    0.8  1.2510439 63.69622
6    0.5  1.0933677 64.68333
8    0.7  0.2441112 64.73192
7    0.6  2.2050751 65.01727
11   1.0  1.3860429 65.17181
10   0.9  0.5042962 65.70732
1个回答

我不认为大的 lambda 本身是一个问题。这只是意味着正在进行大量的正则化(在 Ridge 下)。看这里:

https://stats.stackexchange.com/questions/212056/ridge-lasso-lambda-greater-than-1

这是来自glmnet. 我建议您检查您的方法,即查看教程中显示的各种数字,特别是plot(cvfit)可能具有指导意义。此外,当您阅读本教程时,您会看到相当“大”的 lambda 值(请注意绘制了 lambda 的对数)。

https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html