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

R语言随机森林多分类用fastshap计算近似SHAP值代码报错咨询

R中fastshap计算多分类随机森林SHAP值的代码修正

原代码核心错误

  • 预测函数不兼容:模型是用randomForest包原生接口训练的,但预测时调用了仅适配caret训练对象的predict.train方法,模型类不匹配直接报错。
  • 特征集传参错误:fastshap::explain()的X参数要求输入纯特征数据集,你传入了包含因变量y的完整训练集,会导致预测维度错乱。
  • 子集索引逻辑错误:which(y==3)调用的是全局环境中的y对象,不是训练集内部的标签列,索引结果不符合预期。

修正后可运行代码(以计算第3类SHAP值为例)

library(randomForest)
library(fastshap)
library(ggplot2)

# 拆分训练测试集
set.seed(42) 
sample_idx <- sample.int(n = nrow(ITA), size = floor(.75*nrow(ITA)), replace = FALSE)
train <- ITA[sample_idx, ]
test <- ITA[-sample_idx, ]

# 训练多分类随机森林
set.seed(42)
rftrain <- randomForest(y ~ ., data = train, ntree = 500, importance = TRUE) 

# 适配randomForest模型的预测包装器,返回第3类的预测概率
pred_class3 <- function(object, newdata) {
  predict(object, newdata = newdata, type = "prob")[, 3]
}

# 计算SHAP值
set.seed(42) # 固定随机种子保证结果可复现
shap_class3 <- explain(
  object = rftrain,
  X = train[, setdiff(colnames(train), "y")], # 剔除标签列,仅传入特征
  pred_wrapper = pred_class3,
  nsim = 50, # 采样数,正式分析建议调到100~500提升稳定性
  newdata = train # 若只需计算真实标签为3的样本的SHAP值,替换为train[train$y==3, setdiff(colnames(train), "y")]
)

批量计算5个类别SHAP值+可视化

直接写循环批量处理即可,同时输出每个类别的特征重要性图:

shap_list <- list()
class_levels <- levels(train$y)
n_class <- length(class_levels)

for (i in 1:n_class) {
  # 生成第i类的预测函数
  pred_i <- function(model, newdata) {
    predict(model, newdata = newdata, type = "prob")[, i]
  }
  # 计算第i类SHAP值
  set.seed(42)
  shap_list[[i]] <- explain(
    object = rftrain,
    X = train[, setdiff(colnames(train), "y")],
    pred_wrapper = pred_i,
    nsim = 50,
    newdata = train
  )
  # 绘制SHAP特征重要性图并保存
  imp_plot <- autoplot(shap_list[[i]], type = "importance") +
    ggtitle(paste0("类别「", class_levels[i], "」SHAP特征重要性"))
  ggsave(paste0("class_", i, "_shap_importance.png"), imp_plot, width = 7, height = 5, dpi = 300)
}

# 单特征依赖图示例:第3类下某特征的SHAP依赖关系
dep_plot <- autoplot(
  shap_list[[3]], 
  type = "dependence", 
  feature = "替换为你的特征名",
  X = train[, setdiff(colnames(train), "y")],
  pred_wrapper = pred_class3
)

提示:如果运行时提示内存不足,可以把newdata换成测试集,或者分批计算SHAP值。

内容的提问来源于stack exchange,提问作者kris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:48:31