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

glmnet中多项logit回归自适应Lasso的penalty.factor使用问题

解决glmnet多项Logit回归中自适应Lasso的惩罚矩阵传入问题

错误原因

glmnet的penalty.factor参数在family="multinomial"模式下有两种使用逻辑:

  • 默认模式:长度需等于预测变量的数量(即ncol(x)),同一个预测变量在所有类别下的系数共享同一个惩罚因子;
  • 自定义系数级惩罚:长度需等于总系数数(不含截距项),即ncol(x) × 类别数,此时每个系数对应独立的惩罚因子。

你传入的是2×3的矩阵,glmnet无法识别该格式,且矩阵元素总数(6)和默认要求的变量数(2)不匹配,因此触发报错。

解决方法

将惩罚矩阵转换为符合glmnet系数排列顺序的一维向量,具体操作:

  1. 明确系数排列规则:glmnet中多项Logit的系数按「类别优先」排列——先存储第一个类别下所有变量的系数,再存储第二个类别下所有变量的系数,以此类推;
  2. 将你的2×3惩罚矩阵(行=变量,列=类别)转置后拉平,得到长度为6的向量,匹配系数排列顺序;
  3. 补全alpha=1参数(自适应Lasso基于标准Lasso,alpha需设为1)。

修改后的完整代码

y <- matrix(round(runif(100,1,3),0))
x <- matrix(rnorm(200),,2)

# Generate Penalties based on ridge regression
set.seed(4342)
ridge.cv <- cv.glmnet(x,y,alpha=0, family= "multinomial", type.measure = "deviance", nfolds = 10)

best_ridge <- do.call(cbind, coef(ridge.cv, s = ridge.cv$lambda.min))
penalty  <- 1 / abs(as.matrix(best_ridge)[-1,])

# 将惩罚矩阵转换为符合顺序的向量
penalty_vec <- as.vector(t(penalty))

# Cross-validation of Lambda
lasso.cv <- cv.glmnet(x,y,alpha=1, family= "multinomial", type.measure = "deviance", 
    penalty.factor = penalty_vec, nfolds = 10)

验证说明

转换后的penalty_vec顺序为:penalty[1,1](变量1-类别1)、penalty[2,1](变量2-类别1)、penalty[1,2](变量1-类别2)、penalty[2,2](变量2-类别2)、penalty[1,3](变量1-类别3)、penalty[2,3](变量2-类别3),完全匹配glmnet内部的系数存储顺序,可正确应用每个系数的自适应惩罚。

内容的提问来源于stack exchange,提问作者Mauricio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:17:05