## 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
댓글