web-dev-qa-db-ja.com

Kerasで重要度を変える方法はありますか?

Kerasで作成されたニューラルネットワークで変数の重要性を取得するための適切または最良の方法を探しています。現在のやり方は、より重要な変数が最初の層でより高い重みを持っているという前提で、最初の層で変数の重み(バイアスではなく)を取得するだけです。別の/より良い方法がありますか?

11
user1367204

ネットワークに沿ってすべてが混同されるため、最初のレイヤーだけでは各変数の重要性について説明できません。次のレイヤーも重要度を増減させることができ、ある変数が別の変数の重要性に影響を与えることさえできます。最初の層のすべてのニューロン自体もそれぞれの変数に異なる重要性を与えるため、単純なものではありません。

ゼロの配列を含む入力を使用してmodel.predict(inputs)を実行することをお勧めします。これにより、学習する変数のみが入力で1になります。

これにより、各変数のみの結果が表示されます。とはいえ、これは1つの変数が別の変数の重要性を高める場合にはまだ役に立ちません。

10
Daniel Möller

それほど単純ではありません。たとえば、後の段階で変数を0に減らすことができます。

Lime (Local Interpretable Model-Agnostic Explanations)をご覧ください。基本的な考え方は、いくつかの入力をゼロに設定し、それをモデルに渡して、結果が似ているかどうかを確認することです。はいの場合、その変数はそれほど重要ではない可能性があります。しかし、それについてはもっとあります。あなたがそれを知りたいなら、あなたは論文を読むべきです。

GitHubの marcotcr/Lime を参照してください。

5
Martin Thoma

*順列の重要性を実装する関連コードを含むように編集。

PythonでKerasを使用したニューラルネットワークの機能重要度チャート で同様の質問に答えました。上記の 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
Justin Hallas