如何解决glmnet变量重要性| vip与varImp
我使用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,vi_shap(object,...)
)
"model"
的定义引起了问题。尝试运行vi_model
时。在此函数中,此代码找出了要使用的lambda:
# Extract coefficients
s <- list(...)$s
if (is.null(s)) {
s <- min(object$lambda)
}
由于您尚未定义s
,因此将其设置为您的最小lambda。那是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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。