关闭。这个问题需要details or clarity .它目前不接受答案。
想改进这个问题?通过 editing this post 添加详细信息并澄清问题.
1年前关闭。
Improve this question
我使用 glmnet
拟合了 Lasso Logistic 回归模型
X = data.matrix(mtcars %>% dplyr::select(-vs))
y = mtcars$vs
CV_lasso = cv.glmnet(X, y, alpha = 1, family = "binomial", type.measure = "class")
我试图确定变量的重要性,并遇到了两种产生截然不同结果的方法vip(CV_lasso$glmnet.fit)
varImp(CV_lasso$glmnet.fit, lambda = CV_lasso$lambda.min)
有人能告诉我这些方法有什么区别,哪一种更好吗?从逻辑套索模型中确定变量重要性的最佳方法是什么?
最佳答案
似乎是因为他们对 lambda
使用了不同的值。 .在 varImp
,您指定哪个 lambda
使用。但是,当您调用 vip
,然后在源代码中,执行以下代码:
imp <- if (inherits(object, what = "vi")) {
object
} else {
vi(object = object, ...) # compute variable importance scores
}
在哪里 vi(object = object, ...)
被调用。在 vi
的源代码中函数,在某些时候这个小标题被定义:tib <- switch(method,
"model" = vi_model(object, ...),
"firm" = vi_firm(object, feature_names = feature_names, var_fun = var_fun,
ice = ice, ...),
"permute" = vi_permute(object, feature_names = feature_names, ...),
vi_shap(object, feature_names = feature_names, ...)
)
问题出现在 "model"
的定义中。 .尝试运行时 vi_model
.在此函数中,此代码用于确定要使用的 lambda: # Extract coefficients
s <- list(...)$s
if (is.null(s)) {
s <- min(object$lambda)
}
由于您还没有定义s
, 然后它被设置为你的 lambdas 中的最小值。这是 lambda 的最后一个值,即 0.0001119218。这不等于 varImp
中使用的 lambda。 ,您指定使用最佳 lambda,在本例中为 0.1586463。您可以通过运行获得相同的系数:
c1 = vip::vi_model(CV_lasso$glmnet.fit, s = CV_lasso$lambda.min)
c2 = caret::varImp(CV_lasso$glmnet.fit, lambda = CV_lasso$lambda.min)
然后如果你坚持使用 vip::vip
要获得绘图,您可以在 c1
上调用此函数:vip::vip(c1)
关于r - glmnet 变量重要性 | `vip` 与 `varImp`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64628970/