有没有什么办法可以让 Keras 变得重要?
Is there any way to get variable importance with Keras?
我正在寻找一种合适的或最佳的方法来在使用 Keras 创建的神经网络中获得可变的重要性。我目前的做法是,假设更重要的变量在第一层中具有更高的权重,我只取第一层中变量的权重(而不是偏差)。有another/better的方法吗?
由于网络中的所有内容都会混合在一起,仅第一层无法告诉您每个变量的重要性。下面的层也可以增加或减少它们的重要性,甚至可以使一个变量影响另一个变量的重要性。第一层中的每个神经元本身也会赋予每个变量不同的重要性,所以这不是那么简单。
我建议您 model.predict(inputs)
使用包含零数组的输入,在输入中仅使您要研究的变量为 1。
这样,您就可以单独看到每个变量的结果。尽管如此,这仍然无法帮助您解决一个变量增加另一个变量重要性的情况。
没那么简单。例如,在后期阶段变量可以减少到 0。
我会看看 LIME(本地可解释模型不可知论解释)。基本思想是将一些输入设置为零,将其传递给模型并查看结果是否相似。如果是,那么该变量可能不那么重要。但是还有更多关于它的内容,如果你想知道它,那么你应该阅读这篇论文。
参见GitHub上的marcotcr/lime。
*编辑以包含实现排列重要性的相关代码。
我在 Feature Importance Chart in neural network using Keras in Python. It does implement what Teque5 mentioned above, namely shuffling the variable among your sample or permutation importance using the 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())
这是一个相对较旧的 post,答案相对较旧,因此我想提供另一个建议,即使用 SHAP
来确定 Keras 模型的特征重要性。 SHAP
还允许您使用需要 3d 输入的图层处理 Keras 模型,例如 LSTM
和 GRU
而 eli5
不能。
为了避免双重 posting,我想提供 my answer to a similar question on Whosebug on using SHAP
。
我正在寻找一种合适的或最佳的方法来在使用 Keras 创建的神经网络中获得可变的重要性。我目前的做法是,假设更重要的变量在第一层中具有更高的权重,我只取第一层中变量的权重(而不是偏差)。有another/better的方法吗?
由于网络中的所有内容都会混合在一起,仅第一层无法告诉您每个变量的重要性。下面的层也可以增加或减少它们的重要性,甚至可以使一个变量影响另一个变量的重要性。第一层中的每个神经元本身也会赋予每个变量不同的重要性,所以这不是那么简单。
我建议您 model.predict(inputs)
使用包含零数组的输入,在输入中仅使您要研究的变量为 1。
这样,您就可以单独看到每个变量的结果。尽管如此,这仍然无法帮助您解决一个变量增加另一个变量重要性的情况。
没那么简单。例如,在后期阶段变量可以减少到 0。
我会看看 LIME(本地可解释模型不可知论解释)。基本思想是将一些输入设置为零,将其传递给模型并查看结果是否相似。如果是,那么该变量可能不那么重要。但是还有更多关于它的内容,如果你想知道它,那么你应该阅读这篇论文。
参见GitHub上的marcotcr/lime。
*编辑以包含实现排列重要性的相关代码。
我在 Feature Importance Chart in neural network using Keras in Python. It does implement what Teque5 mentioned above, namely shuffling the variable among your sample or permutation importance using the 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())
这是一个相对较旧的 post,答案相对较旧,因此我想提供另一个建议,即使用 SHAP
来确定 Keras 模型的特征重要性。 SHAP
还允许您使用需要 3d 输入的图层处理 Keras 模型,例如 LSTM
和 GRU
而 eli5
不能。
为了避免双重 posting,我想提供 my answer to a similar question on Whosebug on using SHAP
。