본문 바로가기
Machine Learning/XGBoost

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

by 찐남 2022. 2. 6.

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

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

 

R에서 XGBoost 알고리즘을 사용한 분류예측모델 적합 예시

Overview R의 강력한 기계 학습 알고리즘인 xgboost를 사용하는 방법 알아보기 예시 데이터의 사용과 xgboost 기계 학습 모델을 구축함으로서, R에서 xgboost의 응용 프로그램 확인하기 Introduction XGB

zzinnam.tistory.com


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

 

사용할 데이터는 lightgbm(with) 예시에서
사용했던 것과 동일한 것으로 하고,
그 결과를 서로 비교해 볼게요.

 

이진분류모델 예측 기초 예제 실습(with R)

Introduction LightGBM 알고리즘 활용(Ke et al. 2017) # LightGBM 알고리즘 활용을 위해 패키지 lightgbm 설치 install.packages('lightgbm') # lightgbm 패키지 로드 library(lightgbm) 본 예제는 기본 사용법에..

zzinnam.tistory.com

 


사용할 데이터입니다.

bank.csv
0.38MB


그럼 단계별로 하나씩 진행해 보겠습니다!!

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

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

## 데이터 핸들링을 위한 패키지 ( 설명은 여기를 참고)
import pandas as pd 

## 수치 연산에 필요한 패키지 (설명은 여기를 참고)
import numpy as np
 
## xgboost 알고리즘을 적용하기 위한 패키지
import xgboost as xgb 

## 난수 발생을 위한 패키지
import random 

## 수학 함수를 사용하기 위한 패키지
import math 

## xgboost feature importance 표현을 위해 필요한 모듈
from xgboost import plot_importance 

## 그래프 표현을 위해 필요한 패키지
import matplotlib.pyplot as plt 

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

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

## 명령 프롬프트 창에서 아래 명령문을 입력
pip install (패키지명)
# 예) xgboost를 설치하고자 한다면, pip install xgboost

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

 

 

Step 1) 데이터 준비 및 데이터 탐색


패키지 준비가 끝났으면
데이터를 파이썬으로 읽어 들입니다.

 ## 데이터 준비
dataSet = pd.read_csv("D:/bank.csv")  

 

그럼, 파이썬에 dataSet이라고 하는
데이터 프레임이 생성되었습니다.
우선적으로 몇 개의 observation과 column으로

이루어져 있는지를 파악해야 합니다.
shape 매소드를 이용하면 됩니다.

dataSet.shape

데이터를 살펴보니,
4,521개의 observation과
18개의 column으로 이루어져 있네요.

그다음 확인해야 할 부분은 아래 2가지입니다.
1. column의 type
2. missing여부

xgboost 알고리즘을 활용하기 위해서는 모든 데이터가
숫자형으로 이루어져 있어야 하기 때문에,
범주형(문자형) column의 경우에는
더미 변수를 변환해 주어야 합니다.
그리고, 특정 column의 missing 비율이 높으면
해당 column은 모형 적합에 제외해야 합니다.
이를 한 번에 확인할 수 있는 함수는 info()입니다.

## 데이터 파악하기
dataSet.info()

Non-Null Count 칼럼을 보면,
모든 column의 값에 null이 없어서,
missing data는 별도로 진행할 필요가 없네요.
(4521 non-null: null이 없는 observation의 건수가 4,521개)

자! 그다음은 변수형입니다.
int로 시작하는 column은
숫자형으로 별도 처리가 필요하지 않지만,
object로 표시되어 있는 column들은
범주형(문자형) 변수이기 때문에
더미 변수로 변환해 주어야 합니다.
더미변수로 변환하기 위해서는
pandas 패키지의 get_dummise 함수를
사용하면 됩니다.
참고로, y column은 label data
(종속변수, 타겟변수라고도 함)이기 때문에
더미 변환을 하지 않아요.

## 범주형 변수에 대한 더미 변수 생성
finalDataSet = pd.get_dummies(dataSet, columns = ['job','marital','education','default','housing','loan','contact',
                                                                     'month','poutcome'])

## 더미 변수 변환 전 column 리스트 확인
dataSet.columns

## 더미변수 변환 후 column 리스트 확인

더미변수 변환 전/후를 비교해 보면,
column이 다소 증가한 것으로 확인할 수 있어요.
이는 범주형(문자형) 변수의 category 개수만큼
증가했기 때문이에요.
변환 전 'marital'이라는 column은
결혼 상태를 나타내는 변수인데요.
가질 수 있는 category가 3개
('divorced(이혼)' , 'married(결혼)', 'single(결혼 전)')이기 때문에
3개로 증가하였습니다.

만약, id가 1인 사람이 결혼 전이라고 한다면,
marital_divorced = 0, marital_married = 0, marital_single = 1의
값을 가지게 됩니다.

이제 label data(종속변수, 타겟변수라고도 함)인 y도
범주형(문자형)이기 때문에 숫자로 변환이 필요해요.
해당 값이 어떻게 들어가 있는지 확인해 보면,

dataSet['y'].value_counts()  

'no', 'yes'의 값을 가지고 있는 것을 확인할 수 있어요.
'no' 은 1로 변환하고,
'yes'는 0으로 변환해서
target이라는 칼럼을 만들고,
y는 지우도록 하겠습니다.

finalDataSet['target'] = np.where(finalDataSet['y'] == 'no', 0,1)
del finalDataSet['y']

 

 

Step2) Train 및 Validation Set 분할

이제 본격적으로 알고리즘 적용을 위해 데이터를
train 및 validation으로 분할하겠습니다.
자동적으로 분할해 주는 패키지와 함수들이 있지만,
저는 원시적이지만 근본적인 방법으로 분할할게요.
방법은 난수를 발생시켜,
데이터를 섞은 다음에 데이터를 5:5로
(train 50% 및 validation 50%) 분할하겠습니다.

## train 및 validation set를 구분하기 위한 난수 생성
sample = list(range(len(finalDataSet))) # 데이터 observation에 해당하는 정수를 생성하여 리스트로 저장
random.shuffle(sample) # 리스트를 마구잡이로(랜덤 하게) 섞음

## train 및 validation set 50 : 50으로 분할
trainFinalDataSet = finalDataSet.iloc[sample,].head(len(finalDataSet)//2)
# 섞인 데이터의 상위 50% 를 train으로 지정

valFinalDataSet = finalDataSet.iloc[sample,].tail(math.ceil(len(finalDataSet)/2))
# 섞인 데이터의 하위 50% 를 validation으로 지정

 

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

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

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


## xgboost 주요 하이퍼 파라미터 설정하기 
## 하이퍼 파라미터는 매우 중요하기 때문에, 별도 포스팅으로 설명
## 연습 삼아 그냥 세팅하고 실행
param = {
    'max_depth': 3,  
    'eta': 0.1,      
    'sub_sample' : 0.5,
    'colsample_bytree' : 0.5,
    'objective': 'binary:logistic',  
    'eval_metric' : 'auc',
    'numclass' : 1
    }  
num_round = 10  

## train set는 'train', validation set는 'eval'로 설정
wlist = [(dtrain, 'train'), (dtest, 'val')]

## xgboost 알고리즘을 활용한 학습 수행
bst = xgb.train(params = param, dtrain = dtrain, num_boost_round = num_round, evals = wlist)

학습을 10번 수행하도록 세팅했기 때문에

(num_boost_round = 10)
10번 반복된 결과에 대한 측정지표의 변화를 보여줍니다.

 

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

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

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

## train 및 validation set에 확률값 생성
trainFinalDataSet['dtrainPred'] = bst.predict(dtrain)
valFinalDataSet['dtestPred'] = bst.predict(dtest)

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

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

확률 값을 기반으로 하여 산출된 모형의 성능 지표 KS통계량의 결과를 보면,
train set 0.6521이고, validation set 0.6626으로
변동성이 거의 없음을 확인할 수 있습니다.

(※ 참고로, ks_stat은 제가 활용하기 위해서 만든 함수로 파이썬에서 별도로 제공하지 않는 함수입니다.)

 

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

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

## feature importance 산출하기
fig, ax = plt.subplots(figsize=(20, 24))
plot_importance(bst, ax=ax)

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

이외에도 교차 검증(Cross Validation),
최적 하이퍼 파라미터 산출 등 중요한 내용이 많습니다만,
이는 별도 포스팅으로 자세하게 작성하도록 하겠습니다.

이번 포스팅에서는
기본적인 이진 분류 모델 적용 프로세스를
익히는 것에 중점을 두었습니다.
이상 포스팅을 마치도록 하겠습니다!

 

 

반응형

댓글