ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AI/ML 기반 데이터 분석 시리즈 12화 - 클래스 불균형 문제 해결 전략: 실전 중심 접근
    기술과 산업/AI 2025. 6. 5. 18:27
    728x90

    데이터 분석을 조금만 해본 사람이라면 한 번쯤은 반드시 부딪히게 되는 문제,

    바로 클래스 불균형(Class Imbalance) 입니다.

     

    아무리 정밀한 모델을 써도, 아무리 튜닝을 정성 들여 해도,

    **“전체 정확도는 높지만 정작 중요한 클래스를 잘 못 맞춘다”**는 경험,

    있으시죠? 이게 바로 클래스 불균형이 가져오는 현실적인 위협입니다.

     

    이번 글에서는 이 문제를 실무에서 분석가들이 실제로 어떻게 풀어가야 하는지 정리해봅니다.

    SMOTE, 언더샘플링, 클래스 가중치, 임계값 조정 등 다양한 기법을 단순 정리 수준이 아니라 상황별 판단 기준과 함께 풀어보겠습니다.

     


     

    1. 클래스 불균형이 왜 문제일까?

     

    클래스 불균형이란 라벨의 분포가 한쪽으로 치우친 상황을 말합니다.

    예를 들어 고객 이탈 예측 문제에서 ‘잔존 고객’이 98%, ‘이탈 고객’이 2%라면?

     

    • 단순히 “이탈 안 한다”고만 예측해도 98% 정확도
    • 하지만 정말 중요한 건 ‘2%의 이탈 고객’을 정확히 맞추는 것

     

    모델은 대부분의 데이터를 본 대로 ‘무난한 예측’을 하려고 하고,

    이로 인해 극단적으로 중요한 소수 클래스는 무시되는 일이 생깁니다.

     


     

    2. 불균형 비율부터 진단하자

     

    먼저 데이터를 확인해볼까요?

    df['target'].value_counts(normalize=True)

    만약 0이 0.95, 1이 0.05라면 불균형 비율은 95:5.

    일반적으로 80:20 이하로 내려가면 클래스 불균형을 고려해야 합니다.

    하지만 비율이 아니라도, 예측 목적에 따라 작은 클래스가 중요하다면 이 역시 문제입니다.

     


     

    3. 주요 해결 전략 정리

     

    클래스 불균형을 해결하는 대표적인 방법은 다음 네 가지입니다:

     

    1. 데이터를 조정한다 → 오버샘플링 / 언더샘플링
    2. 모델에게 알려준다 → 클래스 가중치
    3. 결정 기준을 바꾼다 → 임계값 조정
    4. 모델 구조를 바꾼다 → 이상 탐지나 앙상블 구조

     

    이 중 가장 자주 쓰이는 전략은 SMOTE 기반 오버샘플링, 클래스 가중치 적용, 임계값 조정입니다.

    하나씩 살펴보겠습니다.

     


     

    4. 오버샘플링과 SMOTE

     

     

    4.1 Random Oversampling

     

    • 단순히 소수 클래스의 데이터를 복제해서 늘리는 방식
    • 빠르지만 과적합(overfitting) 위험 있음
    from imblearn.over_sampling import RandomOverSampler
    
    ros = RandomOverSampler()
    X_resampled, y_resampled = ros.fit_resample(X, y)

     

    4.2 SMOTE (Synthetic Minority Over-sampling Technique)

     

    • 소수 클래스 샘플 간 거리를 기반으로 인공 샘플 생성
    • ‘복제’가 아니라 ‘새로 만든다’는 점에서 한 단계 진화
    from imblearn.over_sampling import SMOTE
    
    sm = SMOTE()
    X_resampled, y_resampled = sm.fit_resample(X, y)

    📌 실전 팁

     

    • 수치형 변수 중심일 때 가장 효과적
    • 범주형 변수는 변형된 SMOTE(NC, Borderline-SMOTE) 고려
    • 모델에 투입하기 전, EDA로 클러스터 구조 유지 여부 꼭 확인

     


     

    5. 언더샘플링: 다수 클래스 줄이기

     

    • 반대 전략. 다수 클래스를 무작위로 줄이는 방식
    • 데이터가 충분하지 않거나, 중요한 정보가 날아갈 가능성 있음
    from imblearn.under_sampling import RandomUnderSampler
    
    rus = RandomUnderSampler()
    X_under, y_under = rus.fit_resample(X, y)

    📌 실제 적용 시:

     

    • 트리 모델은 언더샘플링을 써도 성능이 의외로 안정적
    • 신경망은 일반적으로 언더샘플링보다 오버샘플링이 유리

     


     

    6. 클래스 가중치 조정 (model-level solution)

     

    모델에 “소수 클래스가 중요하니 실수하지 마”라고 알려주는 방식입니다.

    Scikit-learn의 대부분 모델에서 class_weight='balanced' 옵션으로 쉽게 사용 가능.

    from sklearn.linear_model import LogisticRegression
    
    model = LogisticRegression(class_weight='balanced')

    📌 핵심

     

    • 클래스 비율에 따라 자동으로 가중치 설정됨
    • 로지스틱 회귀, SVM, 랜덤포레스트 등 대부분 지원
    • 샘플 수 적어도 괜찮을 때 추천
    • 성능 평가 시 반드시 f1_score, roc_auc 등 포함

     


     

    7. 임계값 조정 (Threshold Tuning)

     

    모든 분류 모델은 기본적으로 0.5를 기준으로 클래스 분류를 결정합니다.

    하지만 클래스가 불균형일 경우, 이 기준을 낮추거나 높이는 것만으로도 Recall이나 Precision이 확 바뀔 수 있습니다.

    y_proba = model.predict_proba(X_test)[:, 1]
    y_pred = (y_proba >= 0.3).astype(int)

     

    • 0.3, 0.2 등으로 낮추면 Recall ↑, Precision ↓
    • 어떤 게 더 중요한지는 업무 목적이 결정

     

    📌 이 방법은 의료, 보안, 금융민감도(Recall)가 중요한 영역에서 자주 사용됩니다.

     


     

    8. 불균형 문제의 궁극적 기준은 ‘업무’

     

    클래스 불균형은 단지 숫자 문제 같지만,

    사실은 업무에서 어떤 실수를 허용하고, 어떤 실수를 절대 피해야 하는가에 대한 이야기입니다.

     

    • 의료 분야: 질병을 놓치는 False Negative가 치명적 → Recall 우선
    • 스팸 필터: 정상 메일을 지우면 안 됨 → Precision 우선
    • 사기 거래 탐지: 둘 다 중요하지만 놓치는 것 더 무서움 → F1, AUC

     


     

    9. 실전에서 자주 쓰는 조합

    상황추천 전략

    소수 클래스 5% 이하 SMOTE + 클래스 가중치
    데이터 양 적음 언더샘플링 + 간단 모델
    의료/보안 목적 임계값 조정 + Recall 기반 평가
    분류 기준이 명확치 않음 ROC Curve, Precision-Recall Curve 비교

     

     

    균형은 데이터 안에 있지 않다, 우리가 만들어야 한다

     

    클래스 불균형은 데이터가 만든 문제가 아니라,

    현실이 가지는 불균형한 구조가 모델에까지 영향을 주는 것입니다.

    좋은 분석가는 이걸 그냥 받아들이지 않습니다.

    데이터를 재구성하고, 모델을 설계하며, 최종 판단 기준을 현실에 맞게 조정하는 역할까지 해냅니다.

     

    다음 13화에서는 실전 분류 문제를 해결할 때 꼭 마주치는 또 하나의 주제,

    모델 해석: SHAP, LIME을 활용한 인공지능 설명 기법과 그 실제 활용법을 소개합니다.

    728x90
Designed by Tistory.