LightGBM 이란? 그리고 Parameter 튜닝하기

LightGBM에 관한 좋은 medium 포스트가 있어서 한글로 번역한 내용을 공유드려봅니다 🙂 

Pushkar Mandot의 원문 바로가기:

View at Medium.com

안녕하세요, 머신러닝은 이 세상에서 가장 빠르게 성장하는 분야입니다. 매일 새로운 알고리즘들이 출시되고, 그 중 몇 개는 실패하고 몇 개는 성공합니다. 오늘, 저는 그 중에서도 가장 성공적인 알고리즘 중 하나인, Light GBM을 소개하려고 합니다.

무엇이 저로 하여금 LightGBM에 대한 블로그를 작성하도록 동기부여했을까요?

Kaggle 데이터 분석 경진대회에서 작업할 동안, 저는 여러 개의 강력한 알고리즘들을 접하게 되었습니다. LightGBM은 그 중 하나였죠. LightGBM은 상대적으로 새로운 알고리즘이었고, 인터넷에 공식 문서를 제외하고는 읽기 자료가 많이 없었습니다. 그래서 다큐먼트 상의 길게 나열된 파라미터들로부터 초보자가 파라미터를 선택하는 것은 어려웠죠. 신규 입문자분들을 돕기 위해 저는 이 블로그 글을 쓰게 되었습니다.

수백 개의 불필요한 정보를 추가하는 것은 배우는 입장에서 혼란스러울 수 있기 때문에 이 블로그 글을 간결하게 작성하기 위해 최선을 다하겠습니다.

Light GBM은 무엇일까요?

Light GBM은 Gradient Boosting 프레워크로 Tree 기반 학습 알고리즘입니다.

기존의 다른 Tree 기반 알고리즘과 어떻게 다를까요?

Light GBM은 Tree가 수직적으로 확장되는 반면에 다른 알고리즘은 Tree가 수평적으로 확장됩니다, 즉 Light GBM은 leaf-wise 인 반면 다른 알고리즘은 level-wise 입니다. 확장하기 위해서 max delta loss를 가진 leaf를 선택하게 되는 것이죠. 동일한 leaf를 확장할 때, leaf-wise 알고리즘은 level-wise 알고리즘보다 더 많은 loss, 손실을 줄일 수 있습니다.

아래 다이어그램은 LightGBM와 다른 Boosting 부스팅 알고리즘의 구현을 나타내고 있습니다.

Light GBM 작동 방식
다른 Boosting 알고리즘 작동 방식

Light GBM은 어떤 이유로 엄청난 인기를 얻게 되었을까요?

데이터 사이즈는 날이 갈수록 커지고 있고 전통적인 데이터 분석 알고리즘으로 빠른 결과를 얻기란 더욱 어려워졌습니다. Light GBM은 말 그대로 “Light” 가벼운 것인데요, 왜냐면 속도가 빠르기 때문입니다. Light GBM은 큰 사이즈의 데이터를 다룰 수 있고 실행시킬 때 적은 메모리를 차지합니다. Light GBM이 인기있는 또 다른 이유는 바로 결과의 정확도에 초점을 맞추기 때문입니다. LGBM은 또한 GPU 학습을 지원하기 때문에 데이터 사이언티스트가 데이터 분석 어플리케이션을 개발할 때 LGBM을 폭넓게 사용하고 있습니다.

Light GBM은 어디서나 사용할 수 있을까요?

아닙니다. LGBM을 작은 데이터 세트에 사용하는 것은 추천되지 않습니다. Light GBM은 overfitting (과적합)에 민감하고 작은 데이터에 대해서 과적합하기 쉽습니다. row (행) 수에 대한 제한은 없지만 제 경험상 10,000 이상의 row (행) 을 가진 데이터에 사용하는 것을 권유해드립니다.

Light GBM에 대한 컨셉에 대해 대략적으로 논의해보았는데요, 구현은 어떻게 하면 될까요?

Light GBM 구현은 쉽습니다. 다만 한 가지 복잡한 것은 파라미터 튜닝입니다. Light GBM은 100개 이상의 파라미터를 커버하고 있기 때문입니다. 그러나 걱정 마세요 모든 것을 배워야하는 것은 아닙니다.

Light GBM의 가장 베이직한 파라미터를 아는 것이 구현 시 매우 중요합니다. 아래 소개되는 파라미터들을 주의깊게 따라가다보면, 이토록 강력한 알고리즘이 여러분께 매우 쉬운 영역이라는 것을 말씀드립니다.

이제 파라미터에 대한 논의로 넘어가보도록 하겠습니다.

Parameters 

파라미터 소개

max_depth : Tree의 최대 깊이를 말합니다. 이 파라미터는 모델 과적합을 다룰 때 사용됩니다. 만약 여러분의 모델이 과적합된 것 같다고 느끼신다면 제 조언은 max_depth 값을 줄이라는 것입니다.

min_data_in_leaf : Leaf가 가지고 있는 최소한의 레코드 수입니다. 디폴트값은 20으로 최적 값입니다. 과적합을 해결할 때 사용되는 파라미터입니다.

feature_fraction : Boosting (나중에 다뤄질 것입니다) 이 랜덤 포레스트일 경우 사용합니다. 0.8 feature_fraction의 의미는 Light GBM이 Tree를 만들 때 매번 각각의 iteration 반복에서 파라미터 중에서 80%를 랜덤하게 선택하는 것을 의미합니다.

bagging_fraction : 매번 iteration을 돌 때 사용되는 데이터의 일부를 선택하는데 트레이닝 속도를 높이고 과적합을 방지할 때 주로 사용됩니다.

early_stopping_round : 이 파라미터는 분석 속도를 높이는데 도움이 됩니다. 모델은 만약 어떤 validation 데이터 중 하나의 지표가 지난 early_stopping_round 라운드에서 향상되지 않았다면 학습을 중단합니다. 이는 지나친 iteration을 줄이는데 도움이 됩니다.

lambda : lambda 값은 regularization 정규화를 합니다. 일반적인 값의 범위는 0 에서 1 사이입니다.

min_gain_to_split : 이 파라미터는 분기하기 위해 필요한 최소한의 gain을 의미합니다. Tree에서 유용한 분기의 수를 컨트롤하는데 사용됩니다.

max_cat_group : 카테고리 수가 클 때, 과적합을 방지하는 분기 포인트를 찾습니다. 그래서 Light GBM 알고리즘이 카테고리 그룹을 max_cat_group 그룹으로 합치고 그룹 경계선에서 분기 포인트를 찾습니다. 디폴트 값은 64 입니다.

Core Parameters

핵심 파라미터 소개

Task : 데이터에 대해서 수행하고자 하는 임무를 구체화합니다. train 트레이닝일 수도 있고 predict 예측일 수도 있습니다.

application : 가장 중요한 파라미터로, 모델의 어플리케이션을 정하는데 이것이 regression 회귀분석 문제인지 또는 classification 분류 문제인지를 정합니다. Light GBM에서 디폴트는 regression 회귀분석 모델입니다.

  • regression: 회귀분석
  • binary: 이진 분류
  • multiclass: 다중 분류

boosting : 실행하고자 하는 알고리즘 타입을 정의합니다. 디폴트값은 gdbt 입니다.

  • gdbt : 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 iteration 수로 일반적으로 100 이상입니다.

learning_rate : 최종 결과에 대한 각각의 Tree에 영향을 미치는 변수입니다. GBM은 초기의 추정값에서 시작하여 각각의Tree 결과를 사용하여 추정값을 업데이트 합니다. 학습 파라미터는 이러한 추정에서 발생하는 변화의 크기를 컨트롤합니다. 일반적인 값은 0.1, 0.001, 0.003 등등이 있습니다.

num_leaves : 전체 Tree의 leave 수 이고, 디폴트값은 31입니다.

device : 디폴트 값은 cpu 인데 gpu로 변경할 수도 있습니다.

Metric parameter

지표 파라미터

metric : 모델을 구현할 때 손실을 정하기 때문에 중요한 변수 중에 하나입니다. regression과 classification 을 위한 일반적인 손실 값이 아래에 나와있습니다.

  • mae : mean absolute error
  • mse : mean squared error
  • binary_logloss : loss for binary classification
  • multi_logloss : loss for multi classification
IO parameter

IO 파라미터

max_bin : feature 값의 최대 bin 수를 의미합니다.

categorical_feature : 범주형 feature의 인덱스를 의미합니다. 만약 categorical_features 가 0, 1, 2 이면 column 0, column 1, column 2 가 범주형 변수들입니다.

ignore_column : categorical_features와 동일한 것인데 범주형 feature로써 특정 칼럼을 고려하지 않는 것입니다. 그 변수들을 무시하는 것입니다.

save_binary : 데이터 파일의 메모리 사이즈를 처리해야 한다면 이 파라미터 값을 True로 설정하십시오. 이 값을 True로 세팅하면 데이터 세트를 바이너리 파일로 저장할 것이고, 이 바이너리 파일은 다음에 데이터를 읽어올 때 그 속도를 줄여줄 것입니다.

위에 설명드린 파라미터들을 알고 사용하는 것은 모델을 구현할 때 도움이 될 것입니다. LightGBM 모델 구현은 쉽지만 파라미터 튜닝은 어렵다는 것을 앞서 말씀드렸습니다. 이제 구현을 시작해보도록 하겠습니다. 제가 파라미터 튜닝에 대한 아이디어를 그 과정에서 드리도록 하겠습니다.

모델 구현

LGBM 설치하기 :

LightGBM을 설치하는 것은 중요한 작업입니다. 저는 LightGBM 설치에 대한 좋은 리소스를 찾아냈고 가이드를 드리도록 하겠습니다.

저는 Anaconda를 사용하고 있고 LightGBM을 아나콘다에 설치하는 것은 가능합니다. 단지 Anaconda 명령 프롬프트 창에서 다음의 명령어를 실행시켜주시면 됩니다.

conda install -c conda-forge lightgbm

데이터 세트:

이 데이터는 400개의 행과 5개의 칼럼으로 구성된 매우 작은 데이터입니다. (학습 목적으로 특별히 사용되는 것입니다.) classification 분류 문제로, 웹사이트 광고에 나온 제품을 살지를 예측하는 문제입니다. 데이터 세트는 여기서 다운로드가 가능합니다.

Note: 이 데이터 세트는 깨끗하고 결측치가 없습니다. 매우 단순한 데이터를 고른 이유는 튜토리얼이 단순하고 이해가 쉽도록 하기 위해서입니다.

저는 이 설명을 읽는 분들이 Python의 기본을 안다고 가정하겠습니다. 데이터 전처리 스텝을 쉽게 따라가실 수 있지만 만약 코멘트란에 물어보고 싶은 것이 있으시다면 답변을 드리도록 하겠습니다.

데이터 전처리 :

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset = pd.read_csv('...input\Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values
y = dataset.iloc[:, 4].values
# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)

모델 빌드 및 트레이닝 :

트레이닝 데이터를 LightGBM에 맞는 데이터 세트 포맷으로 변환해야합니다. (LightGBM 트레이닝에 있어서 필수적입니다.)

변환된 데이터 세트 생성 이후에, 파라미터와 그 값으로 구성된 Python Dictionary 파이썬 딕셔너리를 생성했습니다. 모델의 정확도는 설정된 파라미터 값에 전적으로 달려 있습니다.

import lightgbm as lgb
d_train = lgb.Dataset(x_train, label=y_train)
params = {}
params['learning_rate'] = 0.003
params['boosting_type'] = 'gbdt'
params['objective'] = 'binary'
params['metric'] = 'binary_logloss'
params['sub_feature'] = 0.5
params['num_leaves'] = 10
params['min_data'] = 50
params['max_depth'] = 10
clf = lgb.train(params, d_train, 100)

파라미터에서 봐야할 일부 요소들 :

  • “binary” 가 objective 로 사용됨 (이것이 classification 분류 문제라는 것을 기억해주십시오)
  • “binary_logloss”가 metric 으로 사용됨 (마찬가지 이유로, binary classification 문제라는 것을 기억해주십시오)
  • num_leaves 는 10 (왜냐면 작은 데이터이기 때문입니다)
  • boosting type 은 gbdt 인데, gradient boosting 을 구현하고 있기 때문입니다. (random forest 를 시도하실 수 있습니다.)

모델 예측 :

예측을 위한 몇 줄의 코드를 작성해야합니다.

결과는 확률 리스트일 것입니다. 저는 확률을 binary prediction으로 변환했고 threshold 값은 0.5로 유지했습니다.

#Prediction
y_pred=clf.predict(x_test)
#convert into binary values
for i in range(0,99):
    if y_pred[i]>=.5:       # setting threshold to .5
       y_pred[i]=1
    else:  
       y_pred[i]=0


결과 :

confusion matrix 나 또는 바로 accuracy를 계산해서 결과를 확인할 수 있습니다.

Code :

#Confusion matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
#Accuracy
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y_pred,y_test)

결과 스크린샷 :

Confusion Matrix
Accuracy 정확도 점수

어떤 분들은 데이터 세트가 작았는데 모델 정확도가 92%나 되었다고 생각하실 수도 있겠습니다. 과적합은 왜 발생하지 않았을까요? 가장 단순한 이유는 모델 파라미터를 튜닝했기 때문입니다.

이제 파라미터 튜닝 문제로 넘어가도록 하겠습니다.

파라미터 튜닝 :

데이터 사이언티스트는 언제나 어떤 파라미터를 언제 사용할지 그리고 어떤 값이 최적의 파라미터 값일지 결정하기 위해 고민합니다.

아래 소개되는 기법들은 모델 정확도를 향상시키기 위해 사용될 수 있습니다.

  1. num_leaves : Tree 모델의 복잡성을 컨트롤하는 주요 파라미터입니다. 이상적으로 num_leaves 값은 2 ^ (max_depth) 값보다 적거나 같아야 합니다. 이것보다 많은 값은 과적합을 유발할 것입니다.
  2. min_data_in_leaf : 큰 값으로 세팅하는 것은 Tree가 너무 깊게 확장되는 것을 막을 수 있지만 under-fitting 언더 피팅이 발생할 수도 있습니다. 관행적으로, 수백 또는 수천 개로 정하는 것이 큰 데이터 세트에 충분합니다.
  3. max_depth : Tree 깊이를 명확하게 제한하기 위해 max_depth 값을 설정할 수도 있습니다.

더 빠른 속도를 위하여 :

  • bagging_fractionbaggin_freq 을 설정하여 bagging 을 적용하십시오
  • feature_fraction을 설정하여 feature sub-sampling을 하십시오
  • 작은 max_bin 값을 사용하십시오
  • save_binary 를 값을 통해 다가오는 학습에서 데이터 로딩 속도를 줄이십시오
  • parallel learning 병렬 학습을 적용하십시오

더 나은 정확도를 위해 :

  • max_bin 값을 사용하십시오 (아마 속도는 느려질 수 있습니다)
  • 작은 learning_rate 값을 큰 num_iterations 값과 함께 사용하십시오
  • num_leaves 값을 사용하십시오 (아마 과적합을 유발할 수도 있습니다)
  • 더 큰 트레이닝 데이터를 사용하십시오
  • dart 를 사용하십시오
  • 범주형 feature를 사용하십시오

과적합을 해결하기 위해 :

  • 작은 max_bin 값을 사용하십시오
  • 작은 num_leaves 값을 사용하십시오
  • min_data_in_leafmin_sum_hessian_in_leaf 파라미터를 사용하십시오
  • bagging_fractionbagging_freq 을 사용하여 bagging 을 적용하십시오
  • feature_fraction을 세팅하여 feature sub-sampling을 하십시오
  • lambda_l1, lambda_l2 그리고 min_gain_to_split 파라미터를 이용해 regularization (정규화) 를 적용하십시오
  • max_depth 를 설정해 Deep Tree 가 만들어지는 것을 방지하십시오

결론 :

저는 다양한 데이터 세트에서 LightGBM 을 구현해보았고 다른 부스팅 알고리즘보다 정확도가 좋다는 것을 발견하였습니다. 제 경험상, 이 알고리즘을 적어도 한 번은 시도해보는 것을 추천드립니다.

이 블로그를 읽는 것이 도움이 되었으면 좋겠습니다. 이 블로그를 발전시키기 위한 제안을 주시면 감사하겠습니다.

출처 : Microsoft LightGBM Documentation

감사합니다,

Pushkar Mandot

7 thoughts on “LightGBM 이란? 그리고 Parameter 튜닝하기”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s