Je recherche un moyen approprié ou optimal d'obtenir une importance variable dans un réseau neuronal créé avec Keras. La façon dont je le fais actuellement est que je prends juste les poids (pas les biais) des variables dans la première couche avec l'hypothèse que les variables plus importantes auront des poids plus élevés dans la première couche. Existe-t-il une autre/meilleure façon de procéder?
Étant donné que tout sera mélangé le long du réseau, la première couche seule ne peut pas vous dire l'importance de chaque var. Les couches suivantes peuvent également augmenter ou diminuer leur importance, et même faire en sorte qu'une var affecte l'importance d'une autre var. Chaque neurone dans la première couche lui-même donnera également à chaque var une importance différente, donc ce n'est pas quelque chose d'aussi simple.
Je vous suggère de faire model.predict(inputs)
en utilisant des entrées contenant des tableaux de zéros, ce qui fait que la variable que vous souhaitez étudier soit 1 dans l'entrée.
De cette façon, vous voyez le résultat pour chaque var seul. Même si cela ne vous aidera pas dans les cas où une var augmente l'importance d'une autre var.
Ce n'est pas si simple. Par exemple, dans les étapes ultérieures, la variable pourrait être réduite à 0.
Je voudrais jeter un coup d'œil à Lime (Explications du modèle interprétable local-agnostiques). L'idée de base est de mettre certaines entrées à zéro, de les passer par le modèle et de voir si le résultat est similaire. Si oui, alors cette variable pourrait ne pas être si importante. Mais il y a plus à ce sujet et si vous voulez le savoir, alors vous devriez lire le document.
Voir marcotcr/Lime sur GitHub.
* Modifié pour inclure le code pertinent pour implémenter l'importance de la permutation.
J'ai répondu à une question similaire à Feature Importance Chart in neural network using Keras in Python . Il implémente ce que Teque5 mentionné ci-dessus, à savoir mélanger la variable parmi votre échantillon ou l'importance de la permutation en utilisant package 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())