본문 바로가기

머신러닝

[Machine Learning] Tree-Based ML - 2. Ensemble Method (Random Forests)

Ensemble Method
한종류의 데이터로, 다수결의 원칙으로 반복하여 여러개의 결정트리(머신러닝 학습모델(weak base learner, 기본모델))를 만들고. 각 결정 트리 하나마다 예측값을 확인하고 이들중 최빈값(분류)또는 평균값(회귀)을 최종 예측값으로 정한다. 이렇게 의견을 통합 하거나, 여러가지 결과를 합치는 방식. (a.k.a 집단지성)

부트스트랩(Bootstrap) 샘플링

앙상블에 사용하는 작은 모델들은 부트스트래핑(bootstraping)이라는 샘플링과정으로 얻은 부트스트랩세트를 사용해 학습을 합니다. 즉 원본 데이터에서 샘플링을 하는데 복원추출(중복추출가능)을 한다는 것인데 복원추출은 샘플을 뽑아 값을 기록하고 제자리에 돌려놓는 것을 말함. 이렇듯  샘플링을 특정한 수 만큼 반복하면 하나의 부트스트랩세트가 완성된다.

  • 결정트리들은 독립적으로 만들어지며 각각 랜덤으로 예측하는 성능보다 좋을 경우 랜덤포레스트는 결정트리보다 성능이 좋다. 
  • 데이터가 충분히 크다고 가정했을 때 한 부트스트랩세트 표본의 63.2% 에 해당하는 샘플을 가진다.
  • Out-Of-Bag 샘플: 여기서 추출되지 않는 36.8%의 샘플,  이것을 사용해 모델을 검증한다.

 

배깅(Bagging, Bootstrap Aggregating)

기본모델(weak learner, 작은 모델들)을 합치는 과정; 부트스트랩세트로 만들어진 기본모델들을 합치는 과정을 Aggregation 이라고 한다.

- 회귀문제일 경우 기본모델 결과들의 평균으로 결과를 내고, 분류문제일 경우 다수결로 가장 많은 모델들이 선택한 범주로 예측.

 

Random Forests

Random Forests Model은 Decision Tree에서 시작(랜덤포레스트는 결정트리를 기본모델로 사용하는 앙상블 방법)

- 회귀와 분류에 있어서 랜덤 포레스트는 현재 가장 널리 사용되는 머신러닝 알고리즘이다.
- Decision Tree에서는 부정확성이라는 예측학습을 위한 이상적인 도구가 되지 못하는 단점이 있는데 이는 또 새로운 Sample분류에서 유연하지가 않다. 이를 개선한것이 Random Forests Model

- 단순한 Decision tree에서 유연한 결과를 주어 정확성을 크게 높혔다. (트리 앙상블 모델이 결정트리모델보다 상대적으로 과적합을 피할 수 있는 이유: 결정트리는 데이터 일부에 과적합하는 경향이 있습니다. 그래서 다르게 샘플링된 데이터로 과적합된 트리를 많이 만들고 그 결과를 평균내 사용하는 모델이 랜덤 포레스트)

- Overfitting이 문제되는 Decision Tree의 단점을 개선

랜덤포레스트에서는 특성 n개 중 일부분 k개의 특성을 선택(sampling) 하고 이 k개에서 최적의 특성을 찾아내어 분할합니다. 이때 k개는 일반적으로 log2n을 사용합니다.

- 중요 매개변수는 n_estimators, max_features이고 max_depth 같은 사전 가지치기 옵션이 있다

- n_estimators는 클수록 좋다. 더 많은 트리를 평군하면 과대 적합을 줄여 안정적인 모델을 만둘 수 있다. (메모리와 훈련시간은 증가한다.)

-랜덤 포레스트는 텍스트 데이터와 같이 매우 차원이 놓고 희소한 데이터에는 잘 작동하지 않는다.

Random Forest Classifier - Python

1. 라이브러리 불러오기

%time
from category_encoders import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import SimpleImputer 
from sklearn.pipeline import make_pipeline

2. 파이프라인으로 인코더,임퓨터,모델 넣기

pipe = make_pipeline(
    OneHotEncoder(use_cat_names=True), 
    SimpleImputer(), 
    RandomForestClassifier(n_jobs=-1, random_state=10, oob_score=True))

3.  train data 학습 시키고 validation score 확인

pipe.fit(X_train, y_train)
print('검증 정확도: ', pipe.score(X_val, y_val))

검증 정확도: 0.8265923378009726

CPU times: user 10 s, sys: 494 ms, total: 10.5 s

Wall time: 2.96 s

 

4. OOB score 확인

pipe.named_steps['randomforestclassifier'].oob_score_

0.8188180173768644

 

5. 특성 중요도 확인

import matplotlib.pyplot as plt

# 특성 중요도(onehot)
rf = pipe.named_steps['randomforestclassifier']
colnames = pipe.named_steps['onehotencoder'].get_feature_names()
importances = pd.Series(rf.feature_importances_, colnames)

n = 10
plt.figure(figsize=(10,n/4))
plt.title(f'Top {n} features with onehotencoder')
importances.sort_values()[-n:].plot.barh();


# 특성 중요도(ordinal)
rf_ord = pipe_ord.named_steps['randomforestclassifier']
importances_ord = pd.Series(rf_ord.feature_importances_, X_train.columns)

plt.figure(figsize=(10,n/4))
plt.title(f'Top {n} features with ordinalencoder')
importances_ord.sort_values()[-n:].plot.barh();