glmnet with multimomial logit 中的惩罚因素

Penalty factors in glmnet with multimomial logit

提问人:Mauricio 提问时间:7/19/2023 更新时间:11/5/2023 访问量:87

问:

我正在尝试使用 glmnet 为多项式 logit 回归拟合自适应套索。我的问题是:当我尝试在cv.glmnet中使用惩罚矩阵(2x3矩阵)penalty.factor时,出现以下错误:

'glmnet(x, y, weights = weights, offset = offset, lambda = lambda, : penalty.factor 的长度与变量的数量不匹配''

然而,问题在于列(类别)而不是行(变量),因为如果我只使用惩罚矩阵的一列(),它就会起作用。penalty[,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,])



# Cross-validation of Lambda

lasso.cv <- cv.glmnet(x,y,alpha=, family= "multinomial", type.measure = "deviance", 
    penalty.factor = penalty, nfolds = 10)

我如何使用完整的惩罚矩阵??谢谢!

R glmnet lasso-regression mlogit

评论


答:

0赞 IRTFM 11/4/2023 #1

有三列,所以你给出了一个 6 元素矩阵作为惩罚:best_ridge

> str(penalty)
 num [1:2, 1:3] 2.15e+37 1.12e+38 2.03e+38 9.76e+37 2.41e+37 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:2] "V1" "V2"
  ..$ : chr [1:3] "1" "1" "1"

错误消息说惩罚的长度与变量 (2) 的数量不匹配。所以我试着只提供该矩阵的一列,然后......没有错误。

> lasso.cv <- cv.glmnet(x,y,alpha=, family= "multinomial", type.measure = "deviance", 
+     penalty.factor = penalty[,1], nfolds = 10)
> lasso.cv

Call:  cv.glmnet(x = x, y = y, type.measure = "deviance", nfolds = 10,      alpha = , family = "multinomial", penalty.factor = penalty[,          1]) 

Measure: Multinomial Deviance 

    Lambda Index Measure      SE Nonzero
min 0.1584     1   2.228 0.05557       0
1se 0.1584     1   2.228 0.05557       0

至于想同时传递所有三列,我认为这没有任何意义。查看值。当我这样做时,第二列(自从你使用以来对你来说应该是一样的)这两个变量的惩罚符号颠倒了。没有理由认为回归类型函数应该被设计为以“矢量化”的方式处理参数。一次传递一个列非常容易。您将获得一个三元素列表,其中每个元素都是具有各种列值的 cv.glmnet cal 的单独实现。cv.glmnetset.seedlapply