불균형 데이터 (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-최근접 이웃 사이를 보간하여 새 샘플을 생성한다.
핵심 규칙: SMOTE는 반드시 학습 데이터에만 적용해야 한다. 교차 검증을 사용할 때는 각 fold 내부에서만 적용해야 한다. 교차 검증 전에 적용하면 합성 샘플이 검증 세트에 포함되어 데이터 누수가 발생한다.
3. 알고리즘 수준 방법 (Algorithm-Level Methods)¶
Class Weights (클래스 가중치)¶
손실 함수에 역빈도 가중치를 부여한다:
대부분의 프레임워크에서 class_weight='balanced'로 간단히 적용 가능하다.
Focal Loss¶
- \(\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 실무 가이드라인¶
-
먼저 적절한 평가 지표를 설정하라. Accuracy로는 불균형 데이터의 모델 성능을 판단할 수 없다.
-
가장 간단한 방법부터: class weights → SMOTE → Focal Loss → 앙상블 순으로 시도한다.
-
비즈니스 맥락을 고려: 사기 탐지에서 precision이 중요한지(오탐 비용), recall이 중요한지(미탐 비용)에 따라 전략이 달라진다.
-
오류 분석: 소수 클래스의 오분류 패턴을 분석하면, 추가 특성이나 전처리 개선점을 발견할 수 있다.
언제 사용하는가¶
| 상황 | 추천 방법 |
|---|---|
| 약한 불균형 (10:1 이내) | Class weights |
| 중간 불균형 (100:1 이내) | SMOTE + Class weights / Focal Loss |
| 극심한 불균형 (1000:1+) | 이상 탐지 접근, 앙상블 |
| 실시간 임계값 조정 필요 | Threshold moving |
| 객체 탐지 | Focal Loss |
흔한 오해와 함정¶
-
SMOTE를 교차 검증 전에 적용: 가장 흔하고 심각한 실수. 합성 샘플이 검증 세트에 영향을 미쳐 성능이 과대 추정된다.
-
"Accuracy가 95%이니 좋은 모델이다": 불균형 데이터에서 높은 accuracy는 의미 없다. 소수 클래스의 recall과 precision을 반드시 확인하라.
-
오버샘플링으로 테스트 세트도 변경: 테스트 세트는 실제 데이터 분포를 반영해야 한다. 오버/언더샘플링은 학습 데이터에만 적용한다.
-
모든 불균형 문제에 SMOTE 적용: 고차원 데이터나 복잡한 경계에서 SMOTE가 노이즈를 생성할 수 있다. class weights가 더 안전한 경우도 많다.
-
비용 비대칭을 무시: "어떤 오류가 더 비싼가"를 고려하지 않으면, 최적화 방향이 잘못될 수 있다.