Closed7

特徴量の重要度評価 ~ "Feature Importance"と"Permutation Importance"の比較 ~

yagiyukiyagiyuki

Feature Importanceとは

各特徴量のターゲトの分類寄与率を評価する指標である。
より詳細には、「ある特徴量で分割することでどれくらいジニ不純度を下げられるのか」ということになる。

理論的には、ジニ不純度(Gini impurity)をもとに計算されている。
https://yolo-kiyoshi.com/2019/09/16/post-1226/#outline__1

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.feature_importances_

メリット

木構造アルゴリズムの特性を踏まえた特徴量評価ができる

デメリット

  • 木構造のアルゴリズム以外で使えない
  • 学習データに対する評価しかできない(ゆえに、特徴量が予測精度にどれだけ貢献しているかはわからない)
yagiyukiyagiyuki

Permutation Importanceとは

「ある特徴量がどれだけモデルの予測精度向上に寄与しているのか」を評価する手法である。
ある特徴量をランダムに並べ替えることで、予測精度にどのくらい影響を計算する。

https://scikit-learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html

メリット

Feature Importanceのデメリットを解消できる。

デメリット

ない?
ジニ不純度を使ったほうが良い場面はあるのか?

yagiyukiyagiyuki

疑問

調査した限りPermutation Importance を使っておくのが無難という感想を得た。
Feature Importanceを使ったほうがよい場面はあるのだろうか?

yagiyukiyagiyuki

Permutation Importanceのサンプル

すごく簡単な例で、Permutation Importanceの出力結果をみてみる。

from sklearn.linear_model import LogisticRegression
from sklearn.inspection import permutation_importance
# 
# Xの0カラム目が1のときは、y=1, Xの1カラム目が0のときは、y=1を出力するように学習
# 
X = [[1, 9, 9],[1, 9, 9],[1, 9, 9],
     [0, 9, 9],[0, 9, 9],[0, 9, 9]]
y = [1, 1, 1, 0, 0, 0]
clf = LogisticRegression().fit(X, y)

# 
# Permutation Importanceの評価
# 
X_test = [[1, 9, 9], [0, 9, 9]]
y_test = [1, 0]
result = permutation_importance(clf, X_test, y_test, n_repeats=10,
                                random_state=0)
# 0カラム目をランダムに入れ替えたら、0.3の精度劣化がある
print(result.importances_mean) # out => [0.3 0.  0. ]

上記のコードに対して、X_testのカラムを入れかえる。

from sklearn.linear_model import LogisticRegression
from sklearn.inspection import permutation_importance
# 
# Xの0カラム目が1のときは、y=1, Xの1カラム目が0のときは、y=1を出力するように学習
# 
X = [[1, 9, 9],[1, 9, 9],[1, 9, 9],
     [0, 9, 9],[0, 9, 9],[0, 9, 9]]
y = [1, 1, 1, 0, 0, 0]
clf = LogisticRegression().fit(X, y)

# 
# Permutation Importanceの評価
# 
X_test = [[0, 9, 9], [1, 9, 9]] # 0と1カラム目をいれかえる。
y_test = [1, 0]
result = permutation_importance(clf, X_test, y_test, n_repeats=10,
                                random_state=0)
# 0カラム目をランダムに入れ替えたら、0.3の精度が上昇した。(つまり、0カラム目は、学習モデルが期待どおりに作用していない。)
print(result.importances_mean) # out => [-0.3 0.  0. ]
このスクラップは2021/04/13にクローズされました