머신러닝
앙상블 기법과 속성 중요도 ( Feature Importances )
ROSEV
2021. 8. 17. 22:39
앙상블
앙상블은 말그대로, 여러 가지를 하나로 조화하는 것을 뜻합니다. 그래서 이러한 개념을 머신러닝 모델 구축에 활용하여, 여러 모델을 만든 후 모델을 합쳐 성능을 보완하는 방법론을 말합니다.
앙상블 방법론 - 배깅(Bagging)

- Bagging은 말그대로 Bootstrap Aggregation의 약자로 부트스트랩 셋을 여러개 단위로 뽑아, 학습하여 모델을 구축합니다.
- 그래서 각 각 나온 결과 값을 집계, 혹은 결합하여 최종 결과 값을 구합니다.
- 이때 범주형 데이터의 경우 최빈 값(Voting)방식으로 결과를 구하며, 연속형 데이터의 경우 평균으로 집계합니다.
- 이러한 배깅 방법을 사용하는 모델이 랜덤포레스트(Randomforest)기법입니다.
앙상블 방법론 - 부스팅

- 부스팅은 가중치(Weight)를 활용하여 약분류기를 강분류기로 만드는 방법입니다.
- 즉, 그림과 같이 약분류기에서 잘못 분류 했었던 데이터에 가중치를 주어, 크기를 키우고 잘 분류되었던 데이터는 가중치로 크기를 줄여 오차를 보완하여 모델을 구축합니다.
- 오분류 된 객체에 높은 가중치를 주어 보다 잘 분류 되도록 하는 것이 포인트입니다.
- 위의 설명은 AdaBoost(Adaptive Boost)를 설명한 경우이며, 그래디언트 부스팅의 경우 비용함수를 가중치 대신 잔차를 학습니다.
그래디언트 부스팅( Gradient Boost )
- 회귀와 분류 문제에 모두 사용가능합니다, Ada와는 달리, 비용함수에 잔차를 사용하여 계산합니다.
- 종류로는 Xgboost, LightGBM 등이 있습니다.
- XGboost는, 그래디언부스팅은 바탕으로, 병렬적으로 계산하며 과적합을 피하고 GBM보다 빠르며 Early Stop을 제공합니다.
- LighGBM
- Catboost
AdaBoost
- AdaBoost도 회귀, 분류 둘다 가능합니다.
- 노이즈가 많은 데이터와 이상점(outlier)에 취약한 모습을 보인다
AdaBoost와 Gradient Boost의 차이
배깅과 부스팅의 차이

- 배깅은 병렬로 학습하지만, 부스팅의 경우 순서대로 학습합니다. 또한 하나의 모델이 구축된 뒤 성능에 따라 가중치를 부여합니다.
- 부스팅은 배깅에 비해 성능이 좋지만, 속도가 느리고 과적합 가능성이 높습니다.
- 그래서 과적합이 되는 경우 배깅을 사용하며, 우려되지 않는다면 부스팅을 사용합니다.
3가지의 특성 중요도

1. 특성 중요도(Mean decrease impurity, MDI)
- 중요도는 지니불순도(Gini impurity)를 가지고 계산하며, 노드가 중요할 수록 불순도가 크게 감소하는 것을 활용합니다
- 즉, 불순도를 크게 감소하는데 많이 사용된 특성이 중요도가 높게 나타납니다.
- 회귀의 경우는 MSE(Mean Squared Error) 등을 이용해서 분산을 감소시키는 방향으로 노드가 생성되며 이 과정에서
- 분산을 가장 크게 감소 시키는 변수가 중요도가 가장 크게 나타납니다.
- 단점으로는, 연속형 변수와 High-cardinality 범주형 변수에 대해 bias
2. Drop-Column Importance
- 모든 변수를 사용했을 때의 성능과 특정 변수를 빼고 학습한 모델의 성능과 비교하여 나타난 차이를 변수 중요도로 정의합니다
- 해당 변수를 제거 했을 때 성능이 크게 변한다면 중요한 변수라고 할 수 있습니다
- 하지만 변수의 개수만큼 모델을 재학습 해야하므로, 효율적이지 못하다는 단점이 있습니다.

3. 순열중요도, (Permutation Importance, Mean Decrease Accuracy, MDA)
- 중요도 측정은 관심있는 특성에만 노이즈를 주고 예측을 하였을 때 성능 평가지표(Accuracy, F1, R^2)
- OOB Samples를 검증셋트로 사용하여 성능(Accuracy, R-square, MSE 등) 계산합니다.
- 각 모델의 특정 속성의 데이터를 무작위로 섞은 후 학습된 성능을 계산하여 저장합니다
- 그래서 모든 모델을 성능과, 모든 모델에서의 각 속성의 데이터를 무작위로 섞은 모델과의 차이를 구하고 이 차이를 속성별로 평균내어 순열 중요도를 결정합니다.
특성중요도 with Python
from sklearn.ensemble import RandomForestClassifier
# 속성 중요도
RandomForestClassifier().feature_importances
#Drop-Column Importance
#특정 속성 단순히 제거하고 성능 확인하고, 포함하고 성능 확인
# 순열중요도
import eli5
from eli5.sklearn import PermutationImportance
permuter = PermutationImportance(
RandomForestClassifier() # 모델
scoring='accuracy', # 평가지표
n_iter=3, # 다른 random seed를 사용하여 3번 반복
random_state=42
)