머신러닝

랜덤포레스트( Random Forest )

ROSEV 2021. 8. 10. 09:59

랜덤 포레스트

  • 앙상블 방법 중 하나로, 한 종류의 데이터로 학습 모델을 여러개 생성하여 예측 결과를 최빈 혹은 평균으로 예측하는 방법을 말합니다. 랜덤 포레스트는 학습 모델 중 결정트리를 기본으로 하는 방법입니다.
  • 학습 모델은 독립적으로 구성됩니다.

 

 

부트스트랩(Boostrap) 샘플링

  • 앙상블을 방법론 적으로 살펴보면, 모델을 여러개 만들어 합치는 것입니다. 이 때 모델을 여러개 만들기 위해 원본 데이터에서 여러개의 데이터 셋트를 복원 추출하여 학습을 진행하는데 이 때 복원 추출하여 만들어지는 데이터 세트를 부트스트랩세트라고 하며 이 과정을 부트스트랩 샘플링이라 합니다.
  • 이 과정에서, 속성도 랜덤으로 선택되어 결정트리가 만들어지며 결정트리 하나당 원천 데이터의 속성 N개에서 중복 허용 없이 루트N개가 선택됩니다.

출처 : 텐서플로우 블로그

Out-of-Bag Error

부트스트랩을 할 때 복원 추출을 진행하기 때문에, 한번도 샘플로 나오지 않는 데이터도 존재합니다. 이러한 데이터로 모델을 통한 예측값과 실제값(한번도 나오지 않은 데이터)의 차이가 OOB Error이라고 합니다.

 

 

배깅 (Bagging, Bootstrap Aggregating)

  • 부트스트랩세트로 만들어진 학습 모델을 합치는 과정을 Aggregating이라고 합니다.
  • 이때 회귀의 경우 평균으로, 분류의 경우 최빈 값으로 예측합니다.

 

 

순서형 인코딩 방법 및 주의사항

  • 기존의 원핫인코딩의 경우 ['사과', '딸기', '포도', '배']이러한 범주 데이터가 있다면 0과 1로 나누어 표시했지만, 순서형의 경우 1,2,3,4로 나타냅니다.
  • 하지만 순서형의 경우 순위가 있을 때 사용하는 것이 좋기 때문에 해당 사례와는 맞지 않으며 식당의 평점과 같은 분명히 순위가 있는 경우에 사용하는 것이 좋습니다.

 

랜덤포레스트가 결정트리 모델에 비해 상대적으로 과적합을 피할 수 있는 이유

  • 랜덤 포레스트의 방법론적인 측면에서 확인할 수 있습니다. 랜덤 포레스트는 앙상블 모델로 여러개의 결정트리를 만들어 회귀라면 평균으로 결과를 예측하기 때문에 특정 모델은 과적합 되어있고, 특정 모델은 과적합이 안되어 있고
  • 이러한 많은 모델을 결합(배깅)하여 평균내기 때문에 기존 결정트리에 비해 상대적으로 오버피팅을 피할 수 있게 됩니다.
  • 또한, 결정트리의 경우 모든 속성을 고려하지만 랜덤 포레스트는 일부의 속성만 랜덤으로 선택하여 학습 모델들을 만들기 때문에 상대적으로 과적합이 될 확률이 낮은 것입니다.

랜덤포레스트 with Python

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

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


pipe.fit(X_train, y_train)
print('훈련 정확도: ', pipe.score(X_train, y_train))