Я ищу правильный или лучший способ получить переменную важность в нейронной сети, созданной с помощью Keras. То, как я сейчас это делаю, - это просто взять весы (а не смещения) переменных в первом слое с предположением, что более важные переменные будут иметь более высокие веса в первом слое. Есть ли другой/лучший способ сделать это?
Есть ли способ получить переменную важность с Keras?
Ответ 1
Поскольку все будет перемешано по сети, первый слой не сможет рассказать вам о важности каждого var. Следующие слои также могут увеличить или уменьшить их значение, и даже сделать один var повлиять на важность другого var. Каждый одиночный нейрон в первом слое сам по себе придаст каждому вару другое значение, так что это не то, что прямолинейно.
Я предлагаю вам сделать model.predict(inputs)
с помощью входов, содержащих массивы нулей, в результате чего только переменная, которую вы хотите изучить, будет 1 во входном файле.
Таким образом, вы видите результат для каждого var. Хотя это все равно не поможет вам в случаях, когда один var увеличивает важность другого var.
Ответ 2
Все не так просто. Например, на более поздних стадиях переменная может быть уменьшена до 0.
Я бы посмотрел на ЛАЙМ (объяснения, основанные на локальной интерпретации модели). Основная идея состоит в том, чтобы установить некоторые входные данные на ноль, пропустить их через модель и посмотреть, если результат похож. Если да, то эта переменная может быть не такой важной. Но есть еще кое-что об этом, и если вы хотите узнать это, то вы должны прочитать газету.
Смотрите marcotcr/lime на GitHub.
Ответ 3
* Отредактировано, чтобы включить соответствующий код для реализации важности перестановки.
Я ответил на аналогичный вопрос в Feature Impance Chart в нейронной сети, используя 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())
Ответ 4
Я написал пост на эту тему (с реализацией Python)