Loan Approval Predicition

MSMoon·2025년 4월 8일

kaggle 학습

목록 보기
1/18
post-thumbnail

1. 대회 설명

  • 목표: 고객의 대출 상환 여부를 다양한 머신러닝 모델을 활용해 예측
  • 문제 유형: 이진 분류
  • 데이터 배경
    -> 다양한 고객 특성과 대출 관련 정보가 포함된 데이터셋
    -> 결측치와 범주형 변수가 다수 존재하여 전처리 및 임퓨팅 전략이 중요

2. 성능 평가 방식 이해

  • Evaluation Metric: ROC AUC
  • 특징
    -> 클래스 불균형 문제에 상대적으로 강인한 평가 지표
    -> 예측 확률의 순서를 평가하므로 정확도보다 더 유용한 경우 많음

3. 데이터 전처리

3-1) EDA

  • 수치형 변수와 범주형 변수를 나누어 각각 처리
  • original.columnsloan_status, original 컬럼은 제외하고 전처리 대상 선정
  • 범주형 컬럼들은 .select_dtypes(include=['object'])로 자동 필터링

3-2) Data Cleansing

범주형 변수 처리

  • category_mappings[col] = {v: k for k, v in enumerate(df_imputed[col].unique())} 사용
  • 각 범주형 변수를 숫자로 매핑하여 scikit-learn 모델이 처리할 수 있도록 함
  • 이후 imputation 완료 후 다시 역변환(reverse mapping) 처리하여 원래 값으로 복원

결측값 보간

  • IterativeImputer 사용 (sklearn.experimental 모듈)

  • estimator=EnsembleRegressor() 로 커스텀 회귀 모델을 보간용 모델로 사용

  • EnsembleRegressor는 다음 네 가지 모델의 평균 예측값을 활용
    -> RandomForestRegressor
    -> CatBoostRegressor
    -> LGBMRegressor
    -> XGBRegressor

  • max_iter=10으로 반복 보간 수행

보간 후 처리

  • 보간된 결과는 df_result = pd.DataFrame(imputer_data, columns=columns_to_impute)
  • 이후 범주형 컬럼들만 다시 .round().map(reverse_mapping)을 통해 원래 라벨로 복원
  • 마지막으로 원래 데이터에 존재했던 loan_status, original 컬럼을 다시 병합하여 복원
  • 최종적으로 original = df_result.copy() 로 전체 전처리된 데이터를 통합

3-3) Feature Engineering

  • 기존 변수들을 변형하거나 조합하여 의미 있는 파생변수를 대량으로 생성
  • 원래 단순했던 변수들을 다양한 관점에서 확장 → 모델의 표현력(표현 가능한 관계)이 극대화됨
  • 실제 비즈니스 도메인(대출/금융)에서 의미 있는 지표들이 다수 포함됨
  1. 비율 / 조합 기반 변수

    • income_to_age: 소득 대비 나이
    • loan_to_income: 대출금 대비 소득
    • rate_to_loan: 이자율 대비 대출금
    • loan_to_employment: 대출금 대비 재직 기간
    • age_to_credit_history: 나이 대비 신용이력 길이 등
  2. 로그/제곱/삼제곱 변환

    • log_income, age_squared, age_cubed, log_loan_amnt
  3. 범주화 (Binning)

    • age_category: 나이 구간별 분류 (pd.cut)
    • income_category: 소득 분위수 기준 분류 (pd.qcut)
    • loan_amount_category: 대출금 구간 분류
  4. Flag 변수 (0 or 1)

    • high_loan_to_income, high_loan_amount, is_new_credit_user, high_interest_rate
    • intent_home_match: 용도와 주거 유형이 일치하는지 여부
  5. 다중 변수 조합

    • home_ownership_intent: 소유 형태 + 대출 목적
    • intent_grade_interaction: 대출 목적 + 등급
    • default_rate_interaction: 기본 여부 + 이자율 구간 등
  6. 정규화 / 그룹 통계 활용

    • normalized_loan_amount: 대출 목적 내 표준화
    • normalized_income: 연령대 기준 소득 표준화
    • rate_to_grade: 등급별 평균 이자율로 대체
  7. 고차항(Polynomial Feature)

    • PolynomialFeatures(degree=2, interaction_only=True) 사용
    • poly_*로 시작하는 2차 상호작용 변수 자동 생성
  8. 사이클릭 변수 변환

    • age_sin, age_cos: 주기성을 갖는 나이 변수 변환
  9. 복합 위험 점수 계산

    • risk_score, creditworthiness_score, stability_score, high_risk_flag

4. 모델링

4-1) 모델

  • RandomForestRegressor: 결측치 보간용
  • CatBoostRegressor: 결측치 보간용 + 블렌딩 후보 모델
  • LGBMRegressor: 결측치 보간용 + 블렌딩 후보 모델
  • XGBRegressor: 결측치 보간용 + 블렌딩 후보 모델
  • LGBMClassifier (GBDT): Optuna 기반 하이퍼파라미터 튜닝 모델
  • LGBMClassifier (GOSS): GOSS 부스팅 방식 적용 모델

4-2) 데이터 분할

  • 교차 검증: StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
    • 타겟 클래스의 비율을 유지한 채로 Fold 분할
  • 각 Fold별로 학습/검증 데이터로 나누어 모델 학습
  • 예측값 저장
    • 검증 데이터의 예측값 → OOF (Out-Of-Fold) 저장
    • 테스트 데이터의 예측값 → Fold별로 따로 저장

4-3) Tuning

  • 사용 도구: Optuna
  • 주요 파라미터 탐색 공간
params = {
    "max_depth": 2 ~ 10,
    "num_leaves": 2 ~ 256,
    "learning_rate": 1e-3 ~ 0.3 (log scale),
    "n_estimators": 50 ~ 1500,
    "subsample": 0.5 ~ 1.0,
    "feature_fraction": 0.1 ~ 1.0,
    "min_child_samples": 1 ~ 100,
    "lambda_l1": 0 ~ 1,
    "lambda_l2": 0 ~ 1,
}
  • 샘플러
    -> TPESampler (기본)
    -> CmaEsSampler (blending weight 최적화에 사용)

  • 조기 종료 설정: early_stopping(250)으로 validation loss 감소 없을 시 학습 중단

4-4) 최종 성능

  • ROC AUC: 0.969

5. 정리(Lesson & Learned)

  • 전체 머신러닝 파이프라인 체득
  • 실전 Feature Engineering 아이디어 학습
  • 모델 성능 향상을 위한 전략적 접근(여러 모델 조합)
  • 실습 환경에 대한 이해도 향상

Loan Approval Predicition

0개의 댓글