如何用glmnet复现基于elastic net包enet函数的迭代LASSO结果
用glmnet复现enet的LASSO变量选择流程
之前你用elasticnet包的enet函数对datasets列表中的数据集完成了LASSO回归,现在要改用glmnet包复现流程,同时解决系数提取和变量选择的问题,以下是完整实现:
关键参数对应说明
首先纠正一个核心错误:你之前的glmnet代码设置了alpha=0,这是岭回归(Ridge),而LASSO需要设置alpha=1(elastic net框架中,alpha=1对应LASSO,alpha=0对应Ridge)。另外要保留normalize=FALSE和原代码一致,保证数据预处理逻辑相同。
完整glmnet代码实现
1. 拟合LASSO模型
set.seed(100) # 保证结果可重复 L_fits <- lapply(data, function(i) glmnet(x = as.matrix(select(i, starts_with("X"))), y = i$Y, alpha = 1, normalize = FALSE) # alpha=1指定LASSO,和原enet的LASSO逻辑匹配 )
2. 提取对应lambda比例的系数
原enet中s=0.1, mode="fraction"指的是使用lambda序列中从最大lambda到最小lambda的10%位置的lambda值。glmnet返回的lambda序列是降序排列的,我们直接取序列的10%位置来对应这个参数:
L_Coeffs <- lapply(L_fits, function(fit) { # 计算对应fraction=0.1的lambda值 lambda_frac <- fit$lambda[round(length(fit$lambda) * 0.1)] # 提取系数并转为向量 coefs <- drop(as.matrix(predict(fit, s = lambda_frac, type = "coefficients"))) return(coefs) })
3. 提取LASSO选中的变量
和原代码逻辑一致,筛选出系数大于0的自变量(排除截距项):
LASSOs_Selections <- lapply(L_Coeffs, function(coefs) { # 排除截距项,只保留自变量的系数 var_coefs <- coefs[names(coefs) != "(Intercept)"] # 返回系数>0的变量名 names(var_coefs[var_coefs > 0]) })
验证一致性
运行上述代码后,你可以对比原elasticnet流程的LASSOs_Selections结果,两者应该完全一致(因为设置了相同的随机种子,且参数对应正确),以此验证结果无代码层面的随机性。
内容的提问来源于stack exchange,提问作者Marlen
相关产品推荐
相关产品推荐

