[실전 머신러닝] XGBoost:커플 성사 여부 예측하기 ➌

부스팅 모델 중 가장 유명한 XGBoos를 활용하여 커플 성사를 예측하고, 그리드 서치(Grid Search)로 하이퍼파라미터를 튜닝하여 더 나은 모델을 만드는 방법을 학습합니다.

총 4편으로 연재됩니다. 3편은 모델링 및 평가, 경사하강법 이해하기 입니다.

 

모델링 및 평가

모델링에 사용할 훈련셋과 시험셋을 분리해주겠습니다.

 

from sklearn.model_selection import train_test_split # 임포트
X_train, X_test, y_train, y_test = train_test_split(data.drop('match',axis=1), data['match'], test_size=0.2, random_state=100) # 훈련셋/시험셋 분리

 

그리고 XGBoost를 xgb라는 이름으로 임포트합니다.

 

import xgboost as xgb # 임포트

 

XGBoost는 크게 3가지 학습 방법을 제공합니다. 랜덤 포레스트와 마찬가지로 분류와 회귀의 fit( ) 함수를 제공하고, 추가로 train( ) 함수도 제공합니다(train( ) 함수는 11장 ‘LightGBM : 이상거래 예측하기’에서 다룹니다). 이 장에서는 분류 함수를 사용하여 모델링합니다.

 

model = xgb.XGBClassifier(n_estimators = 500, max_depth = 5, random_state=100) # 모델 객체 생성

 

총 3가지 하이퍼파라미터(n_estimators, max_depth, random_state)에 임의의 값을 설정했습니다. XGBoost 모델 객체인 model을 사용하여 기존과 같은 방법으로 훈련과 예측을 차례대로 수행하면 됩니다.

 

model.fit(X_train, y_train) # 훈련

XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
              colsample_bynode=1, colsample_bytree=1, enable_categorical=False,
              gamma=0, gpu_id=-1, importance_type=None,
              interaction_constraints='', learning_rate=0.300000012,
              max_delta_step=0, max_depth=5, min_child_weight=1, missing=nan,
              monotone_constraints='()', n_estimators=500, n_jobs=4,
              num_parallel_tree=1, predictor='auto', random_state=100,
              reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1,
              tree_method='exact', validate_parameters=1, verbosity=None)

 

학습에 사용된 하이퍼파라미터 정보를 보여줍니다. 임의로 설정한 3개 이외에는 모두 기본값으로 반영됩니다. 학습된 모델을 통해 예측을 하고 정확도를 확인해봅시다.

 

pred = model.predict(X_test) # 예측
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report accuracy_score(y_test, pred) # 정확도

0.8616236162361623

 

약 86% 정도의 정확도가 나왔습니다. 수치상으로는 좋아보일 수 있으나 데이터 특성을 고려하면 그렇지 못합니다. 7.2절에서 describe( ) 를 통해 확인한 정보에서 종속변수 match의 평균값은 0.164입니다. 매칭된 경우가 약 16% 정도라는 겁니다. 나머지 84%는 매칭되지 않았습니다. 즉, 모델링 없이 모든 경우를 0(매칭되지 않았다고)으로만 예측해도 84%는 맞출 수 있는 편향된 데이터입니다. 그래서 86%의 결과는 예측 모델이 없는 것보다 아주 조금 나은 수준입니다.

4.7절 ‘모델링 및 예측하기’에서 배운 confusion_matrix( ) 를 사용해 정보를 더 구체적으로 살펴봅시다.

 

print(confusion_matrix(y_test, pred)) # 혼동 행렬 출력

 

예상대로 실젯값이 0인데 0으로 예측한 경우가 1291건으로 가장 많습니다. 매칭된 경우를 제대로 예측한 경우도 114건으로 무난한 수준입니다. 혼동 행렬에서 1종 오류, 즉 실젯값은 0인데 1로 예측한 경우가 68건, 반대로 2종 오류는 약 147건으로 상당히 많습니다. 모델 간의 비교/평가를 진행할 때는 오류 유형에 따른 평가해야 합니다. 사이킷런에서 제공하는 classification_report( ) 함수를 이용하면 이와 관련된 평가 수치를 일목요연하게 확인할 수 있습니다.

 

print(classification_report(y_test, pred))

 

기본적으로 classification_report( ) 결과물은 종속변수의 값인 0과 1 각각에 대하여 한 줄씩 나타납니다. 대부분은 예측하려는 경우를 1로 두기 때문에 1에 대한 값들을 주로 해석하면 되고, 0에 대한 값들은 필요에 따라 확인하면 됩니다. 이 데이터는 목푯값 중 0의 비율이 87%이기 때문에 정밀도(precision), 재현율(recall), F1-점수(f1-score) 모두 0.9 이상의 높은 값을 보여주므로 중요도가 떨어집니다. 반면 1에 대한 값들은 0.60, 0.42, 0.49 등으로 상대적으로 확연히 낮습니다.

precision, recall, f1-score를 설명하기 위해 혼동 행렬을 다시 한번 살펴보겠습니다.

 

 

4장에서 혼동 행렬을 설명할 때 TP(양성을 양성으로 판단), FN(양성을 음성으로 판단), FP(음성을 양성으로 판단), TN(음성을 음성으로 판단) 개념도 함께 설명드렸는데, 이 값들로 정밀도와 재현율을 계산합니다.

정밀도(precision)는 1로 예측한 경우 중, 얼마만큼이 실제로 1인지를 나타냅니다. 수식은 다음과 같습니다.

 

 

FP가 커질수록 분모가 커지기 때문에 정밀도는 낮아집니다. 즉, 1종 오류와 관련됩니다. 재현율(recall)은 실제로 1 중에, 얼마만큼을 1로 예측했는지를 나타냅니다. 수식은 다음과 같습니다.

 

 

여기서는 FN이 커질수록 recall 값이 작아지므로 Type 2 error와 관련됩니다. F1-점수(f1-score)는 정밀도와 재현율의 조화평균을 의미합니다. 수식은 다음과 같습니다.

 

 

조화 평균값이므로 정밀도와 재현율이 높을 때 당연히 함께 높아지며, 둘의 값이 비슷할수록 더 높은 값을 보여줍니다. 예를 들어 정밀도와 재현율 각각 0.8, 0.6일 때보다 0.7, 0.7일 때 더 높은값을 나타냅니다.

 

 

어떤 오륫값을 살펴봐야 하는지는 분석의 목적에 따라 다릅니다. 1종 오류가 중요하면 정밀도에, 2종 오류가 중요하면 재현율에 더욱 신경 써야 합니다. 특별히 더 중요한 오류 유형이 없다면 F1-점수를 보는 게 무난한 방법입니다. 목푯값이 0과 1로 이루어진 이진분류에 유용하게 사용되는 또 하나의 평가 방법으로 AUC가 있는데, 이는 11장에서 다룹니다.

 

이해하기 : 경사하강법

하이퍼파라미터 튜닝에 앞서, 경사하강법(Gradient Descent)을 먼저 알아보겠습니다. 경사하강법은 머신 러닝이 학습시킬 때 최소의 오차를 찾는 방법입니다. 오차 함수에 대한 경사도(미분계수)를 기준으로 매개변수를 반복적으로 이동해가며 최소 오차를 찾습니다. 여기서 말하는 매개변수는 선형 회귀로 치면 계수(변수에 대한 기울기 값)에 해당합니다. 예를 들어 매개변수(x)에 대한 오차(y) 수식이 다음과 같다고 가정해보겠습니다.

 

 

이를 그래프로 그리면 다음과 같습니다.

 

 

여기서 오차 y의 최솟값은 위 수식을 x에 대해 미분하면 됩니다. f'(x)= 2x – 4 이므로 x가 2일 때 최솟값 6이 나온다는 사실을 쉽게 알 수 있습니다. 그래프에서 미분값은 접선의 기울기를 의미하고, y가 최솟값이 되는 지점에서 기울기는 0입니다. 경사하강법은 임의의 매개변수에서 시작하여 미분값, 즉 오찻값 그래프에서 접선의 기울기를 확인하여 그 기울기가 0인 지점으로 매개변수를 이동시킵니다. 예를 들어 x가 10인 지점에서 미분값을 확인하면 16이고, 이를 그래프에서 접선으로 그려보면 다음과 같습니다.

 

 

이 접선의 기울기가 0에 가깝게 되려면 매개변수는 10에서 왼쪽으로 움직여야 합니다. 경사하강법은 이를 미분계수(접선의 기울기)의 부호와 크기로 판단합니다. 이 값이 양수이면 매개변수를 왼쪽으로, 음수이면 오른쪽으로 움직이며, 기울기의 절댓값이 작을수록 더 조금씩 움직입니다. 매개변수 10에서의 미분계수가 16이므로 왼쪽으로 움직이고 절댓값 16일 때 움직이는 정도를 5라고 가정하여, 매개변수를 왼쪽으로 5만큼 움직여봅시다. 10에서 왼쪽으로 5만큼 움직였으니 새로 미분계수를 측정할 자리는 매개변수 5가 됩니다. 매개변수가 5인 지점의 미분계수를 확인하면 6이 나옵니다.

 

 

미분계수가 6이므로 기울기가 이전보다 완만해졌으나 아직 0에 가깝지는 않습니다. 미분계수가 16일 때 매개변수를 5만큼 움직였으므로, 미분계수가 6인 지점에서는 더 조금 움직입니다. 이번에는 매개변수를 2만큼 왼쪽으로 움직여서 x값 2에서의 기울기를 확인하면 0, 즉 최솟값의 위치에 다다릅니다.

 

 

이는 어디까지나 설명을 위한 단순한 예시 경우이고, 실제로 경사하강법은 정확히 최솟값을 찾아낸다기보다 미분계수가 최대한 0에 가깝도록 계속 움직여서 최솟값의 근삿값에 다다르는 방법입니다. 수식이 복잡할수록 실제 최솟값의 근처에 다다르기 어렵기도 합니다.

가령 다음과 같이 에러에 대한 그래프가 4차 함수의 형식을 띄고 있다면, 경사하강법이 최솟값이라고 여길 만한 부분, 즉 미분계수가 0인 지점이 두 곳입니다.

 

 

여기서 노란점을 지역 최솟값(Local Minimum)이라하고 빨간점을 전역 최솟값(Global Minimum)이라고 합니다. 이런 상황에서 학습률((Learning Rate(바로 다음 절에서 설명합니다))이 충분히 크지 않다면 지역 최솟값을 최솟값으로 판단할 수 있으니, 학습률을 충분한 크기로 주어 지역 최솟값을 지나 전역 최솟값으로향할수있게해야합니다.

이 예시에서는 매개변수에 대한 오차 수식이 아주 간단하기 때문에 미분을 하면 쉽게 기울기가 0이 되는 지점을 찾을 수 있지만, 수많은 변수를 가지고 있는 실제 데이터에서는 이러한 방법으로 최소 오차를 찾기 매우 어렵습니다. 따라서 경사하강법을 사용하는 것이 훨씬 효율적입니다.

 

 

4편은 하이퍼파라미터 튜닝 및 XGBoost 이해하기 입니다.

==

권시현(데싸노트)

삼성전자에 마케팅 직군으로 입사하여 앱스토어 결제 데이터를 운영 및 관리했습니다. 데이터에 관심이 생겨 미국으로 유학을 떠나 지금은 모바일 서비스 업체 IDT에서 데이터 사이언티스트로 일합니다. 문과 출신이 미국 현지 데이터 사이언티스트가 되기까지 파이썬과 머신러닝을 배우며 많은 시행착오를 겪었습니다. 제가 겪었던 시행착오를 덜어드리고, 머신러닝에 대한 재미를 전달하고자 유튜버로 활동하고 책을 집필합니다.

현) IDT Corporation (미국 모바일 서비스 업체) 데이터 사이언티스트
전) 콜롬비아 대학교, Machine Learning Tutor, 대학원생 대상
전) 콜롬비아 대학교, Big Data Immersion Program Teaching Assistant
전) 콜롬비아 대학교, M.S. in Applied Analytics
전) 삼성전자 무선사업부, 스마트폰 데이터 분석가
전) 삼성전자 무선사업부, 모바일앱 스토어 데이터 관리 및 운영

강의 : 패스트캠퍼스 〈파이썬을 활용한 이커머스 데이터 분석 입문〉

SNS : www.youtube.com/c/데싸노트

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내