提问人:Mauricio 提问时间:7/19/2023 更新时间:11/5/2023 访问量:87
glmnet with multimomial logit 中的惩罚因素
Penalty factors in glmnet with multimomial logit
问:
我正在尝试使用 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)
我如何使用完整的惩罚矩阵??谢谢!
答:
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.glmnet
set.seed
lapply
评论