귀퉁이 서재

캐글 필사 - 5. Home Credit Default Risk 본문

캐글 (Kaggle)

캐글 필사 - 5. Home Credit Default Risk

Baek Kyun Shin 2020. 1. 5. 19:25

각 고객의 정보를 기반으로 해당 고객이 대출한 돈을 갚을 수 있을지 없을지에 대한 확률을 예측하는 대회입니다. 본 대회는 다소 어려웠습니다. 우선, 주어진 데이터 파일이 워낙 많다 보니 어떤 것을 어떻게 활용해야 하는지 감이 잘 안 잡혔고, 금융에 대한 도메인 지식도 많이 없다 보니 Feature Engineering을 하는 것이 어려웠습니다.

제 깃헙은 https://github.com/BaekKyunShin/Kaggle/tree/master/Home_Credit_Default_Risk 입니다.

A Gentle Introduction

Home Credit Default Risk에 대해 전체적으로 훑어보는 커널입니다. EDA, 간단한 Feature Engineering을 통해 예측을 해봅니다.

Encoding

우선, Categorical Data를 인코딩합니다. 2개의 값으로만 구성되어 있는 feature는 Label Encoding을 하고, 2개 이상의 값으로 구성되어 있는 feature는 One-Hot Encoding을 합니다. 그 이유는 2개 이상의 값을 가지는 Feature에 대해 Label Encoding을 하면 성능이 떨어지기 때문입니다. Label Encoding이 되면 범주형 데이터 값이 1, 2, 3, 4.. 등과 같이 숫자로 변환됩니다. 이 1, 2, 3, 4... 는 단지 범주를 구분하기 위한 건데 실제 머신러닝 모델을 돌리면 모델이 이 숫자의 크기를 간주합니다. 즉 '4가 1보다 4배 크다'라는 식으로 말이죠. 실제 1과 4는 각 범주를 숫자로 매핑시켜준 것에 불과한데 이를 크기가 있는 숫자로 인식을 한다면 성능에 문제를 일으키겠죠. 따라서 데이터 값이 2개 이상이면 One-Hot-Encoding을 해주는 것입니다.

Feature Engineering

간단한 Feature Engineering으로는 Polynomial feature와 Domain Knowledge feature를 사용합니다. Polynomial feature는 특정 feature를 제곱, 세제곱 하거나 서로의 곱(interaction)을 통해 새로운 다항식으로 구성된 feature를 의미합니다. 중요한 feature인 `EXT_SOURCE_1`, `EXT_SOURCE_2`, `EXT_SOURCE_3`를 기반으로 Polynomial feature를 만들었습니다. 예를 들어, `EXT_SOURCE_1^2`, `EXT_SOURCE_2^2` 같이 하나의 feature를 제곱, 세제곱 등을 해주거나 `EXT_SOURCE_1` x `EXT_SOURCE_2`, `EXT_SOURCE_1` x `EXT_SOURCE_2^2`, `EXT_SOURCE_1^2` x `EXT_SOURCE_2^2`와 같이 서로를 곱해준 feature를 만들 수 있습니다.

그다음은 아래와 같이 Domain Knowledge feature를 사용했습니다.

- `CREDIT_INCOME_PERCENT`: the percentage of the credit amount relative to a client's income
- `ANNUITY_INCOME_PERCENT`: the percentage of the loan annuity relative to a client's income
- `CREDIT_TERM`: the length of the payment in months (since the annuity is the monthly amount due
- `DAYS_EMPLOYED_PERCENT`: the percentage of the days employed relative to the client's age

최종적으로 예측은 Logistic Regression과 Random Forest를 사용했습니다.

Introduction to Manual Featrue Engineering

본 커널에서는 각종 Feature Engineering을 해주어 `A Gentle Introduction`보다 더 성능을 향상시켰습니다.

Aggregation

우선, Numeric Feature에 대해 Aggregation 한 feature를 추가해줬습니다. `SK_ID_CURR`을 기준으로 Numerica feature의 `mean`, `max`, `min`, `sum`을 구했습니다. 이렇게 구한 Aggregation Feature를 기존의 train, test DataFrame에 추가해줬습니다. Categorical Feature는 One-Hot-Encoding을 해준 뒤 `sum`, `mean` Aggregation을 해주었습니다. 

결측값 처리

결측값 처리도 해주었습니다. 각 Feature별로 결측치가 90%가 넘어가는 Feature는 drop 해주려고 했으나 결측치가 90% 넘는 Feature는 없었습니다.

Target값 과의 상관 계수, Feature 간 다중공선성

각 Feature와 Target 간의 상관계수도 구했습니다. 이 상관계수를 기반으로 가장 중요시되는 feature를 도출했습니다. 중요한 feature(즉, 상관계수의 절댓값이 높은 feature)에는 Feature Engineering으로 만든 feature들도 상당수 있었습니다.

또, 각 Feature 간의 다중공선성도 살펴봤습니다. 각 feature 간의 상관계수가 0.8이 넘어가면 둘 중 하나는 drop 해주었습니다.

최종적으로 모델은 LightGBM을 사용했습니다. `A Gentle Introduction`에서 간단한 feature engineering 한 것보다 성능이 크게 향상되었습니다.

Stacking Test-Sklearn, XGBoost, CatBoost, LightGBM

본 커널의 코드는 간단하지만 성능면에서는 뛰어납니다.

최적의 하이퍼 파라미터가 이미 정해진 SKlearn, CatBoost, XGBoost, LightGBM를 Stacking하여 최종 예측값을 구했습니다. Feature Engineering을 크게 없었으며, 모델의 하이퍼파라미터 및 Stacking에 중점을 둔 커널입니다. 하이퍼 파라미터는 이미 다른 커널에서 구해놓은 것을 그대로 가져다가 썼기 때문에 코드가 간단해질 수 있었습니다.

 

Comments