현실의 분류 문제는 대부분 불균형하다. 사기는 0.1%, 질병 양성은 2%, 이탈은 5% — 정작 잡고 싶은 것이 소수 클래스다. 원본 불균형 데이터로 학습하면 모델은 전부 다수 클래스로 찍어 놓고도 높은 정확도를 얻는다.
양성이 2%인 데이터에서 "전부 음성"이라고 예측하면 정확도 98%가 나온다. 그런데 정작 관심 있는 양성은 하나도 못 잡는다. 이것이 정확도 역설(accuracy paradox)이다.
예측
양성 음성
┌───────────┬───────────┐
양성 │ TP │ FN │ ← 놓친 양성. 재현율을 깎는다
실제 ├───────────┼───────────┤
음성 │ FP │ TN │ ← 거짓 경보. 정밀도를 깎는다
└───────────┴───────────┘
↑
불균형에서는 TN이 압도적으로 커서
정확도 = (TP+TN)/전체 가 TN에 지배된다
불균형 데이터에서는 PR-AUC가 ROC-AUC보다 유용하다. ROC의 x축(거짓 양성률)은 분모에 음성 전체(TN+FP)가 들어가 소수 클래스의 오류가 희석된다. PR 곡선은 양성에 집중하므로 소수 클래스 성능 변화에 민감하다. 그래서 "사기처럼 양성이 희소하면 PR-AUC로 평가한다"가 정석이다.
⚠️ 함정: 지표는 비즈니스 비용에서 역산해야 한다. 사기 탐지에서 미탐지(FN)는 손실로 직결되고 오탐(FP)은 사람이 한 번 더 확인하면 그만이다 → 재현율 우선. 반대로 대량 마케팅에서 오탐은 곧 비용이므로 정밀도 우선이다. "어떤 지표가 좋은가"가 아니라 "어떤 실수가 더 비싼가"를 먼저 읽어야 한다.
SMOTE(Synthetic Minority Over-sampling Technique)는 소수 클래스 샘플의 k-최근접 이웃을 찾아 그 사이를 보간해 새 점을 만든다. 단순 복제와 달리 결정 경계 주변을 일반화하는 효과가 있지만 단점도 있다 — 노이즈·겹침 영역에서는 비현실적인 샘플을 만들 수 있고, 범주형 특성에는 직접 적용되지 않으며(SMOTE-NC 변형이 필요), 고차원에서는 보간의 의미가 옅어진다.
⚠️ 함정: 리샘플링은 학습·테스트 분할 이후, 학습셋에만 적용해야 한다. 분할 전에 SMOTE를 적용하면 합성된 양성이 학습셋과 검증셋 양쪽에 섞여 데이터 누수가 생기고 성능이 부풀려진다. 교차검증에서는 imblearn의 Pipeline을 써서 각 fold 안에서 리샘플링해야 한다.
[잘못된 순서 — 누수] [올바른 순서]
전체 데이터 전체 데이터
│ │
SMOTE 적용 분할 (train / valid)
│ │
분할 (train / valid) train에만 SMOTE
│ │
✗ 같은 원본에서 나온 합성 점이 ✓ valid는 원래 분포 그대로
train과 valid에 나뉘어 들어감 → 성능 추정이 정직하다
→ 검증 점수가 부풀려짐
from sklearn.linear_model import LogisticRegression# 클래스 빈도의 역수로 자동 가중clf = LogisticRegression(class_weight="balanced")# XGBoost: 음성/양성 비율로 scale_pos_weight 설정# scale_pos_weight = (음성 수) / (양성 수)import xgboost as xgbmodel = xgb.XGBClassifier(scale_pos_weight=49) # 음성:양성 = 49:1
방법
데이터 변경
강점
약점
리샘플링
있음
직관적, 어떤 모델에도 적용
누수·과적합·정보 손실 주의
클래스 가중치
없음
데이터 그대로, 빠름
모델이 지원해야 함
임계값 조정
없음
학습 후 조정, 운영 중에도 가능
적절한 임계값을 찾는 작업이 필요
분류기는 보통 확률 0.5를 임계값으로 쓰지만, 불균형에서는 이 기본값이 통하지 않는다. 임계값 이동(threshold moving)은 재학습 없이 PR 곡선이나 비용 행렬을 보고 재현율-정밀도 트레이드오프를 조정하게 해 준다. 미탐지(사기를 놓침)의 비용이 큰 경우 임계값을 낮춰 재현율을 올린다.
확률 임계값을 움직이면 두 지표가 반대로 움직인다
임계값 낮춤 ←─────────── 0.5 ───────────→ 임계값 높임
양성이라 부르는 범위 넓어짐 좁아짐
재현율 ↑ 정밀도 ↓ 재현율 ↓ 정밀도 ↑
놓친 양성 ↓ 거짓 경보 ↑ 놓친 양성 ↑ 거짓 경보 ↓
(사기 탐지 · 질병 스크리닝) (대량 발송 · 자동 차단)
임계값을 정하는 방법
하는 일
언제
PR 곡선에서 F1 최대점
정밀도·재현율 균형점 선택
어느 쪽도 특별히 비싸지 않을 때
목표 재현율 고정
"양성의 90%는 잡는다"를 만족하는 최저 임계값
규제·정책상 검출률이 정해져 있을 때
비용 행렬 기반
FP·FN에 비용을 매겨 기대 비용 최소화
실수 비용을 금액으로 환산할 수 있을 때
운영 용량 기반
하루에 검토 가능한 건수에 맞춰 상위 N건만
사람이 후속 검토를 해야 할 때
임계값은 검증셋에서 정하고 테스트셋으로 확인해야 한다. 테스트셋을 보고 임계값을 고르면 그 점수는 더 이상 일반화 성능이 아니다. 리샘플링·스케일링과 같은 종류의 누수다.