신용카드 사용자 데이터를 보고 사용자의 대금 연체 정도를 예측
1. 대회 소개 및 규칙
2. 데이터 분석 및 전처리
3. 모델 적용 및 성능 평가
4. 우승자 코드 분석
5. 마무리...
현재 많은 금융 업계에서는 인공지능(AI)를 활용한 금융 서비스를 구현하는 사례가 증가하고 있다. 이러한 상황 속에서 사용자의 대금 연체 정도를 예측할 수 있는 인공지능 알고리즘을 개발한다면 금융업계에서는 이를 활용하여 더 다양한 서비스를 제공할 수 있다. 본 글에서는 신용카드 사용자 연체 예측 AI 경진대회의 내용을 다루고자 한다. 이대회는 이러한 취지를 반영하여 한국 버전의 Kaggle이라 불리는 데이콘(DACON)에서 매달 진행하는 월간 데이콘 14번째 대회로서, 고객의 개인 정보(나이, 연봉, 가족 정보 등)의 데이터를 활용하여 신용 점수를 산정하고, 이를 이용해 카드 신청자(신규 or 재발급)의 향후 채무 불이행과 신용 카드 대금연체에 따른 신용 등급을 예측하는 알고리즘을 개발 하는 경진 대회 이다.
본 대회는 [그림2]와 같이 평가 방법과 대회 운영에 있어 몇 가지 중요한 규칙을 가지고 있다. 모델의 성능은 Log-loss(Loss Function)를 사용 하여 평가하고, 최종 평가 데이터의 50%를 이용하여 Public Score를 측정하여 리더보드에 제공하고, 대회 최종 평가는 나머지 50% 데이터를 이용하여 Private Score를 측정하여 순위를 결정하고, 상위 팀들의 코드 검증을 통해 최종 순위를 결정하는 방식을 사용했다.
신용 카드 사용자 데이터는 Feature Data(18개)와 Label Data(1개) 총 19개로 구성 되어 있다. [그림3]의 초록색 데이터는 Binary Category 데이터로 소유/미소유 두가지로 데이터가 구성되어 있는 항목이다. 파란색 데이터는 Multi Category 데이터로 각 항목마다 여러개의 값을 문자값으로 구성되어 있다. 보라색 데이터는 수치 데이터로 각 항목마다 다양한 범위의 숫자 값으로 구성 되어 있다. 마지막으로 Credit데이터는 0, 1, 2 총 3가지 값을 가지는데 숫자값이 작을수록 신용도가 높음을 뜻한다.
Binary Category 데이터는 0과 1로 구성되었기 때문에 크게 보여주는 특징은 없었다. 다만 Flag_Mobile의 모든 값이 1이므로 불필요한 특징으로써 제거할 특징으로 판단된다. Multi Category 데이터에서는 모두 문자 값으로 되어 있어 수치값(Index)으로 변경하여야 한다. Income_type의 Student항목과 Eudu_type의 Academic항목은 다른 항목에 비해 데이터량이 많이 적어서 유사한 항목과 병합 하려 하였으나, [그림4]의 분포도와 같이 다른 항목과의 유사한 분포를 가진 항목이 없어 합치지 못하였다.
Child_num, Family_size와 Income_Total 데이터의 경우 일정 수치이상의 값은 같은 Credit값을 가지고 있어 일정 수치 이상의 값은 하나의 값으로 치환이 가능 하다. 또한 Days_Birthd와 Days_Employed데이터는 day를 기준으로 표시가 되어 있기 때문에 데이터의 범위가 크다. 그렇기 때문에 month 또는 year(나이)데이터로 변경하여 데이터의 범위를 줄여줄 필요가 있고, 두 데이터는 음수값으로 되어 있기 때문에 이 값을 양수 값으로 변경할 필요가 있어 보인다. 또한 Days_Employed의 양수 값은 무직(직장이 없는 경우)을 뜻하기 때문에 이 수치는 모두 0으로 변경 적용해야 할것으로 보인다. 마지막으로 Begin_month데이터는 카드사에 발급을 신청한 '월수'를 의미 한다. 예를 들어 -3으로 표시되어 있으면 3개월 전에 카드 발급을 신청했다는 의미로 해석 가능하다. 이 데이터를 분석하면 중복된 데이터가 있음을 확인 할 수 있으며 이러한 중복 데이터에 대한 처리가 필요해 보인다.
[그림6]을 통해 동일한 사용자가 Begin_month에 따라 다른 Credit값을 가지고 있음을 확인 할 수 있다. 이는 연체나 개인적인 사유로 인해 해당 시간에 따라 Credit(신용도)이 좋아지거나 나빠지는 등 불규칙하게 바뀐다는 것을 확인 할 수 있다. 하지만, Begin_month는 단순히 카드 발급을 신청한 시기를 의미 할 뿐이고 나머지 데이터는 동일 하기 때문에 이러한 중복 데이터 때문에 Credit을 예측하는데 방해가 될수 있어 이렇게 중복된 데이터를 잘 처리해야 모델의 성능을 향상 시킬 수 있을것으로 판단 된다.
Feature Engineering을 통해 확인한 데이터의 특성을 기반으로 [그림7]과 같이 데이터를 치환 하였다. 수치 데이터 간의 조합(예: 총수입(Income_totla)을 고용일수(Days_employed)로 나눈 값)을 통해 Feature를 추가하고 Permutation Feature Importance(변수중요도)를 통해 중요하다고 판단되는 데이터를 추가 하였다. 중복된 데이터를 처리하기 위해 Credit Chanage라는 feature값을 추가하 였는데, 이 값은 중복되는 사용자 데이터내에서 신용도가 변동이 있었는지 또는 이전에 신청 내역이 없는지 등을 확인하여 특정 값을 부여한 값이다.
신용카드 사용자 연체 여부를 판별하기 위해 현재 Kaggle과 Dacon에서 좋은 성능을 보여주는 앙상블 모델(LightGBM, XGBoost)을 사용 하였다. 두 모델은 결정 트리(Decision Tree)을 기반으로 만들어 졌지만 모델을 구성하는 방법론에서 [그림8]과 같은 차이점을 보인다. 일반적인 Tree 기반 알고리즘은 균형 트리 분할(Level-wise) 방법을 사용하는데, 이에 해당되는 대표적인 앙상블 모델이 XGBoost 모델 이다. 이 방법은 최대한 균형이 잡힌 트리를 유지하면서 분석 하기 때문에 트르의 깊이가 최소화가 될수 있지만 그 만큼 시간이 오래 걸리는 단점을 가지고 있다. LightGBM은 리프 중심 트리 분할(Leaf-wise)의 대표적인 모델이다. 이 방법은 균형 트리 분할과는 다르게 균형을 맞추지 않고 최대 손실 값(max data loss)을 가지는 리프 노트를 지속적으로 분할하면서 트리의 깊이가 깊고, 비대칭적인 트리를 생성 한다. 이렇게 생성된 비대칭 적인 트리는 균형 트리 분할보다 손실을 줄일 수 있는 장점이 있다.
각 모델은 고유한 파라미터값을 가지고 있고, 이 파라미터 값에 의해 모델의 성능을 향상 시킬 수 있다. 각 모델에서 최적의 파라미터를 찾기 위해 Scikit-learn에서 제공하는 GridSearchCV를 이용 하였다. 앙상블 모델에서 주요하게 사용되는 파라미터들의 범위를 설정하여 GridSearchV를 적용하면 설정된 범위안에서 모든 파라미터의 조합을 검색하여 최종적으로 가장 좋은 성능을 보여준 결과와 그에 해당하는 파라미터 값을 반환한다.
앙상블 모델에(XGBoost, LightGBM) GridSearchCV를 적용해 확인된 최적의 파라미터를 적용했을때의 결과는 [그림10]과 같다. XGBoost과 LightGBM 두 모델 모두 Baseline(RandomeForest)보다는 좋은 성능을 보여 주었고, XGboost보다는 LightGBM이 동일한 조건의 데이터를 사용했을때 더 좋은 성능을 보여 주었다.
Feature Enginnering은 Feature 전처리(양수 치환) → Feature 추가 → Feature 후처리(제거 및 Log적용) → Clustering적용 순으로 이루어 졌다. Feature 전처리에서는 Nan 데이터 처리, Family_size/ Flag_mobile 제거 및 음수값을 양수 값으로 치환 하였다. 치환된 값을 기준으로 총 12개의 Feature를 추가하였다. 추가한 Feature 중에 Permutation Feature Importance가 가장 높은 변수는 ID로 중복 데이터를 처리 하기 위한 변수로 test데이터와 train 데이터를 비교했을때 중복되지 않은 값(신규)에 대해서는 모두 -1로 처리 하였다. 그리고 추가한 데이터와 비교했을 때 다중공선을 보이는 기존 Feature 3개(child_num, days_birth, days_employed)를 제거하였고, 이렇게 선별된 27개의 Feature(기존+추가)를 K-means 클러스터에 적용하여 36개의 Category를 Feature로 적용하여 총 28개의 Feature를 사용 하였다.
Feature Engineering을 통해 선별된 28개의 Feature를 총 4가지의 앙상블 모델(RandomForest, XGBoost, LightGBM, CatBoost)에 적용하였고, 가장 좋은 성능을 보여준건 CatBoost모델 이였다. Catboost는 XGBoost와 같은 균형 트리 분할 방법을 사용 한다. 다른 모델들은 GridSearchCV를 적용하여 최적의 파라미터를 적용한 결과이고, 시간적 제약으로 CatBoost에는 적용하지 못하고 기본 파라미터를 사용하였음에도 불구하고 가장 좋은 성능을 보여 주었다. 데이터를 K-fold를 이용하여 여러개의 train/validation set으로 나눠서 적용하였는데, fold의 수를 5개에서 17개 까지 돌려보고 가장 좋은 결과를 보여준 15로 설정 하였다.
신용카드 사용자 연체 예측 경진대회는 다른 대회와 비교했을 때 재미있는 요소들이 많은 대회였던것 같다. 우선 중복되는 데이터가 존재하여 이 문제를 어떻게 해결할 것인가가 이 과제에서 가장 중요한 포인트로 보여진다. 그리고 우승자는 K-means 클러스터를 적용하여 이 문제를 어느 정도 해소한 것으로 보인다. 또한 수치 기반 데이터의 변형을 통해 데이터를 추가하고 성능을 향상 시킨점도 중요한 포인트로 파악된다.
동일한 데이터와 동일한 모델을 사용했을 때, Feature Engineering과 모델 파라미터 수정이 성능을 좌우하는 큰 요소라고 생각하였지만, 우승자의 코드에서 기본 파라미터 만으로도 좋은 성능을 보여줌에 따라 다른 대회에서 많이 사용되고 좋은 성능을 보여주는 모델 고집하기보다는 다양한 모델적용을 통한 최적의 모델 선택과 더 다양한 시선과 방법으로 Feature Engineering을 적용하여 의미 있는 Feature들을 찾아내거나 추가하는게 더 좋은 결과를 보여 줄것으로 사료된다.