콘텐츠로 이동

불균형 데이터 (Imbalanced Data)

개요

불균형 데이터(Imbalanced Data)는 클래스 간 샘플 수의 비율이 극단적으로 다른 데이터를 말한다. 사기 탐지(0.1%), 희귀 질환 진단(1%), 불량품 검출 등 실무의 많은 문제가 여기에 해당한다. 불균형 데이터에서는 다수 클래스에 편향된 모델이 높은 정확도(accuracy)를 보이면서도 실제로는 소수 클래스를 전혀 탐지하지 못하는 문제가 발생한다.


핵심 개념

1. 왜 Accuracy가 부적합한 지표인가

99:1 비율의 데이터에서 "모두 다수 클래스"로 예측하면: - Accuracy: 99% (높아 보임) - 소수 클래스 Recall: 0% (전혀 탐지 못함)

적절한 평가 지표: F1 Score, AUROC, AUPRC, MCC (Matthews Correlation Coefficient)

특히 AUPRC (Area Under Precision-Recall Curve)가 불균형 상황에서 가장 정보적이다.

2. 데이터 수준 방법 (Data-Level Methods)

방법 설명 장점 단점
Random Oversampling 소수 클래스 복제 단순 과적합 위험
Random Undersampling 다수 클래스 축소 학습 속도 향상 정보 손실
SMOTE 소수 클래스 간 보간으로 합성 새로운 샘플 생성 노이즈 생성 가능
Borderline-SMOTE 경계 근처 소수 샘플에 집중 SMOTE 개선 경계 정의 필요
ADASYN 어려운 샘플에 더 많은 합성 적응적 노이즈 민감
Tomek Links 경계 다수 클래스 제거 경계 정리 데이터 손실

SMOTE (Synthetic Minority Oversampling Technique):

소수 클래스의 기존 샘플과 그 k-최근접 이웃 사이를 보간하여 새 샘플을 생성한다.

\[x_{new} = x_i + \lambda \cdot (x_{nn} - x_i), \quad \lambda \sim U(0, 1)\]

핵심 규칙: SMOTE는 반드시 학습 데이터에만 적용해야 한다. 교차 검증을 사용할 때는 각 fold 내부에서만 적용해야 한다. 교차 검증 전에 적용하면 합성 샘플이 검증 세트에 포함되어 데이터 누수가 발생한다.

3. 알고리즘 수준 방법 (Algorithm-Level Methods)

Class Weights (클래스 가중치)

손실 함수에 역빈도 가중치를 부여한다:

\[w_c = \frac{N}{C \cdot n_c}\]

대부분의 프레임워크에서 class_weight='balanced'로 간단히 적용 가능하다.

Focal Loss

\[FL(p_t) = -\alpha_t (1 - p_t)^\gamma \log(p_t)\]
  • \(\gamma = 0\)이면 일반 Cross-Entropy와 동일
  • \(\gamma = 2\)가 일반적 (RetinaNet에서 제안)
  • 직관: 쉬운 예제(높은 \(p_t\))의 손실 기여를 감소시켜, 모델이 어려운 예제에 집중하게 함

Cost-Sensitive Learning

오분류 비용을 비대칭으로 설정한다. 예를 들어, 사기를 정상으로 오분류하는 비용이 정상을 사기로 오분류하는 비용보다 훨씬 큰 경우.

4. 임계값 조정 (Threshold Moving)

분류 모델의 기본 임계값 0.5를 조정하여 precision-recall 균형을 변경한다.

최적 임계값 탐색 방법: - ROC 곡선에서 Youden's J statistic 최대화 - PR 곡선에서 F1 최대 지점 - 비즈니스 비용 함수 최소화

5. 앙상블 방법

방법 설명
BalancedBagging 각 base learner에 균형 잡힌 부분집합 사용
EasyEnsemble 여러 undersampled subset으로 앙상블
BalancedRandomForest 각 트리에서 bootstrap 시 클래스 균형 유지

상세 내용

불균형 비율에 따른 전략 선택

flowchart TD
    A["불균형 데이터 처리"] --> B{"소수 클래스 비율?"}

    B -->|"10~40%"| C["Class weights<br>또는 약간의 오버샘플링"]
    B -->|"1~10%"| D["SMOTE + Class weights<br>Focal Loss"]
    B -->|"< 1%"| E{"소수 클래스 샘플 수?"}

    E -->|"> 100개"| F["SMOTE + 앙상블<br>Focal Loss"]
    E -->|"< 100개"| G["이상 탐지(Anomaly Detection)<br>접근 고려"]

    C --> H["적절한 평가 지표 설정<br>F1, AUROC, AUPRC"]
    D --> H
    F --> H
    G --> H

실무 가이드라인

  1. 먼저 적절한 평가 지표를 설정하라. Accuracy로는 불균형 데이터의 모델 성능을 판단할 수 없다.

  2. 가장 간단한 방법부터: class weights → SMOTE → Focal Loss → 앙상블 순으로 시도한다.

  3. 비즈니스 맥락을 고려: 사기 탐지에서 precision이 중요한지(오탐 비용), recall이 중요한지(미탐 비용)에 따라 전략이 달라진다.

  4. 오류 분석: 소수 클래스의 오분류 패턴을 분석하면, 추가 특성이나 전처리 개선점을 발견할 수 있다.


언제 사용하는가

상황 추천 방법
약한 불균형 (10:1 이내) Class weights
중간 불균형 (100:1 이내) SMOTE + Class weights / Focal Loss
극심한 불균형 (1000:1+) 이상 탐지 접근, 앙상블
실시간 임계값 조정 필요 Threshold moving
객체 탐지 Focal Loss

흔한 오해와 함정

  1. SMOTE를 교차 검증 전에 적용: 가장 흔하고 심각한 실수. 합성 샘플이 검증 세트에 영향을 미쳐 성능이 과대 추정된다.

  2. "Accuracy가 95%이니 좋은 모델이다": 불균형 데이터에서 높은 accuracy는 의미 없다. 소수 클래스의 recall과 precision을 반드시 확인하라.

  3. 오버샘플링으로 테스트 세트도 변경: 테스트 세트는 실제 데이터 분포를 반영해야 한다. 오버/언더샘플링은 학습 데이터에만 적용한다.

  4. 모든 불균형 문제에 SMOTE 적용: 고차원 데이터나 복잡한 경계에서 SMOTE가 노이즈를 생성할 수 있다. class weights가 더 안전한 경우도 많다.

  5. 비용 비대칭을 무시: "어떤 오류가 더 비싼가"를 고려하지 않으면, 최적화 방향이 잘못될 수 있다.


다른 주제와의 연결