배고픈 개발자 이야기
[2021/09/13] 머신러닝 알고리즘 - LGBM 본문
Light Gradient Boosting Machine (LGBM)
1. 왜 LGBM에 대해 관심을 갖게 되었을까요?
kaggle에서도 많은 인기를 끌고 있지만, 인포섹 아카데미 교육 중 진행하는 모듈 프로젝트에서 사용할 머신러닝 알고리즘 중 하나를 조사해보기로 하면서 알아보게 되었습니다.
저에게는 생소한 알고리즘으로 LGBM 관련글을 보고 이해한것을 토대로 작성하였습니다.
2. LGBM이란 무엇일까요?
LGBM은 다양한 머신러닝 알고리즘 모델 중 베이직한 Decision Tree를 기반으로 만들어 졌으며, Ranking(순위 지정) 또는 Classification(분류) 및 다른 머신러닝 학습에 사용되는 알고리즘입니다.
LGBM은 Performence(성능) 및 Scalability(확장성)을 목적으로 마이크로소프트사에서 개발되었습니다.
Decision Tree를 기반으로 만들어진 여러 머신러닝 Tree 모델 중 LGBM은 수평적으로 확장되는
다른 Tree 알고리즘과 달리 LGBM은 Tree가 수직적으로 확장됩니다.
아래와 같이 그림으로 보면서 이해해 보면
2.1 다른 Tree : 수평확장 (level-wise)
2.2 LGBM Tree : 수직확장 (leaf-wise)
확장하기 위해 max delta loss를 가진 leaf를 선택 (동일한 leaf 확장시 level-wise보다 손실을 줄일 수 있습니다.)
위와 같이 확장을 하게 된다면, 빠른속도로 학습을 하면서, 손실을 최소화 할 수 있기 때문에 높은 정확도를 나타낼 수 있을겁니다. 하지만 Overfitting(특정한 데이터에서만 높은 정확도를 나타냄)의 문제가 직관적으로 야기될 수 있어 보입니다.
3. 이 알고리즘은 어떤 이유로 많은 인기를 가지게 되엇을까요?
빅데이터 시대에 데이터는 많아지는 반면, 전통적인 머신러닝 알고리즘으로는 효율적인 분석을 하는데
어려움이 있습니다.
여기서 LGBM의 L은 Light로 "가볍다"라는 의미로 빠른 속도를 나타낸다는 장점이 있습니다.
또한, LGBM은 많은 데이터를 소화하면서도 요구하는 리소스(메모리등)의 자원이 적은 장점이 있습니다.
그리고, LGBM이 데이터분석에 요즘 인기가 많은 이유 중 하나는 결과의 정확도에 초점을 맞추기 때문입니다.
LGBM은 GPU학습도 지원합니다. (그래서 당연하지만 더 빠른 속도가 나오는 걸껍니다.)
4. 데이터 수가 적으면 LGBM보다 다른 알고리즘이 좋다.
LGBM은 10,000이하의 데이터 세트에 사용되는 것은 추천되지 않는다고 합니다.
그 이유로는 LGBM 알고리즘은 적은량의 데이터 학습에선 Overfitting(과적합)되기 쉽기 때문이라고
합니다.
Overfitting될 경우, 본래의 취지에 맞지 않게 특정 test, trainning 세트에서만 높은 정확도를
나타내고 다른 대부분의 데이터 세트에서는 매우 낮은 정확도를 나타내는 현상으로, 이 경우 다른 알고리즘을
사용해야 할것으로 보입니다.
5. LGBM 하이퍼파라미터 (튜닝)
LGBM은 100개 이상의 파라미터를 커버하고 있기 떄문에 파라미터 튜닝이 어렵다고 하는데
가장 기본적인 파라미터들을 잘 알고 넘어가면 어렵지 않다고 합니다.
5.1 더 빠른속도
- bagging_fraction
- max_bin은 작게
- save_binary를 쓰면 데이터 로딩속도가 빨라짐
- parallel learning 사용
5.2 더 높은 정확도
- max_bin을 크게
- num_iterations는 크게하고 learning_rate는 작게
- num_leaves를 크게(Overfitting의 원인이 될 수 있음)
- boosting 알고리즘 'dart' 사용
5.3 Overfitting 줄이기
- max_bin을 작게
- num_leaves를 작게
- min_data_in_leaf와 min_sum_hessian_in_leaf를 사용하기
파라미터 용어
- learning_rate : 일반적으로 0.01~0.1 고정 후 다른 파라미터를 튜닝하고 나중에 성능을 높일 때 줄인다.
- num_iterations : 기본값이 100인데 1000정도로 해주는게 좋다. 너무 크게하면 Overfitting이 발생할 수 있다.
- max_depth : -1로 설정하면 제한없이 분기한다. feature에 비례하게 설정
- boosting
부스팅방법 : 기본값은 gbdt이며 정확도가 중요할때는 드랍아웃과 같은 dart나 샘플링을 이용하는 goss를 사용한다.
- bagging_fraction : 배깅을 하기위해 데이터를 랜덤 샘플링하여 학습에 사용한다 0 < fraction <= 1 값 사용
- feature_fraction : feature_fraction이 1보다 작다면 LGBM은 매 iteration(tree)마다 다른 feature를 랜덤하게 추출하여 학습하게 된다. 만약, 0.8로 값을 설정하고 tree를 구성할 때, feature의 80%만 랜덤하게 선택한다. Overfitting을 방지하기 위해 설정할 수 있으며, 학습속도가 향상된다.
- scale_pos_weight : 클래스 불균형의 데이터 셋에서 weight를 주는 방식으로 positive를 증가 시킨다. 기본값은 1이며,
불균형 정도에 따라 조절합니다.
- early_stopping_round : Validation 셋에서 평가지표가 더 이상 향상되지 않으면 학습을 정지한다. 평가지표 향상이 n 라운드 이상 향상되지 않으면 학습을 정지한다.
- lambda_l1, lambda_l2 : 정규화를 통해 Overfitting을 방지할 수 있지만, 정확도를 저하시킬수도 있기 때문에, 일반적으로 default값인 0으로 둔다.
사용방법
참고
- https://en.wikipedia.org/wiki/LightGBM
- https://greatjoy.tistory.com/72
- https://nurilee.com/2020/04/03/lightgbm-definition-parameter-tuning/
'인포섹 아카데미' 카테고리의 다른 글
[2021/09/14] 머신러닝 알고리즘 (0) | 2021.09.14 |
---|---|
[2021/09/06] DNN_CNN (선형회귀 분석) (0) | 2021.09.06 |
[2021/08/31] 파이썬 머신러닝 (시계열 분석_지수이동평균) (0) | 2021.08.31 |
[2021/08/30] 파이썬 머신러닝 (시계열 분석_이동평균) (0) | 2021.08.30 |
[2021/08/27] 파이썬 머신러닝 (XGBoost 유방암 분류) (1) | 2021.08.27 |