TIL(Today I Learned)
1️⃣데이터 불균형과 샘플링 기법
데이터 불균형이란?
각 클래스에 속하는 샘플 수가 크게 차이 나는 상태를 말한다. 예를 들어 사기 탐지 데이터에서 정상 거래 99%, 사기 거래 1%라면, 모델이 모든 케이스를 "정상"으로 예측해도 정확도 99%를 달성한다. 그래서 정작 탐지해야 할 소수 클래스를 제대로 학습하지 못하는 문제가 생긴다.
불균형 데이터에서는 Accuracy 대신 Precision, Recall, F1-score, AUC-ROC 같은 지표를 함께 봐야 한다.
샘플링 기법
클래스 간 데이터 수를 맞춰주는 방식으로, 크게 오버샘플링과 언더샘플링으로 나뉜다.
오버샘플링
소수 클래스의 샘플 수를 늘리는 방법이다.
- Random Oversampling : 소수 클래스 샘플을 단순 복제한다. 구현이 쉽지만 과적합 위험이 있다.
- SMOTE : 기존 소수 클래스 샘플 사이를 보간해 새로운 합성 샘플을 만든다. 단순 복제보다 다양성이 높아 가장 널리 쓰인다.
언더샘플링
다수 클래스의 샘플 수를 줄이는 방법이다.
- Random Undersampling : 다수 클래스 샘플을 무작위로 제거한다. 학습 속도가 빠르지만 유용한 정보를 잃을 수 있다.
하이브리드
두 방법을 조합한다.
- SMOTE + Tomek Links : SMOTE로 소수 클래스를 늘린 뒤, 클래스 경계 근처의 노이즈 샘플을 제거해 결정 경계를 정리한다.
SMOTE (Synthetic Minority Over-sampling Technique)
SMOTE는 소수 클래스 샘플을 단순 복제하지 않고, 기존 샘플 사이를 보간해 새로운 합성 샘플을 생성하는 방법이다. 2002년 Chawla et al.이 제안했으며 현재까지도 가장 널리 쓰이는 오버샘플링 기법이다.
동작 원리
- 소수 클래스 샘플 하나를 선택한다.
- 그 샘플의 k-최근접 이웃(k-NN)을 찾는다 (보통 k=5).
- 이웃 중 하나를 무작위로 선택한다.
- 두 샘플 사이의 임의의 지점에 새로운 합성 샘플을 생성한다.
수식으로 표현하면 다음과 같다.
새 샘플 = 기존 샘플 + λ × (이웃 샘플 - 기존 샘플)
λ는 0~1 사이의 난수이므로, 새 샘플은 항상 두 샘플을 잇는 선분 위에 생성된다.
Random Oversampling과의 차이
| 방식 | 기존 샘플 복제 | 새 샘플 합성 |
| 다양성 | 낮음 | 높음 |
| 과적합 위험 | 높음 | 상대적으로 낮음 |
| 계산 비용 | 낮음 | 높음 |
SMOTE 변형 기법
기본 SMOTE의 단점을 보완한 여러 변형이 있다.
- Borderline-SMOTE : 결정 경계 근처의 샘플에서만 합성한다. 경계 부근을 더 정밀하게 학습할 수 있다.
- ADASYN : 학습하기 어려운 샘플 주변에 더 많은 합성 샘플을 생성한다. 밀도 기반으로 샘플 수를 조절한다.
- SMOTE-NC : 수치형과 범주형 변수가 섞인 데이터에 적용 가능한 버전이다.
- SMOTE + Tomek Links : SMOTE로 샘플을 늘린 뒤, 경계 근처의 노이즈 샘플을 제거해 결정 경계를 깔끔하게 정리한다.
한계점
- 고차원 데이터에 취약하다 : 차원이 높을수록 k-NN 거리 계산이 부정확해지고 의미 없는 샘플이 생성될 수 있다.
- 범주형 변수에 바로 적용이 어렵다 : 보간이 수치형 변수 기준으로 작동하기 때문에 범주형 변수는 별도 처리가 필요하다.
- 노이즈 샘플 주변에도 합성한다 : 이상치 근처에서도 샘플을 만들어 오히려 노이즈를 증폭시킬 수 있다. Borderline-SMOTE나 Tomek Links로 보완하는 이유가 여기에 있다.
Python 예시
from imblearn.over_sampling import SMOTE
smote = SMOTE(k_neighbors=5, random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
💡 느낀점
데이터 불균형을 공부하면서 정확도가 높아도 좋은 모델이 아닐 수 있다는 걸 느꼈다. 소수 클래스를 무시해도 높은 정확도가 나오는 상황은 사기 탐지나 질병 진단처럼 소수 클래스가 오히려 더 중요한 현실 문제에서 치명적이다. SMOTE는 단순 복제가 샘플을 합성한다는 것과, 고차원이나 노이즈 샘플 근처에서 취약하다는 한계를 보면서 데이터를 늘리는 것도 단순한 문제가 아니라는 걸 알게 됐다.
'데이터 분석 심화' 카테고리의 다른 글
| Chapter.4 데이터 분석 심화(11) (0) | 2026.04.28 |
|---|---|
| Chapter.4 데이터 분석 심화(9) (1) | 2026.04.23 |
| Chapter.4 데이터 분석 심화(8) (0) | 2026.04.22 |
| Chapter.4 데이터 분석 심화(7) (0) | 2026.04.21 |
| Chapter.4 데이터 분석 심화(6) (1) | 2026.04.20 |