Juhans
article thumbnail

1. 변수 중요도 (Feature Importance)

알고리즘마다 변수가 예측값에 얼마나 영향을 끼쳤는지에 대한 수치값.
일반적으로 Tree 계열 알고리즘에서는 부모 feature와 자식 feature GINI계수의 차이값이나 정보 엔트로피의 차이값으로  결정한다. (정보전달량, 정보획득량, information gain)

 

1.0.1. Tree 계열 알고리즘

Decision Tree, Random Forest, XGB 알고리즘에서는 feature_importance_ 라는 메서드가 지원되므로 이 메서드를 사용하여 변수 중요도 값을 확인할 수 있다. 

 

1.1. plot

Decision Tree나 Random Forest같은 scikit learn 패키지에서 지원되는 알고리즘들은 plot하는 메서드가 따로 존재하지 않기 때문에 함수를 만들어서 plot해줘야 한다.

<bash />
def plot_feature_importance(importance, names, topn = 'all'): feature_importance = np.array(importance) feature_names = np.array(names) data={'feature_names':feature_names,'feature_importance':feature_importance} fi_temp = pd.DataFrame(data) fi_temp.sort_values(by=['feature_importance'], ascending=False,inplace=True) fi_temp.reset_index(drop=True, inplace = True) if topn == 'all' : fi_df = fi_temp.copy() else : fi_df = fi_temp.iloc[:topn] plt.figure(figsize=(10,8)) sns.barplot(x='feature_importance', y='feature_names', data = fi_df) plt.xlabel('importance') plt.ylabel('feature names') plt.grid() return fi_df

 

다만, XGB의 경우에는 Scikit learn 패키지에서 지원되는 알고리즘이 아니고 xgboost 패키지 내에 변수중요도를 plot해주는 plot_importance 라는 메서드가 있어 이를 사용하면 된다.

 

1.1.1. XGB 모델의 plot_importance

XGB 모델에서는 변수 중요도를 시각화하는 메서드가 존재하는데, 위에서 직접 구현한 plot_feature_importacne 메서드와 조금 다르다.

XGB 모델의 plot_importance 메서드는 어떤 것을 기준으로 시각화할지 옵션을 지정해줄 수 있는데 옵션은 다음과 같다.

 

- weight (default)

변수 중요도를 tree에서 샘플들을 split할 때의 feature로 선택되는 횟수로 설정한다.

- gain

Decision Tree나 RandomForest와 같이 정보전달량을 기준으로 설정한다. (평균)

- cover

샘플들을 feature로 나눌 때 샘플의 개수를 평균내어 설정한다.

 

* gain과 cover의 경우에는 앞단에 total_이 붙어 평균에서 총량으로 계산될 수도 있다.

 

2. Permutation Importance

그렇다면 Tree 기반의 알고리즘 이외의 알고리즘 모델에서는 변수 중요도를 어떻게 확인할 수 있을까?

 

약간의 다른 접근 방식으로 변수 중요도를 결정하는 방법이 존재한다.

 

Permutation Importance는 아래 그림과 같이 중요도를 측정할 변수에 대해서 무작위로 섞은 뒤 예측값을 뽑아내 정상적인 예측값과의 차이를 구해 결정한다.

permutation feature importance

Permutation Importance는 permutation_importance라는 메서드로 sklearn에서 지원되며 모든 알고리즘에서 사용할 수 있다는 장점이 있다.

 

하지만 feature들끼리 다중 공선성이 강하게 존재할 때 중요한 변수가 중요하지 않은 것처럼 결과가 나올 수도 있다. 

예를 들어, x2 = x1 * 3 + x3 * 7와 같은 아주 강한 다중공선성이 존재할 때 x2가 무작위로 섞이더라도 x1과 x3를 가지고 x2를 설명할 수 있기 때문에 x2를 무작위로 섞어 예측값을 뽑아내더라도 원래의 예측값과 많은 차이가 나지 않는다. -> x2에 대한 변수 중요도가 낮은 것으로 보이게 된다.

 

2.0.1. 주의할 점

1. PFI (Permutation Feature Importance) 방식에서는 기존 예측값과 변수를 섞은 예측값의 차이를 계산하여 변수 중요도를 결정하기 때문에 아래와 같이 0미만의 중요도 값을 가지는 경우가 나오기도 한다.

PFI 예시

이런 경우는 변수를 섞었을 때의 예측값이 기존 예측값보다 더 큰 경우이다. 무작위로 섞었을 때의 예측값이 더 좋다는 뜻은 그 변수가 존재하지 않을 때 (무작위로 섞인 것은 아무 의미를 없게 설정하는 것과 동일) 더 좋은 성능을 보인다는 뜻이다. 그러므로 0 미만의 변수 중요도를 갖는 변수들은 모델에서 삭제하는 것을 고려해볼 수 있다.

 

2. PFI의 메서드 permutation_importance에는 n_repeats라는 시도횟수 hyper parameter 옵션이 존재한다. 변수중요도를 측정하기 위해 해당 변수의 값들을 무작위로 섞는다지만 낮은확률로 우연히 의미있는 순서로 값들이 나열될 수도 있기 때문에 여러번 무작위로 섞어 나온 예측값들을 평균내서 중요도를 결정하게 된다.

'ML & DL > XAI' 카테고리의 다른 글

Shapley Values (shap)  (0) 2022.09.12
PDP (Partial Dependence Plot)  (0) 2022.09.12