사쿠의 데이터 블로그

변수 중요도 측정 - Permutation importance 본문

Python(데이터 분석, 딥러닝)

변수 중요도 측정 - Permutation importance

토스트먹어 2019. 10. 27. 16:08

공부를 위해 Kaggle 커널을 필사했으며, 원본 출처를 남깁니다.

(원본 주소 : https://www.kaggle.com/dansbecker/permutation-importance)

 

Permutation Importance

Using data from multiple data sources

www.kaggle.com

 

Introduction

모델에 대해 가장 기본적인 질문 중 하나는, 예측에 가장 큰 영향을 미치는 변수(feature)는 무엇일까?

이런 개념을 변수 중요도라고 한다. 필자는 사례 에서 모든 목적에 대해 변수 중요도가 효과적으로 사용되는 것을 보았습니다.

이번 페이지에서는 Permutation importance에 중점을 둘 것입니다. 대부분의 다른 접근 방식과 비교하여 Permutation importance의 중요성은 다음과 같습니다.

  • Fast to calculate
  • Widely used and understood
  • Consistent with properties we would want a feature importance measure to have

How it Works

Permutation importance 지금까지 본 것과는 다른 모델을 사용하며 많은 사람들이 처음에는 혼동을 느낍니다. 보다 구체적인 예를 들어보겠습니다.

Consider data with the following format:

우리는 10살 때 얻은 데이터로 20살 때 키를 예측하려 합니다.

데이터에는 유용한 변수들이 있고(10살 때 키) 설명력이 낮은 변수(양말 수)도 있습니다. 이런 변수들은 모델 설명 시 중점을 두지 않기를 희망합니다.

Permutation importance는 모델 피팅이 끝난 뒤에 계산됩니다. 그래서 만들어진 모델을 변경할 수 없고, Target또한 변경할 수 없습니다.

대신, 다음과 같은 질문을 할 것입니다. Validation 데이터의 한 column을 무작위로 섞고 대상과 다른 모든 열을 제자리에 남겨두면 예측 정확도에 어떤 영향을 미치게 될까?

 

column을 무작위로 재정렬하면 결과 데이터가 더 이상 실제 세계에서 관찰되는 것과 더 이상 일치하지 않으므로 예측 정확도가 떨어집니다. 모델이 예측에 크게 의존하는 열을 섞으면 모델 정확도가 특히 떨어집니다. 이 경우 2번째 변수(10세 키)를 셔플링하면 예측 정확도가 엄청나게 떨어질 것입니다. 양말을 대신 셔플하면 결과 예측에 거의 영향을 미치지 않습니다. 이러한 통찰력으로 프로세스는 다음과 같습니다.

 

1.    Get a trained model.

2.    단일 column 값을 섞고 결과 데이터 집합을 사용하여 예측합니다. 이러한 예측과 실제 target 값을 사용하여 손실 함수가 셔플링으로 얼마나 많이 깎였는지 계산하십시오. 이러한 성능 저하는 방금 섞은 변수의 중요성을 측정합니다.

3.    데이터를 원래대로 되돌립니다. 이제 각 열의 중요도를 계산할 때까지 데이터 집합의 다음 열에 대해 2 단계를 반복하십시오.

 

Code Example

이 예에서는 축구 / 풋볼 팀의 통계를 이용해 누가 "Man of Game" 수상 할지 예측하는 모델을 만듭니다. "Man of the Game"상은 게임에서 최고의 선수에게 수여됩니다. 모델 구축은 현재 우리의 초점이 아니므로 아래의 셀은 데이터를 로드하고 기초적인 모델을 만듭니다.

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
# from sklearn.inspection import permutation_importance  # sklearn 22 버전부터 해당

data = pd.read_csv('Kaggle/Permutation_importance/FIFA 2018 Statistics.csv')
y = (data['Man of the Match'] == "Yes")  # Convert from string "Yes"/"No" to binary
feature_names = [i for i in data.columns if data[i].dtype in [np.int64]]
X = data[feature_names]
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)
my_model = RandomForestClassifier(n_estimators=100, random_state=0).fit(train_X, train_y)


import eli5
from eli5.sklearn import PermutationImportance

perm = PermutationImportance(my_model, random_state=1).fit(val_X, val_y)
# eli5.show_weights(perm, feature_names = val_X.columns.tolist()) # Notebook에서 실행 가능

print(eli5.format_as_text(eli5.explain_weights(perm, feature_names = val_X.columns.tolist())))

0.1750 ± 0.0848  Goal Scored
0.0500 ± 0.0637  Distance Covered (Kms)
0.0437 ± 0.0637  Yellow Card
0.0187 ± 0.0500  Off-Target
0.0187 ± 0.0637  Free Kicks
0.0187 ± 0.0637  Fouls Committed
0.0125 ± 0.0637  Pass Accuracy %
0.0125 ± 0.0306  Blocked
0.0063 ± 0.0612  Saves
0.0063 ± 0.0250  Ball Possession %
     0 ± 0.0000  Red
     0 ± 0.0000  Yellow & Red
0.0000 ± 0.0559  On-Target
-0.0063 ± 0.0729  Offsides
-0.0063 ± 0.0919  Corners
-0.0063 ± 0.0250  Goals in PSO
-0.0187 ± 0.0306  Attempts
-0.0500 ± 0.0637  Passes

Interpreting Permutation Importance

높이 있을수록 중요한 변수이며, 아래 있을수록 중요하지 않습니다. 각 행의 첫 번째 숫자는 랜덤 셔플링 (이 경우 "정확도"를 메트릭으로 사용)을 사용하여 감소한 모델 성능을 나타냅니다. 열 섞기에서 정확한 성능 변화에 대한 임의성이 있습니다. 셔플을 여러번 사용하여 프로세스를 반복하면서 Permutation importance계산에서 임의의 정도를 측정합니다.

간혹, 음수 값이 표시되는 경우가 있습니다. 이 경우 셔플된 (또는 노이즈가 많은) 데이터에 대한 예측이 실제 데이터보다 더 정확한 경우입니다. 이 변수는 중요하지 않은 경우 (중요도 0에 가까워 야 함) 발생하지만 임의로 셔플된 데이터에 대한 예측이 더 정확한 이유는 운 / 기회에 대한 여지가 더 많기 때문에 이 예의 데이터 세트와 같은 작은 데이터 세트에서 더 일반적입니다.

이 예에서 가장 중요한 변수는 득점이었습니다. 합리적인 것 같습니다. 축구 팬들은 다른 변수의 순서가 놀라운 지 아닌지에 대한 직관을 가질 수 있습니다.

(개인적으로는 패스가 낮다는게 이상해 보임.)

'Python(데이터 분석, 딥러닝)' 카테고리의 다른 글

Python에서 Bigquery 연동하기  (0) 2022.01.23
Anomaly Detection with AE (2)  (0) 2019.05.26
Anomaly Detection with AE (1)  (1) 2019.05.25
Auto Encoder(개념)  (1) 2019.05.25
Pytorch 설치  (0) 2019.05.19