데이터 불균형 문제 해결 - 샘플링

Ryan·2025년 2월 5일

Python/Pandas

목록 보기
17/23

1. 데이터 불균형 문제란?

데이터 불균형(Data Imbalance)은 분류 문제에서 특정 클래스의 데이터 개수가 다른 클래스보다 현저히 많거나 적을 때 발생하는 문제입니다. 예를 들어, 스팸 이메일 탐지에서 정상 이메일이 95%, 스팸 이메일이 5%라면, 모델이 단순히 "정상"만 예측해도 95% 정확도를 얻을 수 있습니다. 하지만 이는 실제로 유의미한 분류가 이루어지지 않는다는 문제가 있습니다.

이러한 데이터 불균형 문제를 해결하기 위해 가장 일반적으로 사용되는 기법이 샘플링(Sampling) 기법입니다.

2. 샘플링(Sampling) 기법

샘플링 기법은 데이터를 조정하여 각 클래스 간 균형을 맞추는 방법입니다. 대표적인 방법으로 언더샘플링(Undersampling)오버샘플링(Oversampling)이 있습니다.

2.1 언더샘플링(Undersampling)

언더샘플링은 데이터가 많은 클래스(majority class)의 일부 데이터를 제거하여 클래스 균형을 맞추는 방법입니다.

  • 장점: 데이터 크기가 줄어들어 학습 속도가 빨라지고 계산 비용이 낮아짐
  • 단점: 중요한 정보를 잃을 가능성이 있음
  • 적용 사례: 데이터가 충분히 많고, 다수 클래스에서 일부 데이터를 제거해도 충분한 패턴을 학습할 수 있는 경우

언더샘플링 예제 코드 (Random UnderSampling)

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)

2.2 오버샘플링(Oversampling)

오버샘플링은 데이터가 적은 클래스(minority class)의 데이터를 복제하거나 합성하여 개수를 늘리는 방법입니다.

  • 장점: 소수 클래스의 데이터가 충분히 제공되어 모델이 더 다양한 패턴을 학습할 수 있음
  • 단점: 중복된 데이터가 추가될 경우 과적합(overfitting) 위험이 있음
  • 적용 사례: 데이터가 적어서 중요한 패턴을 학습하기 어려운 경우

오버샘플링 예제 코드 (SMOTE 적용)

from imblearn.over_sampling import SMOTE

# SMOTE 오버샘플링 적용
smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X, y)

3. SMOTE (Synthetic Minority Over-sampling Technique)

SMOTE는 단순히 데이터를 복제하는 것이 아니라, 소수 클래스의 데이터를 기반으로 새로운 데이터를 생성하는 기법입니다.

  • 작동 방식:
    1. 소수 클래스 데이터 포인트를 선택
    2. K-최근접이웃(KNN) 방법을 사용하여 주변 데이터 포인트를 찾음
    3. 원래 데이터와 주변 데이터 사이에서 랜덤한 위치의 데이터를 생성

이 방법은 단순 복제보다 과적합 위험을 줄이고, 데이터의 다양성을 확보할 수 있습니다.

SMOTE 데이터 생성 과정

  1. 원본 데이터 (좌측 그림)
  2. SMOTE 기법으로 생성된 가상의 데이터 (중앙 그림)
  3. 데이터가 균형을 이루는 최종 결과 (우측 그림)

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)

4. 샘플링 기법 비교

기법설명장점단점
언더샘플링다수 클래스 데이터를 일부 제거학습 속도 향상데이터 손실 가능성
오버샘플링소수 클래스 데이터를 복제하여 증가데이터 손실 없음과적합 가능성
SMOTE소수 클래스 데이터를 기반으로 새로운 데이터 생성과적합 방지, 데이터 다양성 확보데이터 품질에 따라 효과가 달라짐

5. 결론

데이터 불균형 문제를 해결하기 위해 언더샘플링과 오버샘플링을 사용할 수 있으며, SMOTE와 같은 기법을 적용하면 보다 자연스럽게 데이터 균형을 맞출 수 있습니다. 프로젝트의 데이터 특성과 목적에 맞춰 적절한 기법을 선택하는 것이 중요합니다.

0개의 댓글