4.6 랜덤 포레스트의 특성 중요도 사용
이전 절에서 로지스틱 회귀의 L1 규제를 사용하여 관련이 적은 특성의 가중치를 0으로 만드는 방법을 배웠습니다. SBS 알고리즘을 사용하여 특성을 선택하고 KNN 알고리즘에 적용하는 방법도 보았습니다. 데이터셋에서 유용한 특성을 선택하는 또 다른 방법은 3장에서 소개한 앙상블 기법인 랜덤 포레스트를 사용하는 것입니다. 랜덤 포레스트를 사용하면 앙상블에 참여한 모든 결정 트리에서 계산한 평균적인 불순도 감소로 특성 중요도를 측정할 수 있습니다. 데이터셋이 선형적으로 구분 가능한지 여부를 가정할 필요가 없습니다. 편리하게도 사이킷런의 랜덤 포레스트 구현은 특성 중요도 값을 이미 수집하고 있습니다.19 RandomForestClassifier 모델을 훈련한 후 feature_importances_ 속성에서 확인할 수 있습니다. 다음 코드에서 Wine 데이터셋에서 500개의 트리를 가진 랜덤 포레스트를 훈련하고 각각의 중요도에 따라 13개의 특성에 순위를 매깁니다. 트리 기반 모델은 표준화나 정규화를 할 필요가 없다고 3장에서 이야기했던 것을 기억하세요.
>>> from sklearn.ensemble import RandomForestClassifier
>>> feat_labels = df_wine.columns[1:]
>>> forest = RandomForestClassifier(n_estimators=500,
... random_state=1)
>>> forest.fit(X_train, y_train)
>>> importances = forest.feature_importances_
>>> indices = np.argsort(importances)[::-1]
>>> for f in range(X_train.shape[1]):
... print("%2d) %-*s %f" % (f + 1, 30,
... feat_labels[indices[f]],
... importances[indices[f]]))
>>> plt.title('Feature Importance')
>>> plt.bar(range(X_train.shape[1]),
... importances[indices],
... align='center')
>>> plt.xticks(range(X_train.shape[1]),
... feat_labels[indices], rotation=90)
>>> plt.xlim([-1, X_train.shape[1]])
>>> plt.tight_layout()
>>> plt.show()
1) Proline 0.185453
2) Flavanoids 0.174751
3) Color intensity 0.143920
4) OD280/OD315 of diluted wines 0.136162
5) Alcohol 0.118529
6) Hue 0.058739
7) Total phenols 0.050872
8) Magnesium 0.031357
9) Malic acid 0.025648
10) Proanthocyanins 0.025570
11) Alcalinity of ash 0.022366
12) Nonflavanoid phenols 0.013354
13) Ash 0.013279
19 역주 결정 트리와 랜덤 포레스트의 특성 중요도 계산 방법은 5장 6번 주석을 참고하세요.