【问题标题】:SHAP ValueError: Dimension 1 in both shapes must be equal, but are 2 and 1. Shapes are [?,2] and [?,1]SHAP ValueError:两个形状中的维度 1 必须相等,但为 2 和 1。形状为 [?,2] 和 [?,1]
【发布时间】:2021-05-24 02:58:15
【问题描述】:

基于之前训练的前馈网络,我尝试使用 SHAP 来获取特征重要性。我遵循了文档中描述的所有步骤,但仍然收到以下错误

ValueError: Dimension 1 in both shapes must be equal, but are 2 and 1. Shapes are [?,2] and [?,1]

以下代码生成了一个具有相同错误的可重复示例。

import pandas as pd
from numpy.random import randint
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense, BatchNormalization, Dropout, Activation
from keras.optimizers import Adam
import shap

# Train_x data creation
train_x = pd.DataFrame({
    'v1': randint(2, 20, 1489),
    'v2': randint(50, 200, 1489),
    'v3': randint(30, 90, 1489),
    'v4': randint(100, 150, 1489)
})

# Train_y data creation
train_y = randint(0, 2, 1489)

# One-hot encoding as I use categorical cross-entropy
train_y = to_categorical(train_y, num_classes=2)

# Start construction of a DNN Sequential model.
model = Sequential()

# First input layer with a dropout and batch normalization layer following
model.add(Dense(256, input_dim=train_x.shape[1]))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(rate=0.2))

# Output layer
model.add(Dense(2))
model.add(Activation('softmax'))

# Use the Adam optimizer
optimizer = Adam(lr=0.001)

# Compile the model
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

model.summary()

# Fit model
hist = model.fit(train_x, train_y, epochs=100, batch_size=128, shuffle=False, verbose=2)

# SHAP calculation
explainer = shap.DeepExplainer(model, train_x)
shap_values = explainer.shap_values(train_x[:500].values)

我有一个(None, 4) 的输入形状和一个带有 2 个神经元的 softmax 激活函数,因为我将它用于二进制分类。以下代码sn-p中的train_x数据是一个形状为(1489, 4)的pandas数据框。

我尝试更改 train_x 形状,但出现类似错误。任何帮助将不胜感激。

【问题讨论】:

  • 对于二元分类,您只需要一个输出神经元(一个受另一个约束,因为 softmax probs 的总和 = 1)。
  • @jtlz2 我使用的是分类交叉熵,这是相同的,但这与我的问题无关。此外,问题相似,但在另一个问题中,错误是由文档示例生成的,而不是来自预训练网络。
  • minimal reproducible example 可能会有所帮助。
  • @SergeyBushmanov 请查找带有可重现示例的编辑。

标签: python tensorflow valueerror dimensions shap


【解决方案1】:

请看下面一个使用 TF 进行二元分类的工作示例:

from numpy.random import randint
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, BatchNormalization, Dropout, Activation
from tensorflow.keras.optimizers import Adam
import shap
import tensorflow
print(shap.__version__, "\n",tensorflow.__version__)

# Train_x data creation
train_x = pd.DataFrame({
    'v1': randint(2, 20, 1489),
    'v2': randint(50, 200, 1489),
    'v3': randint(30, 90, 1489),
    'v4': randint(100, 150, 1489)
})

# Train_y data creation
train_y = randint(0, 2, 1489)

# One-hot encoding as I use categorical cross-entropy
train_y = to_categorical(train_y, num_classes=2)

# Start construction of a DNN Sequential model.
model = Sequential()

# First input layer with a dropout and batch normalization layer following
model.add(Dense(256, input_dim=train_x.shape[1]))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(rate=0.2))

# Output layer
model.add(Dense(2))
model.add(Activation('softmax'))

# Use the Adam optimizer
optimizer = Adam(lr=0.001)

# Compile the model
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

# model.summary()

# Fit model
hist = model.fit(train_x, train_y, epochs=100, batch_size=128, shuffle=False, verbose=0)

# SHAP calculation
shap.explainers._deep.deep_tf.op_handlers["AddV2"] = shap.explainers._deep.deep_tf.passthrough
explainer = shap.DeepExplainer(model, train_x)

shap_values = explainer.shap_values(train_x[:500].values)

shap.summary_plot(shap_values[1])

0.38.2 
 2.2.0

注意几点:

  1. 软件包版本(我相信 tf 应该低于 2.4)
  2. 添加"AddV2"(参见讨论here

【讨论】:

  • 提供的代码确实有效。但在我使用 Tensoflow 1.14 和 SHAP 0.38.2 版本评估 DNN 的情况下,我仍然收到错误消息。我不明白我做错了什么。当我运行 shap.DeepExplainer 函数 keras is no longer supported, please use tf.keras instead. WARNING:tensorflow:From The name tf.keras.backend.get_session is deprecated. Please use tf.compat.v1.keras.backend.get_session instead. 时,我还会收到以下消息
  • 我的问题是我有一个使用 tensorflow.python.keras 创建的已保存模型。有没有什么方法可以在 SHAP 中使用这种类型的保存模型而不会收到以下错误?
猜你喜欢
  • 2020-09-20
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
相关资源
最近更新 更多