glmnet中多项logit回归自适应Lasso的penalty.factor使用问题
解决glmnet多项Logit回归中自适应Lasso的惩罚矩阵传入问题
错误原因
glmnet的penalty.factor参数在family="multinomial"模式下有两种使用逻辑:
- 默认模式:长度需等于预测变量的数量(即
ncol(x)),同一个预测变量在所有类别下的系数共享同一个惩罚因子; - 自定义系数级惩罚:长度需等于总系数数(不含截距项),即
ncol(x) × 类别数,此时每个系数对应独立的惩罚因子。
你传入的是2×3的矩阵,glmnet无法识别该格式,且矩阵元素总数(6)和默认要求的变量数(2)不匹配,因此触发报错。
解决方法
将惩罚矩阵转换为符合glmnet系数排列顺序的一维向量,具体操作:
- 明确系数排列规则:glmnet中多项Logit的系数按「类别优先」排列——先存储第一个类别下所有变量的系数,再存储第二个类别下所有变量的系数,以此类推;
- 将你的2×3惩罚矩阵(行=变量,列=类别)转置后拉平,得到长度为6的向量,匹配系数排列顺序;
- 补全
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
相关产品推荐
相关产品推荐

