○ 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
Feature Importance 문제점
왜 Feature Importance는 절대적인 Feature Selection 기준이 될 수 없는가?
○ Feature Importance는 최적 tree 구조를 만들기 위한 피처들의 impurity(불순도)가 중요 기준임. 결정값과 관련이 없어도 Feature Importance가 높아 질 수 있음
○ Feature Importance는 학습 데이터를 기반으로 생성됨. 테스트 데이터에서는 달라질 수 있음
○ Feature Importance는 number형의 높은 cardinality feature에 biased 되어 있음
'파이썬 머신러닝 완벽가이드 > [4장] 분류' 카테고리의 다른 글
| Feature Selection의 이해(1) (0) | 2023.03.03 | 
|---|---|
| 스태킹 앙상블 (0) | 2023.02.27 | 
| 캐글 신용카드 사기 검출 (0) | 2023.02.25 | 
| 캐글 신용카드 사기 검출(log 변환, 이상치 제거, SMOTE 오버샘플링 기초지식) (0) | 2023.02.24 | 
| 캐글 산탄데르 고객 만족 예측 (0) | 2023.02.23 |