r - 带有 Keras 模型的 SHAP:操作数无法与形状一起广播 (2,6) (10,)
问题描述
我正在从 R 中的库 shapper 运行 SHAP,以在 Keras CNN 模型上进行分类模型插入:
library(keras)
library("shapper")
library("DALEX")
我做了一个简单的可复制示例
mdat.train <- cbind(rep(1:2, each = 5), matrix(c(1:30), ncol = 3, byrow = TRUE))
train.conv <- array_reshape(mdat.train[,-1], c(nrow(mdat.train[,-1]), ncol(mdat.train[,-1]), 1))
mdat.test <- cbind(rep(1:2, each = 3), matrix(c(1:18), ncol = 3, byrow = TRUE))
test.conv <- array_reshape(mdat.test[,-1], c(nrow(mdat.test[,-1]), ncol(mdat.test[,-1]), 1))
我的 CNN 模型
model.CNN <- keras_model_sequential()
model.CNN %>%
layer_conv_1d(filters=16L, kernel_initializer=initializer_he_normal(seed=NULL), kernel_size=2L, input_shape = c(dim(train.conv)[[2]],1)) %>%
layer_batch_normalization() %>%
layer_activation_leaky_relu() %>%
layer_flatten() %>%
layer_dense(50, activation ="relu") %>%
layer_dropout(rate=0.5) %>%
layer_dense(units=2, activation ='sigmoid')
model.CNN %>% compile(
loss = loss_binary_crossentropy,
optimizer = optimizer_adam(lr = 0.001, beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-08),
metrics = c("accuracy"))
model.CNN %>% fit(
train.conv, mdat.train[,1], epochs = 5, verbose = 1)
我的形状命令
p_function <- function(model, data) predict(model.CNN, test.conv, type = "prob")
exp_cnn <- explain(model.CNN, data = train.conv)
ive_cnn <- shap(exp_cnn, data = train.conv, new_observation = test.conv, predict_function = p_function)
我收到此错误:
Error in py_call_impl(callable, dots$args, dots$keywords) :
ValueError: operands could not be broadcast together with shapes (2,6) (10,)
Detailed traceback:
File "/.local/lib/python3.6/site-packages/shap/explainers/kernel.py", line 120, in __init__
self.fnull = np.sum((model_null.T * self.data.weights).T, 0)
解决方案
您提出的问题有两个步骤。首先显示的错误来自代码拼写错误。p_function
You 显示的调用全局对象而不是传递的对象。这就是为什么你目睹了那个错误。
但令我惊讶的是,即使在澄清了那个错误之后,我也发现包不起作用。让我解释一下动机和解决方案。
不得不说 3D 数组在 R 中并不常见,因此 shapper 包不支持这种类型的训练数据。它在任务开始时采用 data.frame 格式(因为它正在迭代变量)。老实说,我花了 2 个小时才找到它无法正常工作的原因以及解决方案。
首先,我们需要shapper可以理解的新变量。
shapper_data <- as.data.frame(train.conv)
shapper_new_obs <- as.data.frame(test.conv)[1,]
以及新的 predict_function
p_function <- function(model, data) {
mat <- as.matrix(data)
mat <- array_reshape(mat, c(nrow(data), ncol(data), 1))
predict(model, mat, type = "prob")
}
两条新线将 data.frame 转换为适当形状的数组。
然后线
ive_cnn <- individual_variable_effect(x = model.CNN, data = shapper_data, new_observation = shapper_new_obs, predict_function = p_function)
对我来说非常好。
最好的 Szymon
推荐阅读
- python - 从不同文件中的同一类访问函数
- javascript - fs.readFileSync 不是函数?
- gsl - GSL 上的自适应显式二阶龙格库塔方法
- apache-kafka - Confluent Kafka 复制器 | 消费者组偏移量未复制到目标集群
- python - ValueError: Expect x to be a 1-D sorted array_like.我试图绘制平滑曲线但不能
- java - 获取 java.io.IOException: Is a directory: on running a web app with jboss server on linux OS
- nginx - 无法加载资源:Angular-NodeJS 应用程序上的 net::ERR_CONNECTION_REFUSED 错误
- c# - C#,具有高权限的任务计划程序
- lua - LUVIT DISCORDIA如何获得公会的ID
- python - 通过布尔 if-elif-else 条件循环嵌套列表