본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 불균형 데이터셋 해결을 위한 SMOTE 한계와 7가지 대안 방법 및 성능 차이

by Papa Martino V 2026. 4. 19.
728x90

SMOTE(Synthetic Minority Over-sampling Technique)
SMOTE (Synthetic Minority Over-sampling Technique)

 

금융 사기 탐지(Fraud Detection), 희귀 질병 진단, 시스템 장애 예측 등 현실 세계의 데이터는 대부분 불균형 데이터셋(Imbalanced Data)의 형태를 띱니다. 다수 클래스(Majority)가 99%를 차지할 때, 모델이 모든 샘플을 다수 클래스로 예측만 해도 정확도(Accuracy)는 99%가 나오지만 정작 중요한 소수 클래스(Minority)는 전혀 찾아내지 못하는 '정확도의 역설'에 빠지게 됩니다. 이를 해결하기 위해 가장 널리 쓰이는 기법이 바로 SMOTE(Synthetic Minority Over-sampling Technique)입니다. 하지만 SMOTE는 만능이 아닙니다. 본 포스팅에서는 SMOTE가 가진 결정적인 한계와 이를 극복하기 위한 7가지 전문적인 대안 기술을 심층 분석하여, 현업 개발자가 직면한 성능 병목을 해결하는 통찰을 제공합니다.


1. 데이터 불균형 해결 기법의 메커니즘 차이 비교

단순히 데이터를 복제하는 오버샘플링부터, 합성 데이터를 생성하거나 가중치를 조정하는 방식까지 다양한 접근법이 존재합니다. 아래 표는 각 방식의 핵심 해결 원리를 요약한 것입니다.

기술 명칭 주요 메커니즘 장점 한계점 (차이)
SMOTE K-최근접 이웃 간 선형 보간 정보 손실 없음, 간단한 구현 이상치(Outlier) 확대, 노이즈 생성
Borderline-SMOTE 경계 영역 샘플 집중 생성 결정 경계(Decision Boundary) 강화 경계가 모호한 데이터에서 성능 저하
ADASYN 학습 어려운 샘플에 가중치 부여 데이터 밀도 적응형 샘플링 노이즈가 많은 영역에 과적합 위험
Tomek Links 가까운 이종 클래스 쌍 제거 클래스 간 중첩(Overlap) 해결 소수 데이터 보존력 약화
Cost-Sensitive 손실 함수(Loss)에 가중치 부여 데이터 변형 없이 모델 수준 해결 가중치 파라미터 튜닝 난이도 높음

2. 실무 해결을 위한 Python 샘플 예제 (7가지 케이스)

파이썬의 imbalanced-learn 라이브러리를 활용하여 실무 파이프라인에 즉시 통합 가능한 코드 샘플을 구성했습니다.

Example 1: SMOTE의 기본 적용과 오버샘플링 비율 제어

가장 표준적인 사용법으로, 특정 비율까지 소수 클래스를 생성하는 방법입니다.

from imblearn.over_sampling import SMOTE
import pandas as pd

# sampling_strategy를 통해 소수 클래스를 다수 클래스의 50% 수준까지 생성
smote = SMOTE(sampling_strategy=0.5, k_neighbors=5, random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

print(f"Resampled dataset shape: {pd.Series(y_resampled).value_counts()}")
    

Example 2: Borderline-SMOTE를 활용한 경계면 강화

클래스 간 경계에 위치한 샘플들에 집중하여 분류기의 변별력을 높이는 해결책입니다.

from imblearn.over_sampling import BorderlineSMOTE

# kind='borderline-1' 또는 'borderline-2' 선택 가능
bsmote = BorderlineSMOTE(kind='borderline-1', random_state=42)
X_border, y_border = bsmote.fit_resample(X_train, y_train)
    

Example 3: ADASYN을 이용한 학습 난이도 기반 샘플링

다수 클래스에 둘러싸여 학습이 어려운 소수 샘플 주변에 데이터를 더 많이 생성합니다.

from imblearn.over_sampling import ADASYN

adasyn = ADASYN(n_neighbors=5, random_state=42)
X_ada, y_ada = adasyn.fit_resample(X_train, y_train)
    

Example 4: SMOTE-Tomek 결합을 통한 노이즈 제거 하이브리드 전략

오버샘플링 후 클래스 간 경계가 겹치는 노이즈를 클리닝(Cleaning)하여 깔끔한 경계를 만듭니다.

from imblearn.combine import SMOTETomek
from imblearn.under_sampling import TomekLinks

# TomekLinks 객체를 생성하여 SMOTE와 결합
smt = SMOTETomek(tomek=TomekLinks(sampling_strategy='all'), random_state=42)
X_combined, y_combined = smt.fit_resample(X_train, y_train)
    

Example 5: 분류 모델 자체의 Class Weight 가중치 활용

데이터를 건드리지 않고, 모델이 소수 클래스를 틀렸을 때 더 큰 벌점을 주도록 설정하는 해결 방법입니다.

from sklearn.ensemble import RandomForestClassifier

# class_weight='balanced' 설정 시 자동으로 비율의 역수를 가중치로 할당
clf = RandomForestClassifier(n_estimators=100, class_weight='balanced', random_state=42)
clf.fit(X_train, y_train)
    

Example 6: Balanced Bagging을 통한 앙상블 내부 샘플링

학습 과정에서 각 부트스트랩 샘플링 시 자동으로 균형을 맞추어 학습하는 고성능 기법입니다.

from imblearn.ensemble import BalancedBaggingClassifier
from sklearn.tree import DecisionTreeClassifier

bbc = BalancedBaggingClassifier(base_estimator=DecisionTreeClassifier(),
                                sampling_strategy='auto',
                                replacement=False,
                                random_state=42)
bbc.fit(X_train, y_train)
    

Example 7: Pipeline을 이용한 교차 검증 시 데이터 누수(Leakage) 방지

가장 중요한 실무 팁으로, 검증 데이터까지 샘플링되는 실수를 막기 위해 파이프라인을 사용합니다.

from imblearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score

# 반드시 imblearn의 Pipeline을 사용해야 함 (sklearn Pipeline은 resample 미지원)
model_pipe = Pipeline([
    ('smote', SMOTE(random_state=42)),
    ('classifier', RandomForestClassifier())
])

scores = cross_val_score(model_pipe, X_train, y_train, cv=5, scoring='f1')
print(f"Cross-validated F1-score: {scores.mean():.4f}")
    

3. 전문가의 시각: SMOTE의 치명적인 한계와 비즈니스 영향

SMOTE는 기본적으로 소수 클래스 샘플 사이의 '직선' 위에서 데이터를 생성합니다. 만약 데이터가 고차원 공간에서 복잡한 비선형 매니폴드 구조를 가지고 있다면, SMOTE가 생성한 데이터는 실제 존재할 수 없는 유령 데이터(Ghost Data)가 되어 모델의 일반화 능력을 떨어뜨립니다. 또한, 소수 클래스 내에 노이즈(이상치)가 섞여 있을 경우, SMOTE는 그 노이즈를 주변으로 확산시켜 다수 클래스의 영역을 침범하게 만듭니다. 이는 실제 금융 사기 시스템에서 오탐(False Positive)을 급증시키는 원인이 되기도 합니다. 따라서 Tomek LinksEdited Nearest Neighbors(ENN)와 같은 클리닝 기법을 반드시 병행하는 하이브리드 전략이 필수적입니다.


4. 결론: 최적의 불균형 해결 로드맵

성능 차이를 해결하기 위한 최적의 순서는 다음과 같습니다.

  • 먼저 모델 파라미터인 class_weight를 조정해 봅니다. (가장 안전함)
  • 클래스 중첩이 심하다면 Borderline-SMOTESMOTE-Tomek을 적용합니다.
  • 데이터 양이 충분히 많다면 하이브리드 샘플링을, 적다면 앙상블 기반의 Balanced Random Forest를 고려하십시오.
  • 평가 지표는 절대 Accuracy가 아닌 F1-ScorePrecision-Recall AUC를 사용해야 합니다.

내용 출처 및 참고 문헌

  • Chawla, N. V., et al. "SMOTE: Synthetic Minority Over-sampling Technique" (2002)
  • He, H., et al. "ADASYN: Adaptive Synthetic Sampling Approach for Imbalanced Learning" (2008)
  • Imbalanced-learn Library Documentation: "User Guide - Over-sampling"
  • Machine Learning Mastery: "SMOTE for Imbalanced Classification"
728x90