glmnet 变量重要性 | `vip` 与 `varImp`
glmnet variable importance | `vip` vs `varImp`
我使用 glmnet
拟合了套索逻辑回归模型
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
函数的源代码中,在某些时候定义了这个 tibble:
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。
你可以通过运行ning得到相同的系数:
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)
我使用 glmnet
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
函数的源代码中,在某些时候定义了这个 tibble:
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。
你可以通过运行ning得到相同的系数:
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)