特征重要性与模型解读
从集成模型中提取并可视化变量重要性和 SHAP 值
特征重要性与模型解读 是 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 反馈 — 无需本地设置。