AI | 머신러닝

Kaggle 도전기_Home Credit Default Risk(1)

데분몽굴 2025. 1. 27. 23:38

오늘은 캐글데이터셋 중에서 Home Credit Default Risk 주제를 통해 캐글에 Submit한 뒤, 점수를 확인하는 작업을 진행해보겠습니다.
feature engineering에 대해서는 간략하게 진행한 뒤, 일단 빠르게 모델을 설계하여 제출을 한 뒤에 하이퍼파라미터 튜닝, feature engineering 등의 작업을 진행해보도록 하겠습니다.

1. 해결하고자 하는 과제

해당 대회에서 해결하고자 하는 문제는 아래 있는 링크로 들어가 Description을 확인하면 전체적인 대회에 대한 설명을 볼 수 있습니다.

https://www.kaggle.com/competitions/home-credit-default-risk/overview

  • application_{train|test}.csv
    • 고객 정보와 현재 대출 정보 제공
  • previous_application.csv
    • 과거 대출 이력
    • 고객의 현재 대출 이전 과거 대출 정보 제공
  • bureau.csv
    • 고객의 현재 대출 이전 타사 대출 정보 제공

간략하게 설명하자면 사용자의 데이터를 통해 어떤 사용자가 은행 채무를 불이행할지를 예측하는 모델을 만드는 것입니다. 평가 기준은 ROC curve를 통해서 평가를 진행하게 됩니다. 제출해야되는 형태는 아래 사진과 같이 SK_ID_CURR과 TARGET 값이 나오는 csv파일을 제출하게 됩니다. TARGET에 들어가는 데이터는 채무 불이행을 할지 즉, 1인 확률이 들어간다고 생각하면 됩니다.

2. 데이터 시각화

2.1 TARGET 값 분포 및 AMT_INCOME_TOTAL 값 histogram

일단, train_app 데이터의 target 분포를 확인하게 되면 대부분의 데이터가 0인 점을 확인할 수 있습니다.

해당 코드는 value_counts()를 통해 각 target의 갯수를 구하고 이를 app_train의 전체 행으로 각각 나눠주게 되면 각 target값의 비율을 확인해볼 수 있습니다.

sns.distplot(app_train['AMT_INCOME_TOTAL'])
plt.show()

seaborn을 distplot 메서드를 활용하여 'AMT_INCOME_TOTAL' 데이터의 분포를 확인할 수 있다. 대부분의 데이터가 0.2이하에 몰려있는 것을 확인할 수 있다. AMT_INCOME_TOTAL은 고객의 소득을 나타내는 데이터이다.

2.2 TARGET 값에 따른 AMT_INCOME_TOTAL값 분포도 비교

def show_columns_hist_by_target(df, column, is_amt=False):
    cond1 = (df['TARGET'] == 1)
    cond0 = (df['TARGET'] == 0)

    fig, axs = plt.subplots(figsize=(12,4), nrows=1, ncols=2, squeeze=False)
    # is_amt가 True이면 <500000 조건으로 fitlering
    cond_amt = True
    if is_amt:
        cond_amt = (df['AMT_INCOME_TOTAL'] < 500000)

    sns.violinplot(x='TARGET', y=column ,data=df[cond_amt], palette='Set2', ax=axs[0][0])
    sns.distplot(df[cond0 & cond_amt][column], label='0', color='blue', ax=axs[0][1])
    sns.distplot(df[cond1 & cond_amt][column], label='1', color='red', ax=axs[0][1])

    plt.show()

show_columns_hist_by_target 함수는 TARGET 데이터에 따른 violinplot과 distplot을 그려주는 코드이다.

app_train과 app_test를 합쳐서 한번에 데이터 preprocessing 수행

train과 test를 합쳐서 한번에 전처리를 진행하게 된다. 데이터 시각화 이후에 train과 test데이터 모두에 동일한 전처리 작업을 진행해야 하기 때문에 데이터를 concat을 통해서 합쳐주게 된다.

apps = pd.concat([app_train, app_test])
apps.shape

Object feature들을 Encoding 진행

그 다음으로 Object feature들을 Encoding하는 작업을 진행합니다. Encoding 기존 범주형 데이터를 수치형 데이터를 변환하는 작업입니다. 해당 작업을 진행하는 이유는 모델을 학습시킬 때에 범주형 데이터는 모델에게 학습이 되지 않을 수 있기 때문에 수치형 데이터로 변환을 해야합니다. 해당 과제에서는 Label Encoding을 통해 수치형 데이터로 변환을 진행합니다.

object_columns= apps.dtypes[apps.dtypes=='object'].index.tolist()

for column in object_columns:
    apps[column] = pd.factorize(apps[column])[0]

pd.factorize 메서드를 통해 각 컬럼에 따른 범주형 데이터를 수치형 데이터로 변환하게 됩니다. 해당 메서드를 통해 각 범주형 데이터를 레이블 인코딩을 진행해주게 됩니다. 인코딩에는 레이블 인코딩과 원핫인코딩의 방법이 있지만, 이번에는 레이블 인코딩만을 통해서 범주형 데이터를 수치형 데이터로 변환하게 됩니다.

결론

이번 시간에는 Home Credit Default Risk 를 주제로 데이터를 시각화하고 encoding하는 작업까지 진행하였습니다. 다음 시간에는 데이터를 학습 데이터와 테스트 데이터로 다시 분리하여 LGBM Classifier를 통해 학습을 수행하여 예측 결과를 확인해보도록 하겠습니다. 그리고 에측한 결과를 submission에 담아서 kaggle에 제출해보는 작업까지 진행해보겠습니다.

해당 과제를 진행하면서 느낀 점은 데이터를 분석하는 데에 있어 도메인에 대한 지식의 중요성을 크게 느낄 수 있었습니다. 해당 과제에서는 많은 feature engineering을 진행하지는 않았지만 도메인에 대한 지식이 없다면 feature engineering 과정에 어려움이 발생하게 됩니다. 각 데이터들을 깊이 이해하고 활용하는 연습이 필요함을 느꼈습니다.