카테고리 없음

[머신러닝 분석] 로지스틱 회귀로 연체자 예측해보기

책다니엘 2025. 5. 25. 20:26

이번 글에서는 지난번 전처리 및 EDA를 거쳐 준비된 데이터를 기반으로,
로지스틱 회귀(Logistic Regression) 모델을 활용해 신용 연체 가능성을 예측해본 과정을 정리합니다.

 

from sklearn.model_selection import train_test_split

# 타겟 분리
X = train_df.drop(columns=['SeriousDlqin2yrs', 'Unnamed: 0'])  # ID 컬럼도 제거
y = train_df['SeriousDlqin2yrs']

# 학습용 / 검증용 데이터 분리
X_train, X_val, y_train, y_val = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)
# 1. 스케일링
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 2. 데이터 분할
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(
    X_scaled, y, test_size=0.2, random_state=42, stratify=y
)

# 3. 모델 학습
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=1000)  # or 2000
model.fit(X_train, y_train)

1. 로지스틱 회귀란?

로지스틱 회귀는 분류(classification) 문제에 자주 사용되는 고전적인 통계 기반 머신러닝 모델입니다.

정의

입력된 수치 데이터를 바탕으로, 결과가 특정 클래스(0 or 1)에 속할 확률을 추정하는 모델

 

수식 형태는 선형 회귀와 비슷하지만, 마지막 출력에 시그모이드 함수를 적용해
0~1 사이의 확률 값을 만들어냅니다.

사용처

  • 고객 이탈 예측 (Churn)
  • 암 진단 (양성/음성)
  • 스팸 메일 분류
  • 신용 연체 예측 (우리의 프로젝트!)

장점

  • 단순하고 해석력 뛰어남
  • 계수(coefficient)를 통해 변수 중요도 분석 가능

단점

  • 데이터에 스케일 차이가 크면 학습이 불안정
  • 복잡한 패턴을 잘 잡아내진 못함 (선형 모델이기 때문)

2. 스케일링: 왜 필요한가?

이번 프로젝트에서도 중요한 포인트였던 개념이 바로 스케일링(Scaling)입니다.

# 1. 스케일링
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

문제 상황

변수명 값의 범위
age 0~100
MonthlyIncome 0~300,000
DebtRatio 0~30,000 이상도 존재
 

→ 이런 변수들을 그대로 쓰면, 모델이 큰 값만 중요하다고 착각함

실제 발생한 오류

ConvergenceWarning: STOP: TOTAL NO. OF ITERATIONS REACHED LIMIT.

 

→ 모델이 끝까지 학습을 완료하지 못하고 멈춤

해결 방법: StandardScaler

from sklearn.preprocessing import StandardScaler 
scaler = StandardScaler() 
X_scaled = scaler.fit_transform(X)
  • 평균 0, 표준편차 1로 모든 변수를 정규화
  • 로지스틱 회귀, KNN, SVM 등 거리 기반/계수 기반 모델에 필수

3. 분석 결과 정리

Accuracy (정확도)

from sklearn.metrics import accuracy_score

# 예측
y_pred = model.predict(X_val)

# 정확도 확인
accuracy = accuracy_score(y_val, y_pred)
print("Accuracy:", accuracy)
Accuracy: 0.9351
  • 얼핏 보면 성능이 매우 좋아 보이지만,
  • 전체 샘플 중 약 93%가 비연체자(0) → 그냥 "다 0"이라 예측해도 이 정도 정확도가 나옴
  • 불균형 데이터에서는 accuracy는 함정이 될 수 있음

4. 중요한 평가 지표들

from sklearn.metrics import classification_report, roc_auc_score

print("🔍 Classification Report:\n", classification_report(y_val, y_pred))

# 확률 예측으로 ROC AUC
y_prob = model.predict_proba(X_val)[:, 1]
roc_auc = roc_auc_score(y_val, y_prob)
print("ROC AUC Score:", roc_auc)
🔍 Classification Report:
               precision    recall  f1-score   support

           0       0.94      0.99      0.97     27995
           1       0.54      0.18      0.27      2005

    accuracy                           0.94     30000
   macro avg       0.74      0.59      0.62     30000
weighted avg       0.92      0.94      0.92     30000

ROC AUC Score: 0.8615448341104731

precision (정밀도)

모델이 연체라고 예측한 것 중 실제 연체자 비율

class 1 (연체): 0.54

 

→ 예측된 연체자 중 약 54%만 실제 연체자


recall (재현율)

실제 연체자 중에서, 모델이 맞춘 비율

class 1 (연체): 0.18

 

→ 🔥 실제 연체자의 18%만 찾아냄 → 매우 낮음!


f1-score

precision과 recall의 조화 평균
→ 한쪽이 너무 낮으면 f1도 낮게 나옴

class 1 (연체): 0.27

ROC AUC Score

모든 임계값에서 예측 성능을 평가한 지표 (1에 가까울수록 좋음)

ROC AUC Score: 0.8615

 

→ 꽤 괜찮은 수준! → 모델이 어느 정도 구분은 가능하다는 뜻


Feature Importance 해석

로지스틱 회귀는 각 변수의 계수를 통해 연체에 영향을 주는 변수의 방향과 크기를 확인할 수 있다.

importance = pd.Series(model.coef_[0], index=X.columns)
importance.sort_values(ascending=False).plot(kind='barh', figsize=(8, 6))
plt.title("Feature Importance (Logistic Regression)")
plt.show()

변수명 해석
RevolvingUtilizationOfUnsecuredLines 높은 신용 사용률은 연체 확률을 크게 증가시킴
NumberOfTimes90DaysLate 연체 이력이 많을수록 리스크 증가
MonthlyIncome 소득이 높을수록 연체 확률은 낮아짐 (음수 계수)
age 나이가 많을수록 연체 확률이 낮아짐
 

마무리

  • 로지스틱 회귀는 해석력이 좋아 데이터 흐름을 파악하는 데 유용
  • 하지만 불균형 데이터에는 recall이 너무 낮음
  • 다음에는 더 복잡한 패턴을 잘 잡아내는 랜덤 포레스트(Random Forest) 모델을 도입해볼 예정!

 

🧠 오늘 배운 정리 요약

항목 배운 내용 요약
💡 로지스틱 회귀란? 분류 문제에서 확률 기반으로 예측하는 모델, 해석력이 뛰어남
⚖️ 스케일링 필요성 변수 값의 범위 차이가 크면 학습이 안 됨 → StandardScaler로 정규화
📉 모델 성능 정확도는 93%였지만, 실제 연체자를 거의 못 맞춤 (recall = 0.18)
📊 중요 변수 신용 사용률, 연체 이력, 소득, 나이 등과 연체의 연관성 확인
🎯 평가 지표 precision: 예측 정확성 / recall: 놓치지 않기 / f1: 균형 / ROC AUC: 전체 구분력