상세 컨텐츠

본문 제목

[캐글 필사] Home Credit - Credit Risk Model Stability

캐글 필사

by pjhhs-data 2025. 9. 14. 21:05

본문

1. 문제 & Metric 파악

1) 대회 배경, 설명에 대한 이해

대회의 목표는 어떤 고객이 대출을 갚지 못할 가능성이 높은지를 예측하는 것입니다. 평가에서는 시간이 지나도 안정적으로 유지되는 모델을 우선시한.

 

배경

 

  • 신용 기록의 부재는 단순히 나이가 어리다거나 현금을 선호한다는 뜻일 수도 있다. 그러나 전통적인 신용 데이터가 없는 경우, 보통 대출이 거절된다.
  • 따라서 금융사는 누가 대출을 상환할 수 있고 누가 그렇지 못한지 정확히 판단해야 하며, 이를 위해 데이터가 핵심적이다.
  • 데이터 과학이 이러한 상환 능력을 더 잘 예측할 수 있다면, 지금까지 신용 기록 부족으로 대출을 받지 못했던 사람들에게도 금융 접근성이 열릴 수 있다.

 

 

2) 평가 Metric에 대한 이해

 

Gini 계수(Gini coefficient)

1. 기본 개념

  • Gini 계수(Gini coefficient) 는 분류 모델의 예측 성능을 평가하는 지표 중 하나로, ROC AUC와 밀접하게 관련되어 있습니다.
    • AUC = (Gini + 1) / 2 → 따라서 Gini = 2 × AUC – 1
  • 즉, Gini 점수가 높을수록 모델이 좋은 분류 성능을 가진다는 뜻입니다.

🔹 2. 왜 "Stability"가 중요한가?

  • 일반적인 대회에서는 단순히 Gini 점수(혹은 AUC)만 높이면 되지만,
  • 실제 금융 환경에서는 시간이 지나면서 모델의 성능이 안정적으로 유지되는지가 더 중요합니다.
  • 따라서 이번 대회에서는 단순 성능이 아니라 성능의 추세와 변동성까지 평가합니다.

🔹 3. 평가 방식 (Gini Stability Metric 계산 과정)

Step 1. 주별 성능 평가

  • 데이터는 주 단위(WEEK_NUM) 로 구분되어 있다.
  • 각 주에 대해 모델의 예측값을 기반으로 주별 Gini 점수를 계산한다.

Step 2. 성능 추세 확인 (하락률 패널티)

  • 주별 Gini 점수를 종속변수로 두고, 주차(WEEK_NUM)를 독립변수로 하여 선형 회귀를 수행한다.
  • 회귀선의 기울기(slope)를 이용해 falling_rate(성능 하락률) 을 측정한다.
    • 기울기가 음수(성능이 시간이 지남에 따라 하락)일수록 패널티가 커진다.

Step 3. 변동성 확인 (일관성 패널티)

  • 선형 회귀선과 실제 주별 Gini 점수의 차이(잔차, residual)를 계산한다.
  • 이 잔차들의 표준편차(standard deviation)를 구해 모델의 변동성을 측정한다.
    • 표준편차가 크면 → 주별 성능이 들쑥날쑥 → 추가 패널티 부여.

Step 4. 최종 점수 산출

  • 최종 Gini Stability Metric = (평균 Gini 점수) – (하락률 패널티) – (변동성 패널티)
  • 따라서, 단순히 성능이 높은 모델보다,
    • 시간이 지나도 성능이 잘 유지되고
    • 변동이 적은 안정적인 모델이 더 높은 점수를 받게 된다.

🔹 4. 직관적인 이해

  • 예를 들어,
    • 모델 A: Gini 점수 0.6 → 0.58 → 0.55 → 0.52 (점점 하락, 변동은 적음)
    • 모델 B: Gini 점수 0.6 → 0.65 → 0.55 → 0.62 (하락은 적지만 들쑥날쑥)
  • 단순 평균 Gini는 비슷하지만,
    • 모델 A는 하락률 패널티
    • 모델 B는 변동성 패널티
      를 받아서 최종 점수가 갈리게 된다.

 

✅ 요약:
Gini Stability Metric

  1. 성능(Gini)
  2. 시간에 따른 안정성(falling_rate)
  3. 예측의 일관성(variability penalty)
    를 모두 반영하는 지표이다.

 

2. EDA

1) 탐색적 데이터 분석 (EDA)

  1. 결측치 비율 확인 및 시각화
    • 전체 피처 중 일부는 결측치 비율이 상당히 높았으며, 이를 히트맵(heatmap)과 결측치 비율 그래프로 시각화하여 한눈에 확인.
    • EXT_SOURCE_1, EXT_SOURCE_2, EXT_SOURCE_3와 같은 외부 신용 평가 관련 지표는 결측치가 존재하지만, 중요한 피처로 판단되었다.
  2. 타깃 값의 분포 확인
    • target 값은 0(정상 상환) : 1(부도) 의 비율이 약 92:8로, 불균형이 존재한다.
    • 하지만 일반적으로 금융 데이터에서 볼 수 있는 극심한 불균형(예: 99:1) 수준은 아니므로, SMOTE와 같은 데이터 증강은 적용하지 않고 그대로 사용하기로 했다.
  3. 주요 피처와 타깃과의 상관관계 분석
    • DAYS_BIRTH(신청자의 나이), AMT_INCOME_TOTAL(총 소득), EXT_SOURCE_1/2/3(외부 신용 평가 지표) 등은 target 값과 높은 상관관계를 보였다.
    • 특히 DAYS_BIRTH는 젊은 고객일수록 대출 상환 실패 확률이 높음을 보여주는 특징을 발견했다.

2) 데이터 클렌징 (Data Cleansing)

  1. 결측치 처리
    • EXT_SOURCE_1/2/3와 일부 금액 관련 컬럼(AMT_REQ_CREDIT_BUREAU_* 등)의 결측값은 단순히 삭제하지 않고, 평균(mean) 값으로 대체하였다. 이는 모델이 결측값 자체를 학습하는 대신, 대표값을 통해 안정적으로 예측할 수 있도록 하기 위함이다.
  2. 범주형 변수 인코딩
    • 범주형 변수(NAME_CONTRACT_TYPE, CODE_GENDER, ORGANIZATION_TYPE 등)는 Label EncodingOne-Hot Encoding을 혼합하여 사용했다.
    • 이진 값(binary categorical)의 경우 Label Encoding, 다중 클래스(multiclass categorical)의 경우 One-Hot Encoding을 적용했다.
  3. 이상치 처리
    • 이상치(Outlier)는 모델이 학습 과정에서 무시할 수 있도록 그대로 두었다.
    • 예를 들어 AMT_INCOME_TOTAL의 일부 값은 극단적으로 높았지만, 이는 소수의 특이 케이스로 간주하고 그대로 반영했다.

3) 피처 엔지니어링 (Feature Engineering)

  1. 특정 값 기반 처리
    • DAYS_EMPLOYED 컬럼에서 365243이라는 값은 실제 근속연수가 아니라, 결측치를 의미하는 특수 값이므로 이를 NA로 변환하여 처리했다.
  2. 비율 변수 생성
    • 단일 금액 값보다 비율( ratio ) 형태의 피처가 더 의미 있을 수 있다.
    • 예:
      • CREDIT/INCOME RATIO = AMT_CREDIT / AMT_INCOME_TOTAL
      • ANNUITY/INCOME RATIO = AMT_ANNUITY / AMT_INCOME_TOTAL
    • 이러한 비율 피처들은 고객의 상환 능력을 직접적으로 반영하므로, 모델의 성능 향상에 중요한 역할을 했다.
  3. 서브 테이블 집계 피처 생성
    • bureau, credit_card_balance, POS_CASH_balance, installments_payments, previous_application 등 다수의 서브 테이블로부터 집계 통계량(agg features) 을 생성했다.
    • 각 고객(case_id)별로 mean, max, min, count, sum 등의 함수를 적용하여 요약 통계 피처를 만들고, 이를 메인 테이블(application_train.csv)과 병합했다.

3. Notebook 필사

YouTube를 통해 직접 설명도 해주시기 때문에 필사에 매우 좋았다

 

선정한 Notebook의 링크

https://www.kaggle.com/code/yuuniekiri/fork-of-home-credit-risk-lightgbm

 

Fork of Home Credit Risk (LightGBM)

Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

www.kaggle.com

 

모델 선정

  • 기본 모델로는 LightGBM을 사용했다.
  • 빠른 학습 속도와 메모리 효율성, 그리고 대규모 데이터셋에서의 성능이 우수하기 때문에 금융 데이터 분석에 적합하다고 판단했다.

1) 데이터 분할

  • 데이터를 train-validation = 80:20 비율로 분할했다.
  • KFold 교차 검증은 별도로 적용하지 않았지만, GridSearchCV 내부적으로 교차 검증을 사용하여 일반화 성능을 확보했다.

2) 하이퍼파라미터 튜닝

  • 핵심 파라미터(max_depth, num_leaves, learning_rate, min_child_weight, subsample 등)에 대해 GridSearchCV를 사용하여 탐색했다.
  • 평가 기준(scoring metric)은 ROC AUC로 설정했다.
  • 최적 파라미터로 모델을 재학습한 뒤, SHAP(Shapley Additive exPlanations) 으로 피처 중요도를 분석했다.

3) 성능

  • 주요 피처는 EXT_SOURCE_2, EXT_SOURCE_3, DAYS_BIRTH, DAYS_EMPLOYED 등으로 확인되었다.
  • SHAP 해석 결과 역시 동일한 변수들이 가장 큰 영향을 주는 것으로 나타났다.

4. Lesson Learned

 

  • 데이터 전처리 및 특징 생성의 중요성
    • 단순한 원본 데이터보다 다양한 파생 변수(derived features) 를 만드는 것이 모델 성능 향상에 크게 기여함을 확인했니다.
    • 예: 신청자의 나이(DAYS_BIRTH), 고용기간(DAYS_EMPLOYED), 비율 변수(대출금/소득, 연금/소득), 시간 단위 변수(요일, 월, 년 등).
  • 모델 해석 가능성 확보
    • 단순 성능 지표(AUC, Accuracy)만으로는 한계가 있다.
    • SHAP 값을 활용해 Feature Importance Bar PlotBeeswarm Plot을 시각화함으로써, 모델이 어떤 피처에 의존하는지 직관적으로 분석할 수 있었다.
  • 모델의 안정성 분석 필요성
    • 단순히 AUC가 높은 모델이 아니라, 시간이 지나도 안정적인 모델이 실제 서비스에 더 적합하다.
    • 이를 위해 Gini 계수의 주차별 변화 추세를 분석하고, slope(기울기), 평균, RMSD를 조합한 stability score를 통해 안정성을 평가했다.
    • 이러한 접근은 실제 금융 서비스에 바로 적용할 수 있는 중요한 기준이 되었다.

 

관련글 더보기