glmnet 没有从 cv.glmnet 收敛到 lambda.min

Posted

技术标签:

【中文标题】glmnet 没有从 cv.glmnet 收敛到 lambda.min【英文标题】:glmnet not converging for lambda.min from cv.glmnet 【发布时间】:2015-11-18 00:32:45 【问题描述】:

我运行了 20 倍 cv.glmnet 套索模型以获得 lambda 的“最佳”值。但是,当我尝试从 glmnet() 重现结果时,我收到一条错误消息:

Warning messages:
1: from glmnet Fortran code (error code -1); Convergence for 1th lambda
   value not reached after maxit=100000 iterations; solutions for larger 
   lambdas returned 
2: In getcoef(fit, nvars, nx, vnames) :
   an empty model has been returned; probably a convergence issue

我的代码是这样写的:

set.seed(5)
cv.out <- cv.glmnet(x[train,],y[train],family="binomial",nfolds=20,alpha=1,parallel=TRUE)
coef(cv.out)
bestlam <- cv.out$lambda.min
lasso.mod.best <- glmnet(x[train,],y[train],alpha=1,family="binomial",lambda=bestlam)

现在,上面bestlam 的值是2.976023e-05,所以这可能是导致问题的原因吗?这是关于 lambda 值的舍入问题吗?为什么我不能直接从glmnet() 函数中重现结果?如果我使用与bestlam 的值相似范围内的 lambda 值向量,我没有任何问题。

【问题讨论】:

【参考方案1】:

您将单个 lambda 传递给您的 glmnet (lambda=bestlab),这是一个很大的禁忌(您正试图仅使用一个 lambda 值来训练模型)。

来自glmnet 文档(?glmnet)

lambda: A user supplied lambda sequence. Typical usage is to have the 
program compute its own lambda sequence based on nlambda and 
lambda.min.ratio. Supplying a value of lambda overrides this. WARNING: use 
with care. Do not supply a single value for lambda (for predictions after CV 
use predict() instead). Supply instead a decreasing sequence of lambda 
values. glmnet relies on its warms starts for speed, and its often faster to 
fit a whole path than compute a single fit.

【讨论】:

【参考方案2】:

glmnet 在这方面有点棘手 - 您需要使用一系列 lambda(例如,设置 nlambda=101)运行您的最佳模型,然后在预测时设置 s=bestlamexact=FALSE

【讨论】:

以上是关于glmnet 没有从 cv.glmnet 收敛到 lambda.min的主要内容,如果未能解决你的问题,请参考以下文章

如何从 cv.glmnet 中提取具有成本函数的实际分类错误率,以便与 cv.glm 进行比较?

在 R 中加载 Lime 包时出现错误“对象‘coef.cv.glmnet’不是由‘namespace:glmnet’导出”-

r ggplot.cv.glmnet

变量的顺序改变了 glmnet 中的估计系数

变量选择——lassoSCADMCP的实现(R语言)

变量选择——lassoSCADMCP的实现(R语言)