랜덤포레스트 변수중요도

2021.12.19 19:02 3,978 조회

안녕하세요 !

설문조사 데이터를 사용하여 랜덤포레스트를 통하여 변수 중요도를 알아보고 있는데요

혹시 이렇게 해서 변수중요도를 볼 수 있는게 맞나요?

아니면 혹시 다른 방법으로 볼 수 있나요? ㅠㅠ

from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import train_test_split

import matplotlib.pyplot as plt

import mglearn

import numpy as np


d_data = dt.iloc[:,:-1]

d_target = dt["target"]


x_train, x_test, y_train, y_test = train_test_split(d_data,d_target, random_state=0)


forest = RandomForestClassifier(n_estimators=100,random_state=0)

forest.fit(x_train,y_train)


print("훈련 세트 정확도 : {:.3f}".format(forest.score(x_train,y_train)))

print("테스트 세트 정확도 : {:.3f}".format(forest.score(x_test,y_test)))


print("특성 중요도 : \n{}".format(forest.feature_importances_))


def plot_feature_importances(model):

  n_features = d_data.shape[1]

     plt.figure(figsize = (10, 10))

plt.barh(range(n_features), model.feature_importances_, align='center')

 plt.yticks(np.arange(n_features), d_data)

plt.xlabel("Importances")

plt.ylabel("Question")

plt.ylim(-1, n_features)

plt.show()

plot_feature_importances(forest)

로그인이 필요합니다
0 / 1000
Jay Hong
2021.12.19 20:38

Random Forest Classifier에서 Default로 제공하는 Feature Importance는 Gini Importance를 의미합니다.

Gini Importance
Random Forest = Ensemble of Decision Trees = 수많은 단순 나무 모형들의 조합입니다. (물론 그 안에 들어가는 trick들도 많이 있습니다)
여기서 Tree Based Model은 별도의 지정이 없으면 Gini 계수를 감소시키는 방향으로 나무를 형성합니다.
Gini계수가 감소한다는 것은 나무의 불순도가 줄어드는 방향을 의미합니다.
즉, 현재 node에 "True : False = 100: 100" 으로 존재한다면, 다음 node에는 "True : False = 100:0" & "True : False = 0 : 100" 이 되는 방향으로 쪼갭니다.
(두개가 나오는 이유는 depth가 깊어지면 2^n 만큼 깊어지는 나무의 특성이죠)
요약하자면, 다음 node에서 gini 계수가 낮아지는 방향으로 특정 feature를 선택해서 현재 node를 split하는게 RF의 특징입니다.


이 과정에서,
최상단 node(= root node)에서 특정 feature를 통해 data의 split이 일어난다면, 해당 feature는 important한 feature입니다.
이를 기반으로 계산된 값이 RF.feature_importance의 default입니다.

이 이외에도 
Mean Decrease Accuracy or Permutation Importance,
Shapely Values 등의 중요도가 있습니다.

Jay Hong
2021.12.19 20:34

Mean Decrease Accuracy or Permutation Importance
이 두가지는 비슷합니다.
위의 gini importance와는 다르게 이 두가지는 Accuracy를 기준으로 측정합니다.
특정 feature를 제거해보고, accuracy가 낮아진다면 importance를 높이는 방향으로 측정합니다.
Mean Decrease Accuracy는 RF 에서 OOB Error를 측정하며 함께 측정이 가능합니다.
Permutation Importance는 Sklearn.interaction에 내장되어 모델을 넣어 측정 가능합니다. 
- 단, Permutation Importance는 매번 Feature를 Random하게 제거하면서 측정하기 때문에, stable한 결과가 나오지 않습니다.

Shapley Values (좀 더 공부가 필요한데, 제가 이해한 부분을 작성하겠습니다)
게임 이론에 의해 개발되었으며, 모델의 결과를 만드는데 기여한 정도를 측정합니다.
해당 Feature의 유무를 다른 데이터와의 조합을 했을 때, 줄어드는 평균적인 변화입니다.
즉, 이 feature가 있을 때와 없을 때의 조합이 실질적인 변화를 얼마나 일으켜냈는지 계산하는 방법입니다.
Reference : https://towardsdatascience.com/understanding-how-ime-shapley-values-explains-predictions-d75c0fceca5a

Jay Hong
2021.12.19 20:36

틀린 부분 말씀해주시면 반영해서 수정하겠습니다!

Feature Importance는 상황에 맞게 판단하고, 어떤 결과를 보고싶으신지 확인하시면 됩니다 :)