You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:05:25