You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从tidymodels的ranger拟合模型获取变量重要性?与vip有何差异?

关于tidymodels+ranger变量重要性的问题解答

问题概述

多项研究显示机器学习模型的变量重要性分数可能存在偏差,而Loh和Zou(2021)的研究表明ranger的置换式变量重要性是无偏差的。现在用tidymodels搭配ranger引擎构建随机森林模型,有两个疑问:

  1. 怎么从拟合好的模型里获取ranger原生的变量重要性分数?
  2. 这个分数和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:01:06