关于 LSTM Keras 上排列重要性的问题

Posted

技术标签:

【中文标题】关于 LSTM Keras 上排列重要性的问题【英文标题】:Question about Permutation Importance on LSTM Keras 【发布时间】:2020-06-26 15:09:38 【问题描述】:
from keras.wrappers.scikit_learn import KerasClassifier, KerasRegressor   
import eli5
from eli5.sklearn import PermutationImportance

model = Sequential()
model.add(LSTM(units=30,return_sequences= True, input_shape=(X.shape[1],421)))
model.add(Dropout(rate=0.2))
model.add(LSTM(units=30, return_sequences=True))
model.add(LSTM(units=30))
model.add(Dense(units=1, activation='relu'))

perm = PermutationImportance(model, scoring='accuracy',random_state=1).fit(X, y, epochs=500, batch_size=8)
eli5.show_weights(perm, feature_names = X.columns.tolist())

我运行 LSTM 只是为了查看包含 400 多个特征的数据集的特征重要性。我使用 Keras scikit-learn 包装器来使用 eli5 的 PermutationImportance 函数。但是代码正在返回

ValueError: Found array with dim 3. Estimator expected <= 2.

如果我使用model.fit(),代码运行流畅,但无法调试排列重要性的错误。有谁知道怎么回事?

【问题讨论】:

【参考方案1】:

eli5's scikitlearn 用于确定排列重要性的实现只能处理 2d 数组,而 keras'LSTM 层需要 3d 数组。这个错误是known issue,但似乎还没有解决方案。

我知道这并不能真正回答您让eli5 与 LSTM 一起工作的问题(因为它目前不能),但我遇到了同样的问题并使用了另一个名为 SHAP 的库来获得我的 LSTM 模型。以下是我的一些代码,可帮助您入门:

import shap
DE = shap.DeepExplainer(model, X_train) # X_train is 3d numpy.ndarray
shap_values = DE.shap_values(X_validate_np, check_additivity=False) # X_validate is 3d numpy.ndarray

shap.initjs()
shap.summary_plot(
    shap_values[0], 
    X_validate,
    feature_names=list_of_your_columns_here,
    max_display=50,
    plot_type='bar')

这是您可以获得的图表示例:

希望这会有所帮助。

【讨论】:

您能否展示有关您的数据和 lstm 输入数据的示例。谢谢 X_validate_np 和 X_validate 是否相同? @user5305519 我也有同样的问题:X_validate_np的形状是什么???? 当我使用 3d X_validate 时,会导致错误 IndexError: index 66 is out of bounds for axis 1 with size 15,

以上是关于关于 LSTM Keras 上排列重要性的问题的主要内容,如果未能解决你的问题,请参考以下文章

Keras关于LSTM的units参数是什么

使用 LSTM 和 CNN 对 Keras 进行故障排除以进行时间序列分类

无法匹配 Keras LSTM 模型所需的维数

Keras中的LSTM

基于注意力机制的CNN-LSTM模型及其应用(含软硬注意力区别)

基于注意力机制的CNN-LSTM模型及其应用(含软硬注意力区别)