○ permutation(순열) importance

- RFE와 같이 피처를 제거하면서 재학습을 수행할 필요가 없는 장점이 있음

- 사이킷런 feature selection 다른 모듈에 비해 일반적으로 많이 사용

- 테스트 데이터(검증 데이터)에 특정 피처의 값들을 반복적으로 무작위로 섞은 뒤 모델 성능이 얼마나 저하되는지를 기준으로 해당 피처의 중요도를 산정

permutation importance 프로세스

●모델 학습 후 원본 테스트 데이터로 기준 평가 성능을 설정

●원본 테스트(검증) 데이터의 개별 feature 별로 아래 수행

  • 설정된 iteration만큼 해당 feature 값들을 shuffle
  • 각각 모델 성능 평가 후 평균
  • 기준 평가 성능과 위에서 구한 평균을 비교해 모델 성능이 얼마나 저하되었는지 평가해서 피처 중요도 산정(중요한 피처면 저하가 큼) → 원본에서 평균적으로 얼마나 성능이 감소했나
# 실습을 위한 데이터 세트
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split

diabetes = load_diabetes()
X_train, X_val, y_train, y_val = train_test_split(diabetes.data, diabetes.target, random_state=0)
# 모델 학습 및 R2 Score 평가(기준 평가 성능)
from sklearn.linear_model import Ridge # 사용할 모델
from sklearn.metrics import r2_score # 평가 척도

model = Ridge(alpha=1e-2).fit(X_train, y_train)
y_pred = model.predict(X_val)
print('r2 score:', r2_score(y_val, y_pred))

import numpy as np

# permutation_importance:원본 테스트(검증) 데이터 지정
from sklearn.inspection import permutation_importance

r = permutation_importance(model, X_val, y_val, n_repeats=30, random_state=0) # n_repeats:iteration 만큼 shuffle

for i in r.importances_mean.argsort()[::-1]: # 평균 permutation importance가 높은 순으로 인덱스를 내림차순 정렬
    if r.importances_mean[i] -2 * r.importances_std[i] > 0: # 표준편차의 2 배 값보다 큰 평균을 가진 피처들로 선별
        # 위 조건을 만족하는 피처들의 평균 permutation importance값과 표준편차 출력
        print(diabetes.feature_names[i], "   ", np.round(r.importances_mean[i], 4), ' +/-', np.round(r.importances_std[i], 5))

 - 표준편차의 2 배 값보다 큰 평균을 가진 피처들로 선별했는가는 단순히 경험적인 결과이다. 일반적으로 permutation importance 사용할 때 경험적으로 표준편차의 2 배 값 정도를 추천하지만 꼭 2배일 필요는 없다. 2~3배 사이, 예를 들어 2.5배, 2.8배, 3배 정도의 기준을 가지고 feature selection을 적용한 뒤 가장 성능이 뛰어난 결과를 적용해 보면 된다.

- permutation_importance를 적용해 버리면, 바로 피처 중요도가 permutation importance 방식으로 적용해버린다. 그러니까, permutation_importance.importances_mean 속성은 계산된 피처 중요도를 가지고 있다. 이중에서 높은 것부터 출력이 된다. 즉, 위의 결과에서 각 피처의 importance_mean의 값을 보니 s5가 0.2042로 모델 성능이 가장 저하해서 가장 중요한 피처이다.

 

 

Reference)

1. https://scikit-learn.org/stable/modules/permutation_importance.html

2. https://soohee410.github.io/iml_permutation_importance

3. https://blog.naver.com/passiona2z/222617818847

4. https://www.inflearn.com/questions/672420/permutation-importance-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%8B%A4%EC%8A%B5

5. https://www.inflearn.com/questions/483915/permutation-importance-%EC%88%9C%EC%84%9C%EA%B0%80-%EC%9E%98-%EC%9D%B4%ED%95%B4%EA%B0%80%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4


Feature Importance 문제점

왜 Feature Importance는 절대적인 Feature Selection 기준이 될 수 없는가?

○ Feature Importance는 최적 tree 구조를 만들기 위한 피처들의 impurity(불순도)가 중요 기준임. 결정값과 관련이 없어도 Feature Importance가 높아 질 수 있음

○ Feature Importance는 학습 데이터를 기반으로 생성됨. 테스트 데이터에서는 달라질 수 있음

○ Feature Importance는 number형의 높은 cardinality feature에 biased 되어 있음

+ Recent posts