看起来是因为他们在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, ...)
)
问题出在“模型”的定义上。当尝试运行
vi_model
时,这段代码会找出要使用哪个lambda:
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)
varImp
提供的重要性是绝对值,而vi_model
保留了符号?这里有什么区别? - Mistakamikazevs
是cyl
、mpg
、disp
和qsec
的函数。qsec
和cyl
的系数要比其他系数高得多,因此我猜它们可能对于你对vs
的预测更重要。我对这两个函数都没有任何经验,所以我无法说为什么一个选择了绝对值,而另一个没有。我在文档中找不到任何相关信息。 - Qwethm