Tensorflow 有没有办法获得Keras的可变重要性?

Tensorflow 有没有办法获得Keras的可变重要性?,tensorflow,deep-learning,keras,keras-layer,keras-2,Tensorflow,Deep Learning,Keras,Keras Layer,Keras 2,我正在寻找一个合适的或最好的方法,以获得与Keras创建的神经网络中的可变重要性。我目前的做法是,我只取第一层变量的权重(而不是偏差),假设更重要的变量在第一层中的权重更高。有没有其他/更好的方法呢?由于网络中的所有内容都会被混淆,单是第一层无法告诉您每个变量的重要性。下面的层也可以增加或减少其重要性,甚至使一个变量影响另一个变量的重要性。第一层中的每一个神经元本身也会赋予每个变量不同的重要性,所以这并不是那么简单 我建议你做建模。预测(输入)使用包含零数组的输入,只使你想研究的变量在输入中为1

我正在寻找一个合适的或最好的方法,以获得与Keras创建的神经网络中的可变重要性。我目前的做法是,我只取第一层变量的权重(而不是偏差),假设更重要的变量在第一层中的权重更高。有没有其他/更好的方法呢?

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

我建议你做
建模。预测(输入)
使用包含零数组的输入,只使你想研究的变量在输入中为1


这样,您可以单独看到每个变量的结果。即使如此,对于一个变量增加另一个变量的重要性的情况,这仍然没有帮助。

这并不是那么简单。例如,在以后的阶段,变量可以减少到0

我想看一下(本地可解释模型不可知解释)。基本思想是将一些输入设置为零,将其传递给模型,然后查看结果是否相似。如果是,那么这个变量可能没有那么重要。但是还有更多的内容,如果你想知道的话,你应该看看报纸


请参阅GitHub上的。

*编辑以包含实现置换重要性的相关代码

我在会议上回答了一个类似的问题。它确实实现了上面提到的功能,即使用


这是一篇比较老的帖子,回答也比较老,所以我想提供另一个建议,用它来确定Keras模型的功能重要性
SHAP
还允许您使用需要3d输入的图层(如
LSTM
GRU
)处理Keras模型,而
eli5
则不能


为了避免重复发布,我想提供。

我想知道我们是否可以使用sklearn的随机森林特征重要性,然后将其评估的重要特征用于keras分类器。这会产生问题吗?@deadcode可能是的,因为随机森林是一种决策树算法,与nn完全不同。你应该真正地在样本中洗牌变量,而不是将其设置为零。这保留了输入的平均值和方差。@Teque5“保留输入的平均值和方差”是一个很好的观点。这种洗牌方法称为随机林的置换重要性。有一个包可以执行此操作:。但我不确定置换重要性是否适用于NNs和深度学习模型。请参阅本文的“功能重要性评估”一节,深入讨论可变重要性方法。虽然此链接可以回答这个问题,最好在这里包括答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-谢谢你的意见!我首先考虑从第一个链接复制我的答案,在那里我用一个代码示例回答了一个类似的问题,但研究发现这是一个糟糕的形式。在本例中,我的第一个链接返回到一个类似的堆栈溢出问题。如果一个更完整的答案直接从堆栈溢出引用,那么只链接回答可以吗?作为一种规范,只链接回答需要通过注释提供。我有多个功能,并且得到
TypeError:如果没有指定评分,通过的估计员应该有一个“评分”方法。估计器没有。
@fanizer添加了如下评分方法:perm=排列重要性(model,scoring=“accurity”,random\u state=1)。拟合(石灰围绕单个观测值排列协变量,并使用经过训练的模型预测输出。然后,加权局部线性回归适合于模型输出和排列的协变量(对于回归)。这会为每个观察返回一个系数。它不会试图解释全局行为,尽管通过对每个观察运行LIME并检查系数,您可以很容易地做到这一点。我不认为上述解释与LIME有什么关系,因为它似乎描述了一个经典的敏感性分析。
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())