使用cv.glmnet做LASSO回归出现迭代未收敛警告问题咨询
警告含义
这个警告来自glmnet包底层的Fortran求解逻辑,含义是:
求解器在计算第79个lambda值对应的模型参数时,迭代满了默认的最大迭代次数maxit=100000仍未达到收敛阈值,因此停止了后续更小lambda值的计算,仅返回了比该不收敛lambda取值更大的所有lambda对应的模型结果。
是否需要重视并调整参数
分两种场景判断:
无需处理的情况
你当前使用s="lambda.1se"生成预测结果,该参数对应的是比交叉验证最小误差lambda大1倍标准误的正则化参数,本身属于偏大的lambda取值。你可以先做两个简单验证:
- 运行
plot(lasso.fit)查看交叉验证误差曲线是否完整,lambda.1se对应的标记点是否在曲线的有效展示区间内 - 运行
lasso.fit$lambda.1se %in% lasso.fit$lambda验证该lambda值是否在已返回的有效lambda列表中
如果两项验证都通过,说明你需要用到的lambda值已经成功求解,该警告不会对当前的预测结果产生任何影响,使用惩罚类模型时这类不影响目标结果的收敛警告无需过度担心。
需要调整参数的情况
如果出现以下任意一种情况,就需要对代码和参数做调整:
- 你需要用到更小的lambda值(比如
s="lambda.min"或者自定义的小lambda),且目标lambda不在已返回的有效lambda列表中 plot(lasso.fit)输出的误差曲线不完整,lambda.1se对应的位置没有有效误差值
可按优先级选择调整方案:
- 修正重复标准化问题
你当前的代码已经手动对x和x_test做了标准化,同时cv.glmnet又设置了standardize=TRUE,重复标准化会改变数据分布特征,大幅提升收敛难度,二选一即可:- 删掉手动
scale()的两行代码,保留standardize=TRUE - 保留手动标准化代码,将
standardize参数改为FALSE
- 删掉手动
- 调大最大迭代次数
给cv.glmnet添加maxit参数,提升求解器的迭代上限,例如设置为maxit = 1e6 - 排查数据问题
检查输入特征是否存在极端异常值、多重共线性过高的问题,这类数据问题也会导致求解收敛困难
内容的提问来源于stack exchange,提问作者Jh00ni
相关产品推荐
相关产品推荐

