본문 바로가기

Study doc./Machine Learning

[ML] LightGBM 이해하고 사용하자

순서

  1. 개념
  2. 기본 구조
  3. 파라미터

 


1. 개념

* 이 글을 읽기 전에 앙상블 포스팅과 XGBoost 포스팅을 읽고 오시는 것을 추천드립니다.

 

XGBoost와 LightGBM은 결정트리(Decision Tree) 알고리즘 기반의 대표적 부스팅 앙상블 기법입니다.

간단하게 설명드리자면 트리의 오차(loss)를 점점 수정해나가는 방법으로 성능을 향상시키는 아이디어 인데요,

최근 캐글과 데이콘의 상위권 커널들에서 주로 사용되어 유명세를 타고 있습니다!!

 

그렇다면 지난번에 공부한 XGBoost와 LightGBM은 어떤 차이가 있을까요?

우선 LightGBM은 XGBoost의 시간적 한계를 보완한 알고리즘이라고 기억하시면 될 것 같습니다.

 

어떻게 시간적 한계를 보완했을까요?

바로 노드의 분할 방법에 차이를 두었습니다.

일반 GBM(Gradient Boosting Methods) 계열의 트리는 '균형 트리 분할(level-wise)' 방식을 사용합니다.

아래 그림을 보면 아시겠지만 트리의 깊이가 균형을 이룹니다.

 

하지만 LightGBM의 경우에는 최대 손실값을 가지는 노드를 중심으로 계속해서 분할하는 '리프 중심 트리 분할(leaf-wise)' 방식을 사용합니다.

따라서 트리가 깊어지기위해 소요되는 시간과 메모리를 많이 절약할 수 있었던 것입니다.

 

https://datascience.stackexchange.com/questions/26699/decision-trees-leaf-wise-best-first-and-level-wise-tree-traverse

 

 

LightGBM은 무적인가요?

아닙니다. LightGBM이 가지는 문제로는 적은 데이터에 대한 과적합(overfitting)이 발생하기 쉽다는 점인데요, 

공식 문서에서는 '적다' 라는 기준을 약 10,000 건 이하로 보고 있습니다.

즉 10,000 건 이하의 데이터에서는 조심해야하는데, 사실 저희는 교차검증 이라는 좋은 방법을 알고 있습니다!!

 

그리고 데이터 양이 많더라도, 여유가 된다면 XGBoost 도 함께 사용하여 성능을 비교해보는것을 추천드립니다.

언제까지나 시간적 문제를 해결한 것이지, 성능을 개선한건 아니니깐요!!

상황에 따라 XGBoost 성능이 더 좋을때도 있답니다.

 

 

2. 기본 구조

XGBoost와 마찬가지로 파이썬 래퍼 모듈과 사이킷런 래퍼 모듈이 있지만, 

사이킷런과 호환이 되는 모듈을 두고 굳이 다른 것을 사용할 필요가 없기 때문에 사이킷런 래퍼 모듈에 대해서만 정리해보도록 하겠습니다.

from lightgbm import LGBMClassifier

# 객체 생성
model = LGBMClassifier(파라미터들)
lgb_model = model.fit(x_train, y_train, early_stopping_rounds=100, 
                        eval_metric='logloss',eval_set=[(X_val, y_val)])

# 예측하기
y_pre = lgb_model.predict(X_test)
y_pred_probs = lgb_model.predict_proba(X_test)[:,1]

# 특성 중요도 시각화
fig, ax = plt.subplots(figsize=(10,12))
plot_importance(lgb_model, ax=ax)

 

3. 파라미터

대부분의 파라미터는 XGBoost와 동일하기 때문에 해당 포스팅을 참고해주시고, 오늘은 다른 점에 대해서만 정리해보겠습니다.

 

▶ boosting 

    - rf (random forest)

    - gbdt (gradient boos decision tree)

    - dart (dropout regression tree)

    - goss (gradient based one-side sampling)

 

▶ min_child_samples [default = 20] : 리프 노드가 되기 위한 최소한으로 필요한 레코드 수/ 큰값 과적합 방지

 

▶ num_leaves [default = 31] : 하나의 트리가 가질 수 있는 최대 리프 개수  

 

* max_depth : 다른 트리들과는 다르게 leaf wise 방식이기 때문에 깊이가 상대적으로 더 깊음