【问题标题】:How to implement shapper:shap for whole dataset?如何为整个数据集实现 shapper:shap?
【发布时间】:2022-12-10 05:02:43
【问题描述】:

我使用 randomForest 包创建了一个随机森林模型

model_rf <- randomForest(y~ . , data = data_train,ntree=1000, keep.forest=TRUE,importance=TRUE)

为了基于这个 RF 模型计算不同特征的 Shapley 值,我首先创建一个“解释器对象”,然后使用“shapper”包

exp_rf <- DALEX::explain(model_rf, data = data_test[,-1], y = data_test[,1])

ive_rf <- shap(exp_rf, new_observation = data_test[1,-1])

据我所知,我只能将“形状”功能应用于一次观察(“新观察”)。

但我正在寻找一种方法来计算数据文件中所有受访者的 shapley 值。 我知道这在 Python 的“SHAP”包中是可能的;但是 R 中的“shapper”包也可以吗?

目前,我创建了一个循环来计算所有受访者的 shapley 值,但这将花费我几天的时间来计算我的整个数据文件。

for(i in c(1:nrow(data_test)))
{
ive_rf <- shap(exp_rf,new_observation=data_test[i,-1])
shapruns<-cbind(shapruns,ive_rf[,"_attribution_"])
} 

任何帮助将非常感激。

【问题讨论】:

  • 运气好的话?我发现的最佳方法是编写一个函数来解释一条记录,并使用 furrr 包启用并行处理以使用该函数来解释多条记录。诚然,这也不是理想的方法。

标签: r random-forest shap


【解决方案1】:

我最近发布了两个针对此类任务进行了优化的 R 程序包:“kernelshap”(快速计算 SHAP 值)和“shapviz”(绘制来自任何来源的 SHAP 值)。在您的情况下,一个工作示例是:

library(randomForest)
library(kernelshap)
library(shapviz)

set.seed(1)
fit <- randomForest(Sepal.Length ~ ., data = iris,)

# Step 1: Calculate Kernel SHAP values
# bg_X is usually a small (50-200 rows) subset of the data
s <- kernelshap(fit, iris[-1], bg_X = iris)

# Step 2: Turn them into a shapviz object
sv <- shapviz(s)

# Step 3: Gain insights...
sv_importance(sv, kind = "bee")
sv_dependence(sv, v = "Petal.Length", color_var = "auto")

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 2019-12-15
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2019-07-20
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多