R Academy · 课时

特征重要性与模型解读

从集成模型中提取并可视化变量重要性和 SHAP 值

第 4 / 4 课13 个步骤

特征重要性与模型解读 是 CoddyKit 上的免费 R Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。

为什么模型解释很重要

没有人信任的准确模型在实际应用中毫无用处。模型解释回答两个问题:从全局来看,哪些特征最重要?(全局重要性)以及模型为什么做出这一特定预测?(局部解释)。XGBoost 和 ranger 都提供了用于计算全局重要性的内置工具,而 SHAP 值则支持局部解释。

# The interpretation toolkit we will use:
# - xgb.importance()      XGBoost global importance
# - xgb.plot.importance() Visualise XGBoost importance
# - ranger importance     Random forest importance
# - shapviz package       SHAP value computation + plots

cat('Packages needed: xgboost, ranger, shapviz')

xgb.importance() — 三种指标

xgb.importance(model) 会为每个特征返回一个包含三种重要性指标的数据框:

  • Gain:基于该特征进行分裂所带来的损失平均改善程度(信息量最大)。
  • Cover:基于该特征进行分裂所影响的观测数量平均值。
  • Frequency:使用该特征进行分裂的比例。
library(xgboost)
library(MASS)

X <- as.matrix(Boston[, -14])
y <- Boston[, 14]
dtrain <- xgb.DMatrix(data = X, label = y)

params <- list(objective = 'reg:squarederror', eta = 0.1,
               max_depth = 5, subsample = 0.8)
model  <- xgboost(data = dtrain, params = params,
                  nrounds = 100, verbose = 0)

imp <- xgb.importance(model = model, feature_names = colnames(X))
print(head(imp))

xgb.plot.importance()

xgb.plot.importance(importance_matrix) 会创建特征重要性的水平条形图。默认使用 Gain 指标。top_n 参数会将输出限制为最重要的若干特征,使图表更加清晰。

imp <- xgb.importance(model = model, feature_names = colnames(X))

# Plot top 10 features by Gain
xgb.plot.importance(
  importance_matrix = imp,
  top_n  = 10,
  measure = 'Gain',
  main   = 'XGBoost Feature Importance (Gain)'
)

ranger 特征重要性

ranger 支持两种重要性度量:'impurity'(速度快,在训练过程中计算)和 'permutation'(速度较慢,但会衡量每个特征对预测的实际影响)。通常更推荐使用置换重要性,以获得可靠的排名。

library(ranger)

# Impurity importance (fast)
rf_imp <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  importance = 'impurity'
)
imp_impurity <- rf_imp$variable.importance

# Permutation importance (more reliable, slower)
rf_perm <- ranger(
  medv ~ ., data = MASS::Boston,
  num.trees  = 500,
  importance = 'permutation'
)
imp_permutation <- rf_perm$variable.importance

cbind(impurity = sort(imp_impurity, dec=TRUE),
      permutation = sort(imp_permutation, dec=TRUE))

比较 ranger 和 XGBoost 的重要性

不同模型会分配不同的重要性分数,因为它们衡量的是不同的内容。基于不纯度的重要性(ranger 的默认方式)可能会偏向取值类别较多的特征。置换重要性更加稳健。XGBoost 的 Gain 通常是其三种指标中信息量最大的一种。

# Align rankings for comparison
xgb_rank <- imp$Feature
rf_rank  <- names(sort(rf_perm$variable.importance, dec=TRUE))

# Spearman rank correlation between the two rankings
shared <- intersect(xgb_rank, rf_rank)
xgb_pos <- match(shared, xgb_rank)
rf_pos  <- match(shared, rf_rank)

cor(xgb_pos, rf_pos, method = 'spearman')

什么是 SHAP 值

SHAP(SHapley Additive exPlanations)值依据博弈论,将每个预测分解为各个特征所作出的贡献。对于某个观测值的预测,SHAP 值之和等于模型输出与基线(平均预测值)之间的差异。因此,它既支持全局解释,也支持局部解释。

XGBoost 通过 predict(model, data, predcontrib = TRUE) 原生支持树 SHAP。

# Compute SHAP values natively from XGBoost
shap_matrix <- predict(
  model,
  newdata     = dtrain,
  predcontrib = TRUE  # returns SHAP contributions
)

# Result: matrix with one column per feature + BIAS column
dim(shap_matrix)  # rows x (features + 1)
colnames(shap_matrix)

shapviz 包基础

shapviz 包在 SHAP 值之上提供了功能丰富的可视化层。将原始 SHAP 矩阵和特征矩阵传递给 shapviz(),然后使用 sv_importance()、sv_waterfall() 和 sv_beeswarm() 等绘图函数。

library(shapviz)

# Build shapviz object from XGBoost model
shp <- shapviz(model, X_pred = X)

# Global importance: mean |SHAP| per feature
sv_importance(shp, kind = 'bar')

# Beeswarm plot (SHAP summary plot)
sv_importance(shp, kind = 'beeswarm')

瀑布图 — 局部解释

瀑布图用于解释单个预测:它展示每个特征如何将预测值推高或压低到基线之上或之下。正 SHAP 值(红色条)会提高预测值;负值(蓝色条)会降低预测值。基线是模型输出的平均值。

library(shapviz)

shp <- shapviz(model, X_pred = X)

# Explain the prediction for observation 1
sv_waterfall(shp, row_id = 1) +
  ggplot2::labs(
    title = 'SHAP Waterfall — Observation 1',
    subtitle = 'How each feature contributed to this prediction'
  )

部分依赖图

部分依赖图(PDP)展示单个特征对模型输出的边际影响,这种影响是在其他所有特征上取平均后得到的。它可以揭示这种关系是线性的、单调的,还是包含非线性模式。请使用 pdp 包或 SHAPforxgboost::pdp_shap()。

library(pdp)

# Partial dependence for 'lstat' in the Boston housing model
# We need a predict function wrapper for ranger
rf <- ranger(medv ~ ., data = MASS::Boston, num.trees = 300)

pd <- partial(
  rf,
  pred.var = 'lstat',
  train    = MASS::Boston,
  type     = 'regression'
)

plot(pd, type = 'l', lwd = 2,
     xlab = 'lstat', ylab = 'Partial Dependence',
     main = 'PDP: lstat vs medv')

SHAP 依赖图

SHAP 依赖图将某个特征的 SHAP 值绘制为其实际取值的函数。它与 PDP 类似,但使用精确的 SHAP 归因,并且可以根据另一个参与交互的特征为数据点着色,从而揭示交互效应。

library(shapviz)

shp <- shapviz(model, X_pred = X)

# SHAP dependence plot for 'lstat', coloured by 'rm'
sv_dependence(
  shp,
  v       = 'lstat',   # main feature on x-axis
  color_var = 'rm'     # interaction feature for colour
)

vip 包 — 统一的重要性接口

vip 包提供了与模型无关的重要性接口,可用于 ranger、XGBoost 以及任何 parsnip 模型。vip(model) 会创建条形图;vi(model) 会以 tibble 形式返回重要性值。

library(vip)

# Works with parsnip fitted models
lm_fit <- fit(
  linear_reg() |> set_engine('lm'),
  medv ~ ., data = MASS::Boston
)

vip(lm_fit, num_features = 10)

# Also works with ranger directly
vip(rf_imp, num_features = 10)

# Return importance as a data frame
vi(rf_imp)

快速检查

在 XGBoost 特征重要性中,通常认为哪个指标最能帮助理解特征质量?

解释总结

“特征重要性与模型解释”要点:

  • xgb.importance(model) 会返回 Gain、Cover 和 Frequency;其中 Gain 提供的信息最丰富。
  • xgb.plot.importance(imp) 会创建 XGBoost 重要性的条形图。
  • ranger 支持 'impurity'(速度快)和 'permutation'(可靠)两种重要性。
  • SHAP 值会将每个预测分解为各个特征的贡献。
  • shapviz 提供用于 SHAP 的瀑布图、蜂群图和依赖图。
  • 部分依赖图展示每个特征的平均边际影响。
  • vip 包提供与模型无关的统一重要性接口。
library(shapviz)

# Complete interpretation workflow
shp <- shapviz(xgb_model, X_pred = X_matrix)

# 1. Global importance
sv_importance(shp, kind = 'beeswarm')

# 2. Local explanation for one observation
sv_waterfall(shp, row_id = 42)

# 3. Feature relationship
sv_dependence(shp, v = 'most_important_feature')
免费开始

用 AI 导师学习 R — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
43
课程
159

常见问题解答

「特征重要性与模型解读」课时是免费的吗?

是的 — 「特征重要性与模型解读」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「特征重要性与模型解读」这节课中我会学到什么?

从集成模型中提取并可视化变量重要性和 SHAP 值 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「特征重要性与模型解读」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 决策树:集成模型的基础
  2. 使用 ranger 构建随机森林
  3. 使用 xgboost 进行梯度提升
  4. 特征重要性与模型解读
← 返回 R Academy