如何从tidymodels的ranger拟合模型获取变量重要性?与vip有何差异?
关于tidymodels+ranger变量重要性的问题解答
问题概述
多项研究显示机器学习模型的变量重要性分数可能存在偏差,而Loh和Zou(2021)的研究表明ranger的置换式变量重要性是无偏差的。现在用tidymodels搭配ranger引擎构建随机森林模型,有两个疑问:
- 怎么从拟合好的模型里获取ranger原生的变量重要性分数?
- 这个分数和vip包输出的重要性分数有啥区别?(提问者原以为vip输出的是基尼重要性)
附上测试代码:
library(tidymodels) library(vip) aq <- na.omit(airquality) model_rf <- rand_forest(mode = "regression") %>% set_engine("ranger", importance = "permutation") %>% fit(Ozone ~ ., data = aq) # 调用vip的变量重要性 vip:::vi(model_rf)
解答
1. 提取ranger原生变量重要性
因为你在set_engine()里指定了importance = "permutation",拟合后的模型已经包含了ranger计算的置换重要性。直接从底层ranger对象中提取即可:
# 获取ranger原生的置换重要性分数 ranger_var_importance <- model_rf$fit$variable.importance ranger_var_importance
这里model_rf$fit是tidymodels封装的原生ranger模型对象,variable.importance存储的就是未经过处理的原始重要性值——对回归任务来说,这个值代表变量被随机置换后,模型MSE的上升幅度,数值越大说明变量对模型的影响越强。
2. 和vip输出分数的区别
你之前对vip输出的理解有误:当你用importance = "permutation"拟合ranger模型时,vip::vi()输出的不是基尼重要性,而是ranger置换重要性的标准化版本。两者核心差异在:
- ranger原生分数:是原始的性能变化值(比如MSE变化量),没有做任何标准化,不同变量的分数绝对值可以直接对比影响程度。
- vip输出分数:默认会对原始分数做标准化处理(比如归一化到总和为100,或者按相对比例缩放),目的是让变量间的重要性占比更直观。
你可以运行以下代码对比两者:
# 查看vip输出的分数 vip_scores <- vip::vi(model_rf) print(vip_scores) # 查看ranger原生分数 print(model_rf$fit$variable.importance)
能看到vip的Importance列是原生分数按相对占比转换后的结果,本质上和ranger原生分数是同一套计算逻辑,只是做了标准化处理。
内容的提问来源于stack exchange,提问作者S Front
相关产品推荐
相关产品推荐

