정형데이터 분석에서 feature importance와 permutation importance

1. introduction

 

target 변수를 예측하는데 얼마나 유용한지에 따라 feature에 적절한 점수를 할당하여 중요도를 측정함

 

model-specific한 방법은 머신러닝 모델 자체에서 feature importance를 계산하게 해주는 기능을 제공함

 

model-agnostic한 방법은 머신러닝 모델에서 제공하는 기능에 의존하지 않고 모델을 학습한 후에 적용되는 feature importance를 계산하는 방식

 

 

2. boosting tree model-specific feature importance

 

2-1) LightGBM

 

training된 LightGBM class에 feature_importance를 호출함

 

importance_type을 인자로 받는데 기본값은 'split'으로 tree 생성시 특정 feature가 몇번이나 split에 쓰였는지 횟수를 구함

 

fi[f'fold_{fold+1}'] = clf.feature_importance()

 

 

split에 많이 쓰였다는 것은 그만큼 중요한 feature라는 뜻

 

'gain'은 split하면서 해당 feature의 information gain이 총 얼마인지 계산함

 

LightGBM에서 계산한 feature importance

 

 

2-2) XGBoost

 

training된 XGBoost class에 get_score함수를 호출함

 

feature_importance = np.array(clf.get_score().values())
fi[f'fold_{fold+1}'] = feature_importance

 

 

importance_type인자로 계산방식을 결정함

 

기본값은 ‘weight’로 LightGBM의 split과 동일함

 

‘gain’은 split하면서 feature의 information gain의 average값

 

‘total_gain’은 information gain의 총합

 

‘cover’은 average coverage를 계산해준다는데

 

 

 

leaf에서 분류된 training 데이터의 2차미분값의 총합?

 

leaf는 feature나 마찬가지니까.. 딱히 와닿지는 않는다

 

‘total_cover’은 coverage의 total값…

 

feature importance를 계산한 것을 보면 LightGBM과는 조금 다르다.. 모델 특성이 다르기 때문에 어떻게 보는지도 다르겠지

 

XGBoost를 이용한 feature importance

 

 

2-3) CatBoost

 

Training된 CatBoost class에서 get_feature_importance 함수를 호출하여 feature importance를 계산할 수 있음

 

fi[f'fold_{fold+1}'] = clf.get_feature_importance()

 

 

type으로 중요도 계산 방식을 설정할 수 있는데 CatBoost는 조금 특이하다..

 

CatBoost 중요도 계산방식 인자

 

 

다른 모델과 역시 feature importance 계산한 결과가 조금 다르다

 

CatBoost의 feature importance 계산 결과

 

 

3. model-agnostic feature importance

 

3-1) permutation importance

 

feature의 값들을 random하게 shuffling하여 model의 error를 측정해봄

 

feature가 실제로 중요하다면 model은 prediction의 상당부분이 이 feature의 영향을 받으므로 feature값을 섞어버리면 model error가 상당히 커질 것임

 

중요하지 않다면 prediction에 별로 영향을 끼치지 않으므로 model error가 그닥 커지진 않을 것임

 

feature를 하나하나 순회하면서 데이터를 셔플링하여 model의 에러를 측정하여 섞지 않았을 때 비해 error가 얼마나 차이가 나는지 보고

 

차이가 클수록 그 feature는 중요하다고 보면 된다

 

모델 학습 후에 importance를 계산한다는 말의 의미를 이해할 수 있을 것 같다

 

요즘에 자주 쓰이고 마스터님 경험상 상당히 신뢰할만한 importance를 준다고함

 

tree model에서 제공해주는 model-specific은 참고용으로 쓰고 실제 feature 선택시에는 permutation을 많이 씀

 

permutation 방법의 pseudo code

 

 

trained model과 feature matrix와 target vector과 error function을 input으로 줌

 

미리 정의한 error function을 이용하여 현재 trained model의 error를 계산함

 

feature j개를 하나씩 순회하면서 해당 feature 번호에 대한 데이터를 permutation함

 

이러면 그 feature j와 true outcome 사이에 관계가 깨질거임

 

미리 정의한 error function으로부터 permutation된 데이터를 이용하여 error를 계산함

 

기존 error와 permutation된 데이터를 이용하여 계산한 error와의 차이를 계산

 

혹은 위의 설명보면 비율로도 계산할 수 있다고함

 

이렇게 계산한 error 차이를 크기순으로 정렬하면 error차이가 큰 값일수록 상당히 중요한 feature라는 것을 알려줌

 

sklearn에서 permutation_importance를 제공해준다

 

 

 

실제로 feature 각각을 단 1번만 shuffling해서 구한다면 random 효과때문에 우연히 중요한 변수가 error가 작을수도 있어서

 

여러번 shuffling해서 평균을 구해서 feature importance로 계산하나봄

 

 

 

 

앞서 말한 모델들이 본 중요도와는 조금 다르다는데 당연하겠지 뭐

 

이거 보면 중복 feature인데 중요도가 다르게 되어있는데 제거 안하는게 맞는것 같기도 하고??

 

TAGS.

Comments