SHAP с моделью Keras: операнды не могут передаваться вместе с фигурами (2,6) (10,) - PullRequest
1 голос
/ 14 января 2020

Я запускаю SHAP из библиотеки shapper в R для интерпретации модели классификации на модели 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)

Моя команда Shap

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)

1 Ответ

0 голосов
/ 28 февраля 2020

Проблема, которую вы представили, состоит из двух шагов. Прежде всего показанная ошибка происходит от опечатки кода. p_function, показанный Вами, вызывает глобальные объекты вместо переданных. Вот почему Вы стали свидетелями этой ошибки.

Но, к моему удивлению, я обнаружил, что пакет не работает даже после выяснения этой ошибки. Позвольте мне объяснить мотивацию и решение.

Должен сказать, что 3D-массивы не распространены в R, поэтому пакет Shapper не поддерживает этот тип данных поезда. Предполагается формат data.frame в начале задачи (потому что он перебирает переменные). Если честно, мне потребовалось 2 часа, чтобы найти причину, по которой это не работает, а также решение.

Прежде всего нам нужны новые переменные, которые понятны для шейперов.

shapper_data <- as.data.frame(train.conv)
shapper_new_obs <- as.data.frame(test.conv)[1,]

, а также новая функция предиката

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)

Прекрасно работает для меня.

Best Szymon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...