본문 바로가기
Machine Learning/LightGBM

lightgbm 알고리즘을 사용한 이진분류예측모델 적합(with 파이썬)

by 찐남 2022. 2. 12.

lightgbm은 GBM계열의 알고리즘으로
기계학습 알고리즘 중 XGBoost와 함께 가장 많이 사용되는
알고리즘 중의 하나예요.

알고리즘에 대한 자세한 설명은
아래 포스팅을 참고하시면 됩니다.

 

LightGBM 개요

LightGBM은 트리 기반 학습 알고리즘을 사용하는 그래디언트 부스팅 프레임워크입니다. 다음과 같은 이점이 있는 효율적이고 잘 분산되도록 설계된 알고리즘입니다. 더 빠른 훈련 속도와 더 높은

zzinnam.tistory.com

 

 

본 포스팅에서는 파이썬에서 제공하는 lightgbm 알고리즘을 활용하여
간단한 이진 분류 예측모델 적합 예시를
보여드리도록 하겠습니다.

 

사용할 데이터는 XGBoost 알고리즘(해당 내용은 여기를 참조)을 설명했을 때와

동일한 데이터를 사용하고,

유사한 하이퍼 파라미터 조건으로 설정해서,

그 결과를 서로 비교해 보겠습니다.

 

사용할 데이터는 역시 R의 lightgbm 패키지에서 제공하는

bank 데이터입니다.

bank.csv
0.38MB

 

Step0) 실습에 필요한 패키지 준비

제가 사용한 패키지는 총 8개입니다.
뭐가 이렇게 많지 하시겠지만,
어렵고 이해하기 힘든 패키지는 하나도 없습니다.
걱정하지 마시고, 따라 해 보세요.

import pandas as pd 
import numpy as np
import lightgbm as lgb
import random 
import math 
import matplotlib.pyplot as plt 

## 최종 모형의 성능을 평가하기 위해 만든 사용자 정의 함수
## 제가 자체적으로 만든 함수여서 실행하면 에러 납니다.
## 아래 함수는 그냥 무시하에요^^
from md_validation import *

 

컴퓨터에 상기에 나열된 패키지가 없으신 분들은
아마 위의 문장을 입력하면 에러가 발생할 거예요.
위의 문장들은 패키지 로딩을 위한 명령어이고,
패키지 자체가 없으신 분들은
pc에 패키지를 먼저 설치하셔야 합니다.
설치 방법은 아래와 같아요.

 

## 명령 프롬프트 창에서 아래 명령문을 입력
pip install lightgbm

 

※ 파이썬에서 제공하는 lightgbm 알고리즘과 관련된 패키지는 크게 2가지가 있어요
(파이썬 래퍼와 싸이킷런 래퍼).
저는 파이썬 래퍼를 활용했습니다. 참고하세요.

 

그다음 Step 1) ~ Step2)는 아래 포스팅 글에 있는 방법과

모두 동일해요.

참고하셔서 그대로 따라 하시면 됩니다.

 

 

XGBoost 알고리즘을 사용한 이진분류예측모델 적합(with 파이썬)

XGBoost는 GBM계열의 알고리즘으로 기계학습 알고리즘 중 가장 많이 사용되는 알고리즘 중의 하나예요. 알고리즘에 대한 자세한 설명은 아래 포스팅을 참고하시면 됩니다. R에서 XGBoost 알고리즘을

zzinnam.tistory.com

 

 

Step 3) lightgbm 알고리즘 활용을 위한 환경 세팅

파이썬에서 제공하는
lightgbm 패키지를 사용하기 위해서는
그에 맞는 형태로 데이터를 변경해 주어야 합니다.
그런 다음, 하이퍼 파라미터를 정의한 후 알고리즘을 수행하면 됩니다.

## lightgbm 알고리즘 적용을 위한 train 및 validation 데이터 환경 설정
dtrain = lgb.Dataset(trainFinalDataSet.iloc[:,:-1], label=trainFinalDataSet.iloc[:,-1])
dtest = lgb.Dataset(valFinalDataSet.iloc[:,:-1], label=valFinalDataSet.iloc[:,-1])


## lightgbm 주요 하이퍼 파라미터 설정하기 
## 주요 하이퍼 파라미터에 대한 설명은 여기를 참고
## 연습 삼아 그냥 세팅하고 실행
param = {
    'learning_rate': 0.03,  
    'max_depth': 3,  
    'boosting': 'gbdt',   
    'objective': 'binary',  
    'metric': 'auc',   
    'num_leaves' : 5,
    'feature_fraction': 0.5, 
    'bagging_fraction': 0.5, 
    'num_class': 1
    }  
num_round = 10  


## lightgbm 알고리즘을 활용한 학습 수행
lgbmbst = lgb.train(params = param, train_set = dtrain, num_boost_round = num_round, valid_sets = dtest)

 

XGBoost와 동일하게 학습을 10번 수행하도록 세팅했기 때문에

(num_boost_round = 10)
10번 반복된 결과에 대한 검증 데이터의

측정지표의 변화를 보여줍니다.

 

Step 4) 확률 값 산출 및 모형 성능 확인

이제 위에서 산출된 모형을 활용해서

모든 observation에 대한 확률 값을 산출한 후에,
모형의 성능을 비교해 보겠습니다.

 

## train set에 대한 이벤트 발생 확률 값 산출
trainPred = lgbmbst.predict(trainFinalDataSet, predict_disable_shape_check = True)
valPred = lgbmbst.predict(valFinalDataSet, predict_disable_shape_check = True)

## train 및 validation data set에 저장 
trainFinalDataSet['dtrainPred'] = trainPred
valFinalDataSet['dtestPred'] = valPred


## train set에 대한 KS 통계량 산출하기 
## 사용자 정의 함수(저만 실행되고, 실행되지 않으실 거예요.)
## train set에 대한 KS 통계량 산출하기 
ks_stat(trainFinalDataSet['dtrainPred'], trainFinalDataSet['target']) 

## test set에 대한 KS 통계량 산출하기 
ks_stat(valFinalDataSet['dtestPred'], valFinalDataSet['target']) 

확률 값을 기반으로 하여 산출된 모형의 성능 지표 KS통계량의 결과를 보면,
train set 0.6214이고, validation set 0.5563으로
개발 데이터와 검증 데이터의 변별력에 대한 변동성이

다소 존재함을 알 수 있네요.

 

실제 업무를 진행하면서 두 개(XGBoos, lightgbm)의

알고리즘을 자주 사용하는데요.

속도는 lightgbm이 상대적으로 빠르지만, 

XGBoost보다 Overfitting이 좀 더 심하더라고요.

 

실제 적용을 위해서는 하이퍼 파라미터 튜닝이 많이 필요해 보입니다.

 

 

Step5) 모델에 사용된 feature의 중요도 산출

마지막으로 모형에 활용된 feature들의 중요도(feature importance)를 그림으로 표현해 보겠습니다.

## 변수 중요도 산출하기
fig, ax = plt.subplots(figsize=(20, 24))
plt.rc('font', size=20)        # 기본 폰트 크기
plt.rc('axes', labelsize=20)   # x, y축 label 폰트 크기
plt.rc('xtick', labelsize=20)  # x축 눈금 폰트 크기 
plt.rc('ytick', labelsize=20)  # y축 눈금 폰트 크기
plt.rc('legend', fontsize=20)  # 범례 폰트 크기
plt.rc('figure', titlesize=50) # figure title 폰트 크기
lgb.plot_importance(lgbmbst, ax=ax)

모형에서 가장 중요하게 작용한 상위 2개의 feature는
'duration'과 'pdays'임을 확인할 수 있습니다.

 

이는 XGboost와 동일한 결과이지만,

3번째부터는 feature importance가 달라집니다.

이번 포스팅에서는

lightgbm에 대한 매우 간단한 이진 분류 예측 모형 적합을 해봤습니다.

그 결과를 XGBoost와 비교해 보는 것에 중점을 두었습니다.
이상 포스팅을 마치도록 하겠습니다!

 

다음에는 좀 더 깊은 내용으로

찾아뵙겠습니다!!!

 

 

반응형

댓글