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

Posted

技术标签:

【中文标题】有没有办法通过 Keras 获得可变的重要性?【英文标题】:Is there any way to get variable importance with Keras? 【发布时间】:2017-10-22 11:39:24 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

这样,您可以单独看到每个变量的结果。即便如此,在一个变量增加另一个变量的重要性的情况下,这仍然无济于事。

【讨论】:

我想知道我们是否可以使用 sklearn 中的随机森林特征重要性,然后将其评估的重要特征用于 keras 分类器。这会造成问题吗? @deadcode 可能是的,因为随机森林是一种与 nn 完全不同的决策树算法 你真的应该在你的样本中打乱变量而不是设置为零。这保留了输入的均值和方差。 @Teque5 “保持输入的均值和方差”的一个好点。这种洗牌方法称为随机森林的排列重要性。有一个包可以做到这一点:github.com/parrt/random-forest-importances。但我不确定置换重要性是否适用于 NN 和深度学习模型。 查看本文conference.scipy.org/proceedings/scipy2019/pdfs/…的特征重要性评估部分,深入讨论变量重要性方法。【参考方案2】:

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

我在Feature Importance Chart in neural network using Keras in Python 回答了类似的问题。它确实实现了上面提到的Teque5,即使用ELI5 package 在您的样本或排列重要性中打乱变量。

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())

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 感谢您的意见!我首先考虑从第一个链接复制我的答案,在那里我用代码示例回答了一个类似的问题,但经过研究发现这是错误的形式。在这种情况下,我的第一个链接可以追溯到类似的堆栈溢出问题。如果直接从堆栈溢出中引用更完整的答案,是否可以仅链接答案? 作为一个规范,只有链接的答案需要通过评论提供。 我拥有多项功能并获得TypeError: If no scoring is specified, the estimator passed should have a 'score' method. The estimator <keras.engine.training.Model object at 0x7fb2277e50b8> does not. @Enthusiast 添加评分方法如下: perm = PermutationImportance(model,scoring="accuracy", random_state=1).fit(【参考方案3】:

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

我会看看LIME(本地可解释模型无关的解释)。基本思想是将一些输入设置为零,将其传递给模型并查看结果是否相似。如果是,那么该变量可能并不那么重要。但是还有更多关于它的内容,如果你想了解它,那么你应该阅读这篇论文。

请参阅 GitHub 上的 marcotcr/lime。

【讨论】:

LIME 围绕单个观察值置换协变量,并使用经过训练的模型预测输出。然后加权局部线性回归适合模型输出和置换协变量(无论如何回归)。这将为每个观察返回一个系数。它不会试图解释全局行为,尽管您可以通过为每次观察运行 LIME 并检查系数来轻松做到这一点。我看不出上述解释与石灰有何关系,因为它似乎描述了经典的敏感性分析。【参考方案4】:

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

为避免重复发帖,我想提供my answer to a similar question on *** on using SHAP

【讨论】:

以上是关于有没有办法通过 Keras 获得可变的重要性?的主要内容,如果未能解决你的问题,请参考以下文章

使用 caret 包的可变重要性(错误);随机森林算法

Python - Scikit 找到分类变量的变量重要性

用于 keras 中可变大小图像的全卷积自动编码器

在 Keras 模型中优化准确性而不是损失

在 Keras 进行修剪

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