오늘의 인기 글
최근 글
최근 댓글
Today
Total
04-30 00:02
관리 메뉴

우노

[ML] Sklearn Permutation Importance 를 사용한 Feature 중요도 파악 본문

AI/Machine Learning

[ML] Sklearn Permutation Importance 를 사용한 Feature 중요도 파악

운호(Noah) 2021. 7. 21. 15:56

Permutation Importance 란?

  • Permutation Importance 는, 모델 예측에 가장 큰 영향을 미치는 Feature 를 파악하는 방법입니다.
  • Permutation Importance 는 모델 훈련이 끝난 뒤에 계산되며,
  • 훈련된 모델이 특정 Feature 를 안 썼을 때, 이것이 성능 손실에 얼마만큼의 영향을 주는지를 통해,
  • 그 Feature 의 중요도를 파악하는 방법입니다.
  • 또한, 어떤 모델이든 적용할 수 있습니다.

Permutation Importance 의 장점

  • Permutation Feature Importance 의 중요한 특징이자 장점은, 모델을 재학습 시킬 필요가 없다는 것입니다.
    • 기존에는 특정 Feature 를 제거하고 모델을 재학습해서 중요도를 파악하는 방법도 있지만,
    • 그렇게 하면 당연히 시간적, 자원적 소모가 매우 클 것입니다.
    • 따라서, Permutation Feature Importance 는 Feature 를 제거하는 대신,
    • 특정 Feature 를 무작위로 섞어서(Permutation), 특정 Feature 를 노이즈로 만드는 것입니다.
      • 해당 Feature 가 무작위로 섞이게 되면, Target 과의 연결고리를 끊게 되는 것이므로, 해당 Feature 를 안 쓴다고 할 수 있을 것입니다.
    • 이렇게 특정 Feature 를 섞었을 때, 예측값이 실제 값보다 얼마나 차이가 더 생겼는지를 통해, 해당 Feature 의 영향력을 파악합니다.
    • 훈련된 모델이 이 특정 Feature 에 크게 의존하고 있을 경우에는, 예측 정확도가 크게 감소할 것입니다.
      • 즉, Feature 를 shuffle 했을 때
      • 모델의 성능이 떨어지면, 중요한 Feature
      • 모델의 성능이 그대로이거나, 좋아지면 중요하지 않은 Feature 입니다.
    • 이렇게, 훈련된 모델과 데이터만 있으면 변수 중요도를 뽑을 수 있기 때문에,
    • 모델의 학습 과정, 내부 구조에 대한 정보가 필요 없어서, 어느 모델이든 적용할 수 있게 됩니다.
  • 이 방법의 또 다른 특징은, 각 Feature 의 중요도는 ‘partial importance’가 아니라는 점입니다.
    • 각 Feature 의 중요도 안에는, 다른 Feature 들과의 상호작용도 포함됩니다.
    • 특정 Feature 의 값들을 랜덤으로 섞으면, 다른 Feature 들과의 연결고리도 끊어지게 되어,
    • 해당 Feature 와 관련이 있는 모든 상호작용의 영향이 사라질 것입니다.
    • 따라서, 두 Feature 간 상호작용의 영향은 그 두 개의 Feature Importance 각각에 중복 포함됩니다.

Permutation Importance 의 단점

  • Permutation Importance 를 적용하기 앞서 주의해야 할 점이 있습니다.
  • Permutation Importance 는 특정 Feature 를 무작위로 섞기 때문에, 실행마다 Feature Importance 결과가 매우 달라질 수 있습니다.
    • 물론, 이 점은 섞는 횟수를 늘림으로써 예측 에러의 분산을 감소시킬 수 있지만, Feature 의 개수가 매우 많을 경우에는 연산량이 증가할 것입니다.
    • 따라서, Permutation 의 적절한 횟수를 선택해야 할 것입니다.
  • 또한, Feature 를 무작위로 섞다보면 매우 비현실적인 데이터 조합이 생성될 가능성이 높습니다.
    • 특히, Feature 간 상관관계가 높을 경우 이러한 문제점이 발생하기 쉽습니다.
    • 예를 들어, Feature 중에 ‘키’와 ‘몸무게’가 있다고 할 때, 이 두 Feature 들은 상식적으로 상당한 연관이 있습니다.
    • 그런데, 키의 값들을 랜덤으로 섞다 보면, 키가 2m인데 몸무게가 30kg인 데이터가 만들어질 수도 있을 것입니다.
      • 이런 사례가 충분히 있을 만한 사례라고 보기는 어렵습니다.
    • 이러한, 데이터의 비개연성, 비현실성이 증가하면, 예측값에 지대한 영향을 미칠 가능성이 있고,
    • 이렇게 해서 중요도가 높게 나온다 해도 우리가 원하던 ‘Feature Importance’는 아닐 수 있습니다.
    • 따라서, 미리 변수들 간 상관관계가 매우 높은지 확인하고, 이를 염두에 두고 결과를 해석해야 할 것입니다.

예제 코드

from sklearn.inspection import permutation_importance # sklearn 22 버전부터 해당
from sklearn.metrics import make_scorer

# MAPE
def mean_absolute_percentage_error(y_test, y_pred):
    y_test, y_pred = np.array(y_test), np.array(y_pred)
    return np.mean(np.abs((y_test - y_pred) / y_test)) * 100

# fix_model : 훈련된 모델
# X_train : 훈련데이터 Feature
# y_train : 훈련데이터 Target
# scoring : Feature 를 Shuffler 한 뒤, 예측값과 실제값을 어떤 Metric 을 사용해 비교할지
# n_repeats : 특정 Feature 를 몇번 Shuffle 할 것인지
# random_state : 난수 고정
result = permutation_importance(fix_model, X_train, y_train, scoring = make_scorer(mean_absolute_percentage_error,greater_is_better=False),
                            n_repeats=30,
                            random_state=0)
# Feature label
Feature = train[['lr','lc','rc','ld','rd','lnnz','rnnz','lr*lc','lc*rc','lr*rc']] 

# Feature 중요도를 오름차순으로 정렬한 뒤, 해당 Feature 의 index 를 저장
sorted_result = result.importances_mean.argsort()

# 결과를 DataFrame 화
importances = pd.DataFrame(result.importances_mean[sorted_result], index=Feature.columns[sorted_result]).sort_values(0, ascending=False)   
importances

결과

  • 값이 클수록 중요한 변수이며, 값이 작을수록 중요하지 않은 변수입니다.

참고

Comments