Есть ли способ получить переменную важность с Keras?

Я ищу правильный или лучший способ получить переменную важность в нейронной сети, созданной с помощью Keras. То, как я сейчас это делаю, я просто беру весы (а не смещения) переменных в первом слое, предполагая, что более важные переменные будут иметь больший вес в первом слое. Есть ли другой / лучший способ сделать это?

3 ответа

Решение

Поскольку все будет перемешано в сети, один только первый слой не может рассказать вам о важности каждой переменной. Следующие слои также могут увеличивать или уменьшать их важность, и даже заставить один вариант влиять на важность другого. Каждый нейрон самого первого слоя также придаст каждому варианту различную важность, так что это не так просто.

Я предлагаю вам сделать model.predict(inputs) используя входные данные, содержащие массивы нулей, чтобы во входной переменной была только одна переменная, которую вы хотите изучить.

Таким образом, вы видите результат для каждой переменной отдельно. Несмотря на то, что это все равно не поможет вам в случаях, когда один вар увеличивает значимость другого вар.

* Отредактировано, чтобы включить соответствующий код для реализации важности перестановки.

Я ответил на аналогичный вопрос на диаграмме важности функций в нейронной сети, используя Keras в Python. Он реализует то, что 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.

Я бы посмотрел на ЛАЙМ (объяснения с локальной интерпретируемой моделью). Основная идея состоит в том, чтобы установить некоторые входные данные на ноль, пропустить их через модель и посмотреть, если результат похож. Если да, то эта переменная может быть не такой важной. Но есть еще кое-что об этом, и если вы хотите узнать это, то вам следует прочитать статью.

Смотрите marcotcr / lime на GitHub.

Это относительно старый пост с относительно старыми ответами, поэтому я хотел бы предложить еще одно предложение по использованию SHAP чтобы определить важность функций для ваших моделей Keras. SHAP также позволяет обрабатывать модели Keras, используя слои, требующие ввода 3D, например LSTM а также GRU пока eli5 не могут.

Чтобы избежать двойной публикации, я хотел бы предложить свой ответ на аналогичный вопрос о Stackru при использованииSHAP.

Другие вопросы по тегам