본문 바로가기
카테고리 없음

머신러닝(ML) - 분류(부스팅) [2]

by XXkwn_1 2021. 1. 28.

이번시간에는 캐글 상위권 커널에서 매우 자주 등장하는 부스팅에 대하여 알아보도록 하겠습니다.

* 파이썬 머신러닝 완벽가이드 참조

 

부스팅 알고리즘은 여러 개의 약한 학습기(weak learner)를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식입니다. 부스팅의 대표적인 구현은 AdaBoost와 Gradient Boosting Machine이 있습니다.

AdaBoost

조금 더 설명을 덧붙이자면 개별 약한 학습기는 다음 그림과 같이 각각 가중치를 부여해 결합합니다. 예를 들어 첫 번째 학습기에 가중치 0.3, 두 번째 학습기에 가중치 0.5, 세 번째 학습기에 가중치 0.8을 부여한 후 모두 결합해 예측을 수행합니다.

 

GBM(Gradient Boosting Machine)

GBM은 에이다부스트와 유사하지만 가중치 업데이트를 할때 경사 하강법을 이용하는 것이 큰 차이입니다.

경사하강법에 대해 알아보도록 하겠습니다.

 

경사하강법(Gradient Descent)

해당 함수의 최소값 위치를 찾기 위해 비용 함수(Cost Function)의 Gradient반대 방향으로 정의한 Step size를 이용하여 조금씩 이동해가며 최적의 파라미터를 찾는 방법입니다.

오류 값은 실제 값 - 예측값입니다. 분류의 실제 결괏값을 y, 피처를 x1, x2,···· ,xn 그리고 이 피처에 기반한 예측 함수를 F(x)함수라고 하면 오류식 h(x)=y-F(x)가 됩니다. 이 오류식을 최소화하는 방향성을 가지고 반복적으로 가중치 값을업데이트하는 것이 경사 하강법이 되겠습니다.

 

경사하강법의 종류는 Batch Gradient Descent, Stochastic Gradient Descent(SGD), Mini Batch Gradient Descent(Mini batch SGD)등 여러가지가 있습니다. 경사하강법에 조금 더 알아보고 싶으신 분들은 한번 찾아보시면 좋을 것 같습니다.

 

GBM 파라미터

n_estimators, max_depth, max_features등 트리 기반 자체의 파라미터는 생략하고 나머지 부분에 대해 알아보도록 하겠습니다.

 

loss : 경사 하강법에서 사용할 비용 함수 지정.

 

learning_rate : GBM이 학습을 진행할 때마다 적용하는 학습률입니다. Weak learner가 순차적으로 오류 값을 보정해 나가는 데 적용하는 계수입니다. 디폴트는 0.1로 너무 작은 값을 설정하게 되면 수행시간이 매우 오래 걸리고, 너무 큰 값을 설정하게 되면 최소 오류 값을 찾지 못하고 그냥 지나치게 됩니다.

 

n_estimators : weak learner의 개수입니다. weak learner가 순차적으로 오류를 보정하므로 개수가 많을수록 예측 성능이 일정 수준까지는 좋아질 수 있습니다. 하지만 개수가 많을수록 수행 시간이 오래 걸립니다. 기본값은 100입니다.

 

subsample : weak learner가 학습에 사용하는 데이터의 샘플링비율입니다. 기본값은 1이며, 이는 전체 학습 데이터를 기반으로 학습한다는 의미입니다.(0.5이면 학습 데이터의 50%). 과적합이 염려되는 경우 subsample을 1보다 작은 값으로 설정합니다.

XGBoost

XGBoost는 GBM에 기반하는 모델로 GBM의 단점들을 개선한 모델이 되겠습니다. 마찬가지로 XGBoost도 트리 기반의 앙상블 학습입니다. 현재 캐글 경연 대회에서 상위를 차지한 많은 데이터 사이언스들이 XGBoost를 이용하면서 널리 알려졌습니다. 압도적인 수치의 차이는 아니지만, 분류에 있어서 일반적으로 다른 머신러닝보다 뛰어난 예측 성능을 나타냅니다. GBM은 느린 수행 시간 및 과적합 규제에 대한 부재등의 문제를 안고있지만 XGBoost가 이러한 문제들을 해결하면서 매우 각광 받고 있습니다. 또한 XGBoost는 병렬CPU 환경에서 병렬 학습이 가능해 기존 GBM보다 빠르게 학습을 완료할 수 있습니다.

부스팅에 학습 방법입니다. 3개의 모델이 있을 때, m1에는 x에서 샘플된 데이터를 넣고 잘못 예측한 값들에 가중치를 반영해서 다음 모델인 m2에 넣습니다. 그리고 다시 잘못 예측한 값들중 가중치를 반영하여 m3에 넣는 방법을 사용합니다.

 

 

XGBoost의 각 파라미터와 주요 장점에 대해 알아보겠습니다.

 

LightGBM

LightGBM은 XGBoost와 함께 부스팅 알고리즘에서 각광받고 있습니다. XG부스트는 GBM보다는 빠른 학습 시간을 보이지만 여전히 학습 시간이 오래 걸립니다. XGBoost에서 GridSearchCV로 하이퍼 파라미터 튜닝을 수행하다 보면 수행 시간이 너무 오래 걸려서 많은 파라미터를 튜닝하기에 어려움을 겪을 수밖에 없습니다. 따라서 대용량 데이터의 경우 만족할 만한 학습 성능을 기대하려면 많은 CPU코어를 가진 시스템에서 높은 병렬도로 학습을 진행해야 하기 때문에 불편함이 커지게 됩니다.

 

따라서 이러한 단점을 극복해낸 LightGBM이 나오게 됩니다. XGBoost보다 학습에 걸리는 시간이 매우 적습니다. 또한 메모리 사용량도 상대적으로 적습니다. XG부스트와 성능 차이는 거의 없지만 XGBoost가 나오고 2년 후에 만들어진 모델이기 때문에 기능상의 다양성은 약간 더 많습니다. 

 

LightGBM을 사용할 때 주의점

적은 데이터 셋에 적용할 경우 과적합이 발생하기 쉽다는 것입니다. 여기서 적은 데이터 셋의 기준은 10,000건 이하의 Train set으로 공식 문서에서 기술하고 있습니다.

 

이러한 이유는 일반적인 GBM은 균형 트리분할을 사용하는 반면에 LightGBM은 리프 중심 트리 분할(Leaf Wise)방식을 사용하기 때문입니다. 

균형 트리 분할을 사용하는 XGBoost의 경우는 최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 깊이가 최소화 될 수 있습니다. 균형 트리 분할은 트리의 깊이가 깊어질수록 과적합이 발생한다는 생각에서 만들어졌습니다.

 

그에 반에 리프 중심 트리 분할은 트리의 균형을 맞추지 않고 최대 손실 값을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성됩니다. 하지만 이렇게 최대 손실값을 가지는 리프 노드를 지속적으로 분할해 생성된 규칙 트리는 학습을 반복할수록 결국은 균형 트리 분할 방식보다 예측 오류 손실을 최소화할 수 있다는 것이 LightGBM의 구현 사상입니다. 따라서 이러한 방법을 적용하기 때문에 적은 데이터 셋에서 과적합이 발생하는 이유가 되겠습니다.

 

LGBM의 XGBoost대비 장점은 다음과 같습니다.

  • 더 빠른 학습과 예측 수행 시간.
  • 더 작은 메모리 사용량.
  • 카테고리형 피처의 자동 변환과 최적 분할(원-핫 인코딩 등을 사용하지 않고도 카테고리형 피처를 최적으로 변환하고 이에 따른 노드 분할 수행.)

여기까지 지도학습의 분류(부스팅)에 대해 마치겠습니다. 

오개념이나 이해안가시는 부분에 대해서 댓글로 남겨주시면 감사하겠습니다.

댓글