LightGBM


LightGBM은 XGBoost와 함께 부스팅 계열 알고리즘에서 가장 각광을 받고 있다. XGBoost의 경우 매우 뛰어난 부스팅 알고리즘이지만 여전히 학습 시간이 오래 걸린다는 단점이 있다.

 

XGBoost에서 GridSearchCV로 하이퍼 파라미터 튜닝을 수행하다 보면 수행 시간이 너무 오래걸려서 많은 파라미터를 튜닝하기에 어려움을 겪을 수 밖에 없다. 물론 GBM보다는 빠르지만, 대용량 데이터의 경우 만족할 만한 학습 성능을 기대하려면 많은 CPU 코어를 가진 시스템에서 높은 병렬도로 학습을 진행해야 한다.

 

LightGBM의 가장 큰 장점은 XGBoost보다 학습에 걸리는 시간이 훨씬 적고 메모리 사용량도 상대적으로 적다. 'Light'라는 이미지가 가벼움을 뜻하게되어 상대적으로 떨어진다든가 기능상의 부족함이 있다고 인식될 수 있으나 실상은 그렇지 않다.

 

LighGBM과 XGBoost의 예측 성능은 별다른 차이가 존재하지 않는다. 또한 기능상의 다양성은 LightGBM이 약간 더 많다. XGBoost가 만들어진 2년 후에 LightGBM이 만들어졌기에 XGBoost의 장점은 계승하고 단점은 보완하는 방식으로 개발되었기 때문이다.

 

그럼에도 불구하고 LightGBM의 한 가지 단점으로는 적은 데이터 셋에 적용할 경우 과적합이 발생하기 쉽다는 것이다. 적은 데이터 셋의 기준은 일반적으로 10,000건 이하의 데이터 셋이라 LightGBM 공식 문서에서 기술하고 있다.

 

LightGBM은 일반 GBM 계열의 트리 분할 방법과 달리 리프 중심 트리 분할(Leaf Wise) 방식을 사용한다. 기존의 대부분 트리 기반 알고리즘은 트리의 깊이를 효과적으로 줄이기 위한 균형 트리 분할(Level Wise) 방식을 사용한다.

즉, 최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 깊이가 최소화될 수 있다. 반대로 균형을 맞추기 위한 시간이 필요하다는 상대적 단점이 있다. 

 

LightGBM의 리프 중심 트리 분할 방식은 트리의 균형을 맞추지 않고, 최대 손실 값(max delta loss)을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성된다. 하지만 이렇게 최대 손실값을 가지는 리프 노드를 지속적으로 분할해 생성된 규칙 트리는 학습을 반복할수록 결국은 균형 트리 분할 방식보다 예측 오류 손실을 최소화 할 수 있다는 것이 LightGBM의 구현 사상이다.

 

 

LightGBM 하이퍼 파라미터


LightGBM의 하이퍼파라미터의 경우 XGBoost와 달리 리프 노드가 계속 분할되면서 트리의 깊이가 깊어지므로 이러한 트리 특성에 맞는 하이퍼 파라미터 설정이 필요하다. 예를들면 max_depth를 매우 크게 가지는 것이 있다.

 

- learning_rate를 작게하면서 n_estimators를 크게 하는 것은 부스팅 계열 튜닝에서 가장 기본적인 튜닝 방안

- n_estimators를 너무 크게 하는 것은 과적합으로 오히려 성능 저하가 될 수 있음

- 과적합을 제어하기 위해 reg_lambda, reg_alpha와 같은 regularization을 적용하거나 학습 데이터에 사용할 피처의 개수나 데이터 샘플링 레코드 개수를 줄이기 위해 colsample_bytree, subsample 파라미터를 적용할 수 있음

 

※ 주의 : LightGBM이 버전업 되면서 boost_from_average 파라미터의 디폴트 값이 False에서 True로 변경됨. 레이블 값이 극도로 불균형한 분포를 이루는 경우 boost_from_average=True 설정은 재현률 및 ROC-AUC 성능을 매우 크게 저하시킨다. LightGBM 2.1.0 이상의 버전이 설치되어 있거나 불균형한 데이터 셋에서 예측 성능이 매우 저조할 경우 LightGBMClassifer 객체 생성 시 boost_from_average=False로 파라미터 설정해야함.

 

Reference


[1] 파이썬 머신러닝 완벽가이드

+ Recent posts