일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- MySQL
- random forest
- pandas
- Machine Learning
- 경사하강법
- feature scaling
- deep learning
- 주피터 노트북 테마
- 나는리뷰어다2021
- 주피터노트북 커널 추가
- regression
- deeplearning
- 데이터분석
- 주피터노트북
- GitHub
- Git
- Udacity
- 주피터노트북 커널 제거
- overfitting
- 주피터노트북 커널 목록
- 주피터테마
- 회귀분석
- 한빛미디어
- Python
- jupytertheme
- lol api
- 딥러닝
- Linear Regression
- 모두를 위한 딥러닝
- ubuntu
- Today
- Total
유승훈
LightGBM? 본문
데이콘 심리성향 예측 경진대회에 참가하던 중 LightGBM을 사용해보고자 관련 문서를 찾아봤는데, 관련 문서를 공부하는 겸해서 번역, 정리해두고자 합니다.
LightGBM?
LightGBM이란 Tree Based Gradient Boosting 알고리즘입니다. 다른 Tree Based 알고리즘들은 Tree를 수평으로 확장시키는 반면, LightGBM은 Tree를 수직으로 확장시킵니다.
Leaf-wise라 함은, Tree가 확장될 때 최대 손실값을 가지는 잎을 선택합니다. 같은 잎을 확장시킨다고 할 때, Level-wise보다 Leaf-wise 알고리즘이 손실을 더 줄일 수 있습니다.
그렇다면 LightGBM은 왜 유명한가?
데이터의 크기는 계속해서 커지고 있고, 기존의 알고리즘들로는 계속해서 커지고 있는 데이터로 빠르게 결과를 도출해 내는것이 쉽지 않습니다. LightGBM은 그 이름에서 볼 수 있듯 빠른 속도를 자랑합니다. 큰 데이터를 낮은 메모리를 사용해서 돌릴 수 있다는 장점이 있습니다. 다른 이유로는 결과의 정확도에 있습니다. 더불에 GPU를 사용한 학습도 가능하기 때문에 널리 쓰이는 알고리즘입니다.
그렇다고 해서 단점이 없는 것은 아닙니다. 우선 LightGBM은 Overfitting에 민감하고, 작은 데이터에 Overfit
되기가 쉽습니다. 따로 정해진 규격은 없으나, 참고한 글의 필자는 10,000개 이상의 Row를 갖는 데이터에서만 이 알고리즘을 사용할 것을 권장하고 있습니다.
LightGBM에 데이터를 넣고 돌리는 것 자체는 별로 어렵지 않습니다. 진짜는 Parameter Tuning입니다. 100개도 넘는 파라미터가 있지만, 다 알 필요는 없고, 주요 파라미터들만 알면 어렵지 않게 이 Powerful한 알고리즘으로 좋은 결과를 낼 수 있습니다.
LightGBM의 파라미터들
- Control Parameters
max_depth : Tree의 최대 깊이를 의미한다. 이 파라미터는 Overfitting 문제를 해결할 때 조정한다. 언제든 모델이 Overfit 되었다고 판단했다면, 먼저 max_depth의 값을 감소시킬 것을 조언한다.
min_data_in_leaf : 각 Leaf에 남길 데이터의 record 수이다. 기본값은 20이고, 이 Parameter 또한 Overfitting 문제를 해결할 때 조정한다.
feature_fraction : Boosting 방식이 Random Forest일 때 사용한다. 값이 0.8이라면 알고리즘이 각 Tree를 만드는 과정을 반복할 때 마다 80%의 Parameter를 랜덤으로 선택해 사용한다.
bagging_fraction : 각 반복마다 사용할 데이터 조각의 비율이다. 모델이 학습하는 속도를 증가시킴과 동시에 Overfitting을 방지하고자 할 때 사용한다.
early_stopping_round : 과정 자체의 속도를 향상시킬 때 사용한다. validation data의 score가 적어도 어느정도의 값 이상의 향상을 보이지 않으면 학습을 중단한다. 이는 알고리즘이 과도하게 Tree를 만드는 과정을 반복하는 것을 줄여준다.
lambda : 정규화를 의미한다. 0과 1 사이의 값을 사용한다.
min_gain_to_split : Tree를 분할하면서 성장시킬 때 확보해야할 최소한의 정보량을 의미한다. Tree가 얼마나 유용하게 분리될 것인지를 설정하는 값이라고 볼 수 있다.
max_cat_group : 카테고리의 종류가 너무 많으면, 분할하는 것이 Overfitting 문제를 야기할 수 있다. 따라서 LightGBM은 카테고리를 max_cat_group로 합친다. 그리고 그 그룹안에서 Split Point를 찾는다.
- Control Parameters
Task : 데이터로 수행하고자 하는 작업이다. 보통은 train이나 predict.
application : 모델이 예측하는 Y의 형태이다. 기본적으로 LightGBM은 모델을 Regression(회귀)모델로 인식하고, Binary(이진 분류), Multiclass(다중 분류)도 입력할 수 있다.
boosting : 실행하고자 하는 알고리즘의 형태를 정의한다. 기본값은 기본적은 Gradient Boosting Decision Tree인 gdbt
- gbdt: traditional Gradient Boosting Decision Tree
- rf: random forest
- dart: Dropouts meet Multiple Additive Regression Trees
- goss: Gradient-based One-Side Sampling
num_boost_round : Boosting을 반복할 횟수. 보통 100+
learning_rate : 각 Tree가 최종결과에 미치는 영향을 조정한다. Gradient Boosting Model은 각 Tree의 결과에서 업데이트 된 값을 시작점으로 사용한다. 이 파라미터는 업데이트 된 값의 변화의 규모를 조정한다.
num_leaves : Tree가 가지는 최소한의 Leaf값. Default는 31.
device : 모델을 돌리는데 어떤 장비를 사용하는가. CPU 혹은 GPU
- Metrci Parameter
metric : 중요한 파라미터 중 하나. 모델을 만들 때 활용하는 loss를 의미한다. 어떤 문제를 푸는가에 따라 다른 metric을 사용하는데, 일반적으로 사용하는 것은
- mae: mean absolute error
- mse: mean squared error
- binary_logloss: loss for binary classification
- multi_logloss: loss for multi classification
목적에 따른 Parameter Tuning
속도향상
- bagging_fraction과 bagging_freq를 설정해서 bagging을 수행한다.
- feature_fraction을 설정해서 Data의 변수를 sampling하는 방법을 선택한다.
- max_bin 값을 작게 설정한다.
- save_binary를 사용해서 앞으로의 학습에서 데이터를 읽어오는 속도를 빠르게 한다.
- 병렬처리.
정확도 향상
- 큰 max_bin 값을 사용한다. (학습속도가 느려질 수 있음
- 큰 num_leaves값을 사용한다. (Overfitting 문제를 야기할 수 있음)
- 더 큰 Train Data를 사용한다.
- Boosting 방식을 dart로 한다.
Overfitting 문제 해결하기
- 작은 max_bin, num_leaves 값.
- min_data_in_leaf, min_sum_hessian_in_leaf 파라미터 활용.
- bagging_fraction과 bagging_freq 파라미터로 bagging 수행.
- feature_fraction을 설정해서 Data의 변수를 sampling하는 방법을 선택한다.
- 더 큰 Train data를 사용한다.
- 정규화를 위해 lambda_l2 and min_gain_to_split을 사용한다.
- Tree가 너무 깊게 성장하지 않도록 max_depth를 조정한다.
- extra_tree parameter를 사용한다.
LightGBM in Python
공식문서의 python api를 보면, lightgbm에서 데이터를 정의하고 train 하는 파트와 sklearn-api 파트가 따로 정의되어 있는 것을 볼 수 있습니다. 처음에는 lightgbm이 독자적인 패키지로 만들어졌으나, 편의를 위해 sklearn api가 추가되었습니다.
LGBMClassifier외에도 LGBMRegressor, LGBMRanker, LGBMModel 함수로 모델을 정의하고, 정의할때 파라미터를 넣어줄 수 있지만 파라미터를 따로 정리한 뒤에 넣어줄수도 있습니다.
모델에 feature_importances_로 feature importance가 저장됩니다.
Tree-Based 모델이기 때문에 내장된 plot_importance로 feature importance를 plotting 할 수 있습니다. 다른거 필요없이 함수에 모델만 넣어주면 됩니다.
sklearn.metrics의 함수들을 통해 분류 결과를 검증할수도 있습니다. 특별한 전처리 없이 돌린 모델이기 떄문에 예측 성능이 그리 좋지는 않습니다.
'Machine Learning' 카테고리의 다른 글
AdaBoost (0) | 2020.12.06 |
---|---|
Random Forest (0) | 2020.11.30 |