반응형

앙상블 학습(Ensemble Learning)

머신러닝을 공부하다 보면 앙상블, XGBoost, LightGBMBoost 등이 성능이 좋다고 하는 말을 종종 들을 수 있다. 그러나 초보자 입장에서는 용어가 낯설고 캐글에 공유된 커널들을 보더라도 쉽게 이해할 수 없는 매개변수들이 많다. 따라서 오늘은 앙상블 학습에 대해서 정리하고 관련 알고리즘들을 알아보고자 한다.

깃허브: https://github.com/PSLeon24/LearnAI/blob/main/Machine%20Learning/ML_Ensemble_Models.ipynb

학습 교재: 혼자 공부하는 머신러닝+딥러닝(박해선), p.263~283

 

앙상블 학습

앙상블 학습은 한 가지 모델이 아니라 여러 개의 모델을 훈련시키고 각 모델의 예측을 취합하여 최종 결과를 만들어 더 좋은 예측 결과를 만들어내는 학습 방식이다. 이러한 앙상블 학습 방식은 정형 데이터에 아주 뛰어난 성능을 보이며, 유명한 앙상블 학습 방법으로는 랜덤 포레스트, 엑스트라 트리, 그레이디언트 부스팅, 히스토그램 기반 그레이디언트 부스팅 등이 있다.

 

랜덤 포레스트(Random Forest)

랜덤 포레스트는 앙상블 학습 알고리즘 중 대표적인 알고리즘이다. 가장 먼저 앙상블 학습을 시도한다면 랜덤 포레스트부터 진행해보는 것을 추천한다. 랜덤 포레스트는 결정 트리를 훈련하기 위해 중복을 허용하여 데이터를 샘플링하는 방식으로 샘플링하여 분류한 데이터들인 부트스트랩 샘플을 만들고 전체 특성(all features) 중에서 일부를 랜덤하게 선택하여 결정 트리를 만든다.

 

랜덤 포레스트의 경우 사이킷런 패키지의 클래스를 활용하면 쉽게 사용할 수 있다.

랜덤 포레스트 회귀 클래스: from sklearn.ensemble import RandomForestRegressor

랜덤 포레스트 분류 클래스: from sklearn.ensemble import RandomForestClassifier

 

매개변수 정리

  • n_estimators(default: 100): 앙상블을 구성할 트리의 개수
  • criterion(default: 'gini'): 불순도를 지정, 지니 불순도='gini', 엔트로피 불순도='entropy'
  • max_depth(default: None): 트리가 성장할 최대 깊이
  • min_samples_split(default: 2): 노드를 나누기 위한 최소 샘플 개수
  • max_features(default: auto=특성 개수의 제곱근): 최적의 분할을 위해 탐색할 특성의 개수
  • bootstrap(default: True): 부트스트랩의 사용 여부
  • oob_score(default: False): OOB(out of bag, 부트스트랩 샘플에 포함되지 않고 남는 샘플) 샘플을 사용하여 훈련한 모델을 평가할지 여부
  • n_jobs(default: 1): 병렬 실행에 사용할 CPU 코어 수를 지정, -1로 지정하면 시스템에 있는 모든 코어를 사용

* 부트스트랩 샘플을 다시 한번 정리하면, 중복을 허용해서 데이터를 샘플링하여 분류한 데이터들인데, 예를 들어 바구니에 1,000개의 샘플이 있을 때 먼저 1개를 뽑고, 그 샘플을 제외하고 다시 뽑는 것이 아니라 그 샘플을 바구니에 넣어서 다시 샘플을 뽑는 방식이 바로 부트스트랩 방식이다.

 

엑스트라 트리(Extra Trees)

엑스트라 트리역시 랜덤 포레스트와 매우 흡사하지만 부트스트랩 샘플을 사용하지 않고 노드를 분할할 때 최선이 아니라 랜덤하게 분할한다는 차이가 있다. 훈련 속도가 빠르지만 더 많은 트리가 필요하다.

 

엑스트라 트리 또한 사이킷런 패키지의 클래스를 활용하면 쉽게 사용할 수 있다.

엑스트라 트리 회귀 클래스: from sklearn.ensemble import ExtraTreesRegressor

엑스트라 트리 분류 클래스: from sklearn.ensemble import ExtraTreesClassifier

 

매개변수는 랜덤 포레스트와 동일하다. 다만 bootstrap의 경우 default가 False라는 점이 다르다.

 

그레이디언트 부스팅(Gradient Boosting)

그레이디언트 부스팅은 깊이가 얕은 트리를 연속적으로 추가하여 손실 함수(loss function, cost function)를 최소화하는 앙상블 방법이다. 성능은 뛰어나지만 앞의 두 방법보다 훈련 속도가 조금 느리다. 그레이디언트 부스팅은 학습률(learning late) 매개변수를 조정하여 모델의 복잡도를 제어할 수 있는데, 이 값이 크면 복잡하고 훈련 세트에 과적합된 모델을 얻을 수 있다.

 

그레이디언트 부스팅 회귀 클래스: from sklearn.ensemble import GradientBoostingRegressor

그레이디언트 부스팅 분류 클래스: from sklearn.ensemble import GradientBoostingClassifier

 

매개변수 정리

  • loss(default: 'deviance'): 손실 함수
  • learning_rate(default: 0.1): 트리가 앙상블에 기여하는 정도
  • n_estimators(default: 100): 부스팅 단계를 수행하는 트리의 개수
  • subsample(default: 1.0): 사용할 훈련 세트의 샘플 비율
  • max_depth(default: 3): 개별 회귀 트리의 최대 깊이

 

히스토그램 기반 그레이디언트 부스팅(Histogram-based Gradient Boosting)

히스토그램 기반 그레이디언트 부스팅은 가장 뛰어난 앙상블 학습 방법으로 평가받는 알고리즘이다. 이 방법은 그레이디언트 부스팅의 속도를 개선하였는데, 훈련 데이터를 256개의 구간으로 변환하여 사용하므로 노드 분할 속도가 매우 빠르다. 히스토그램 기반 그레이디언트 부스팅의 유명한 라이브러리가 바로 XGBoost와 LightGBM이다.

 

히스토그램 기반 그레이디언트 부스팅 회귀 클래스: from sklearn.ensemble import HistGradientBoostingRegressor

히스토그램 기반 그레이디언트 부스팅 분류 클래스: from sklearn.ensemble import HistGradientBoostingClassifier

위 클래스를 사용하기 위해서는 먼저 from sklearn.experimental import enable_hist_gradient_boosting 을 작성하여 임포트해야 한다.

 

매개변수 정리

  • learning_rate(default: 0.1): 학습률 또는 감쇠율이라고 하며, 기본값은 0.1이다. 만약, 1.0이라면 감쇠가 전혀 없는 것이다.
  • max_iter(default: 100): 부스팅 단계를 수행하는 트리의 개수
  • max_bins(default: 255): 입력 데이터를 나눌 구간의 개수(기본값보다 크게 지정할 수 없음)

 

XGBoost는 https://xgboost.ai/ 에서 자세히 살펴볼 수 있다.

 

XGBoost

Multiple Languages Supports multiple languages including C++, Python, R, Java, Scala, Julia. Distributed on Cloud Supports distributed training on multiple machines, including AWS, GCE, Azure, and Yarn clusters. Can be integrated with Flink, Spark and othe

xgboost.ai

 

또한 LightGBM은 마이크로소프트에서 만든 라이브러리로써 https://github.com/microsoft/LightGBM 에서 자세히 살펴볼 수 있다.

 

GitHub - microsoft/LightGBM: A fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework ba

A fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning ...

github.com