데이터 불균형(Data Imbalance)은 분류 문제에서 특정 클래스의 데이터 개수가 다른 클래스보다 현저히 많거나 적을 때 발생하는 문제입니다. 예를 들어, 스팸 이메일 탐지에서 정상 이메일이 95%, 스팸 이메일이 5%라면, 모델이 단순히 "정상"만 예측해도 95% 정확도를 얻을 수 있습니다. 하지만 이는 실제로 유의미한 분류가 이루어지지 않는다는 문제가 있습니다.
이러한 데이터 불균형 문제를 해결하기 위해 가장 일반적으로 사용되는 기법이 샘플링(Sampling) 기법입니다.
샘플링 기법은 데이터를 조정하여 각 클래스 간 균형을 맞추는 방법입니다. 대표적인 방법으로 언더샘플링(Undersampling)과 오버샘플링(Oversampling)이 있습니다.
언더샘플링은 데이터가 많은 클래스(majority class)의 일부 데이터를 제거하여 클래스 균형을 맞추는 방법입니다.
from imblearn.under_sampling import RandomUnderSampler
from sklearn.datasets import make_classification
# 가상의 데이터 생성
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9],
n_clusters_per_class=1, n_samples=1000, random_state=10)
# 랜덤 언더샘플링 적용
rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X, y)
오버샘플링은 데이터가 적은 클래스(minority class)의 데이터를 복제하거나 합성하여 개수를 늘리는 방법입니다.
from imblearn.over_sampling import SMOTE
# SMOTE 오버샘플링 적용
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
SMOTE는 단순히 데이터를 복제하는 것이 아니라, 소수 클래스의 데이터를 기반으로 새로운 데이터를 생성하는 기법입니다.
이 방법은 단순 복제보다 과적합 위험을 줄이고, 데이터의 다양성을 확보할 수 있습니다.
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTE
# 가상의 데이터 생성
X, y = make_classification(n_classes=2, class_sep=2, weights=[0.1, 0.9],
n_clusters_per_class=1, n_samples=1000, random_state=10)
# SMOTE 오버샘플링 적용
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)
| 기법 | 설명 | 장점 | 단점 |
|---|---|---|---|
| 언더샘플링 | 다수 클래스 데이터를 일부 제거 | 학습 속도 향상 | 데이터 손실 가능성 |
| 오버샘플링 | 소수 클래스 데이터를 복제하여 증가 | 데이터 손실 없음 | 과적합 가능성 |
| SMOTE | 소수 클래스 데이터를 기반으로 새로운 데이터 생성 | 과적합 방지, 데이터 다양성 확보 | 데이터 품질에 따라 효과가 달라짐 |
데이터 불균형 문제를 해결하기 위해 언더샘플링과 오버샘플링을 사용할 수 있으며, SMOTE와 같은 기법을 적용하면 보다 자연스럽게 데이터 균형을 맞출 수 있습니다. 프로젝트의 데이터 특성과 목적에 맞춰 적절한 기법을 선택하는 것이 중요합니다.