使用Python中的Keras进行神经网络中的特征重要性图表

and*_*dre 24 python neural-network keras

我正在使用python(3.6)anaconda(64位)spyder(3.1.2).我已经使用keras(2.0.6)设置了一个神经网络模型用于回归问题(一个响应,10个变量).我想知道如何生成这样的特征重要性图表:

特征重要性图表

def base_model():
    model = Sequential()
    model.add(Dense(200, input_dim=10, kernel_initializer='normal', activation='relu'))
    model.add(Dense(1, kernel_initializer='normal'))
    model.compile(loss='mean_squared_error', optimizer = 'adam')
    return model

clf = KerasRegressor(build_fn=base_model, epochs=100, batch_size=5,verbose=0)
clf.fit(X_train,Y_train)
Run Code Online (Sandbox Code Playgroud)

Jus*_*las 19

我最近在寻找这个问题的答案,并找到了一些对我正在做的事情有用的东西,并认为分享会很有帮助.我最终使用了eli5包中置换重要性模块.它最容易使用scikit-learn模型.幸运的是,Keras 为顺序模型提供了一个包装器.如下面的代码所示,使用它非常简单.

from keras.wrappers.scikit_learn import KerasClassifier, KerasRegressor
import eli5
from eli5.sklearn import PermutationImportance

def base_model():
    model = Sequential()        
    ...
    return model

X = ...
y = ...

my_model = KerasRegressor(build_fn=base_model, **sk_params)    
my_model.fit(X,y)

perm = PermutationImportance(my_model, random_state=1).fit(X,y)
eli5.show_weights(perm, feature_names = X.columns.tolist())
Run Code Online (Sandbox Code Playgroud)

  • 为什么所有排列的总和 (perm.feature_importances_) 不等于 1? (2认同)

jar*_*yeo 10

这是一篇相对较旧的帖子,答案相对较旧,因此我想提供另一个建议,SHAP用于确定 Keras 模型的特征重要性。SHAP提供对 2d 和 3d 数组的eli5支持,而目前仅支持 2d 数组(因此,如果您的模型使用需要 3d 输入的图层,例如LSTMGRUeli5将不起作用)。

这是如何绘制模型的特征重要性示例的链接,但如果它被破坏,下面还提供了一些示例代码和图(取自上述链接):SHAPKeras


import shap

# load your data here, e.g. X and y
# create and fit your model here

# load JS visualization code to notebook
shap.initjs()

# explain the model's predictions using SHAP
# (same syntax works for LightGBM, CatBoost, scikit-learn and spark models)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)

# visualize the first prediction's explanation (use matplotlib=True to avoid Javascript)
shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])

shap.summary_plot(shap_values, X, plot_type="bar")

Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 使用 `TreeExplainer` 时出错 `SHAPError: TreeExplainer 尚不支持模型类型: <class 'tensorflow.python.keras.engine.sequential.Sequential'>` (4认同)
  • 使用“DeepExplainer”时出错:“不再支持 keras,请改用 tf.keras。” (2认同)
  • @jarrettyeo,“from tensorflow.keras import Sequential”仍然不起作用。我收到错误:“异常:TreeExplainer 尚不支持模型类型:<class 'tensorflow.python.keras.engine.sequential.Sequential'>” (2认同)

pao*_*f89 5

目前,Keras没有提供任何功能来提取功能重要性.

你可以查看上一个问题: Keras:有什么方法可以获得变量的重要性吗?

或相关的GoogleGroup:功能重要性

Spoiler:在GoogleGroup中有人宣布了一个解决这个问题的开源项目.