有没有办法通过 Keras 获得可变的重要性



我正在寻找一种正确或最佳的方式来在使用 Keras 创建的神经网络中获得可变重要性。我目前的做法是,我只取第一层变量的权重(而不是偏差(,并假设更重要的变量在第一层中将具有更高的权重。有没有其他/更好的方法?

由于所有内容都会沿着网络混淆,因此仅靠第一层无法告诉您每个变量的重要性。以下层还可以增加或减少其重要性,甚至使一个变量影响另一个变量的重要性。第一层中的每个神经元本身也会赋予每个变量不同的重要性,所以这不是那么简单的事情。

我建议您使用包含零数组的输入进行model.predict(inputs),使输入中只有您要研究的变量为 1。

这样,您就可以单独看到每个变量的结果。即使如此,这仍然无法帮助您处理一个变量增加另一个变量的重要性的情况。

*经过编辑以包含相关代码以实现排列重要性。

我在神经网络的特征重要性图表中使用Python中的Keras回答了类似的问题。 它确实实现了 Teque5 上面提到的内容,即使用 ELI5 包在样本或排列重要性之间打乱变量。

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=basemodel, **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())

事情没那么简单。例如,在后期阶段,变量可以减少到 0。

我会看看LIME(局部可解释模型不可知的解释(。基本思想是将一些输入设置为零,通过模型传递它,看看结果是否相似。如果是,那么该变量可能并不那么重要。但是还有更多关于它的信息,如果你想知道它,那么你应该阅读这篇论文。

参见GitHub上的marcotcr/lime。

这是一个相对较旧的帖子,答案相对较旧,因此我想提供另一个建议,即使用SHAP来确定 Keras 模型的特征重要性。 SHAP还允许您使用需要 3D 输入(如 LSTMGRU(的图层来处理 Keras 模型,而eli5则不能。

为了避免重复发布,我想回答一下关于使用SHAP的Stackoverflow的类似问题。

最新更新