데이터 분석과 머신러닝의 발전과 함께, 우리는 다양한 데이터셋을 다루어야 합니다. 그러나 많은 현실 세계의 데이터셋은 클래스 간의 불균형 문제를 안고 있습니다. 이러한 불균형 데이터셋에서는 모델 성능의 저하가 발생할 수 있으며, 이는 예측의 신뢰성을 떨어뜨리는 주요 요인입니다. 본 글에서는 불균형 데이터셋에서 성능 저하를 해결하기 위한 리샘플링 기법에 대해 알아보겠습니다.

불균형 데이터셋의 문제

불균형 데이터셋이란 특정 클래스의 표본이 다른 클래스에 비해 현저히 적은 경우를 말합니다. 예를 들어, 스팸 이메일 분류 문제에서 스팸 이메일이 정상 이메일보다 적은 경우, 모델은 일반 이메일을 잘 분류할 수 있지만 스팸 이메일을 잘 식별하지 못할 수 있습니다. 이로 인해 정확도(accuracy)가 높더라도, 실제로는 중요한 클래스의 성능이 떨어질 수 있습니다.

리샘플링 기법

리샘플링 기법은 불균형 데이터셋의 문제를 해결하기 위해 데이터의 분포를 조정하는 방법입니다. 크게 두 가지 방법으로 나눌 수 있습니다:

  1. 오버샘플링(Over-sampling): 소수 클래스의 데이터를 늘리는 방법입니다.
  2. 언더샘플링(Under-sampling): 다수 클래스의 데이터를 줄이는 방법입니다.

각 기법의 장단점을 이해하고, 상황에 따라 적절한 방법을 선택하는 것이 중요합니다.

오버샘플링 기법

가장 기본적인 오버샘플링 기법은 데이터의 중복을 통해 소수 클래스를 늘리는 방법입니다. 그러나 이 방법은 모델이 중복된 데이터를 학습하게 되어 과적합(overfitting)의 위험이 있습니다. 따라서 SMOTE(Synthetic Minority Over-sampling Technique)와 같은 기법을 사용하는 것이 좋습니다. SMOTE는 소수 클래스의 데이터 포인트 사이에 새로운 샘플을 생성하여 데이터의 다양성을 증가시킵니다.

import pandas as pd
from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

data = pd.read_csv('data.csv')  # 데이터셋 로드
X = data.drop('target', axis=1)
y = data['target']

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)

# SMOTE 오버샘플링 적용
smote = SMOTE()
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

# 모델 학습
model = RandomForestClassifier()
model.fit(X_resampled, y_resampled)

# 예측 및 평가
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

위 코드는 SMOTE를 이용해 오버샘플링을 적용한 후, 랜덤 포레스트 분류기를 학습하고 성능을 평가하는 예제입니다.

언더샘플링 기법

언더샘플링 기법은 다수 클래스의 데이터를 줄이는 방법으로, 주로 랜덤 언더샘플링(Random Under-sampling) 방법이 많이 사용됩니다. 그러나 이 방법은 데이터의 손실이 발생할 수 있기 때문에, 신중하게 접근해야 합니다. 또한, 최적화된 언더샘플링 기법인 Tomek Links와 같은 방법을 활용하여 노이즈 데이터를 제거할 수도 있습니다.

from imblearn.under_sampling import RandomUnderSampler

# 랜덤 언더샘플링 적용
rus = RandomUnderSampler()
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)

# 모델 학습
model = RandomForestClassifier()
model.fit(X_resampled, y_resampled)

# 예측 및 평가
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

위 코드는 랜덤 언더샘플링을 적용한 후, 같은 랜덤 포레스트 분류기를 학습하고 성능을 평가하는 예제입니다.

마무리

불균형 데이터셋은 머신러닝 모델의 성능에 큰 영향을 미치는 요소입니다. 오버샘플링과 언더샘플링 기법은 이러한 문제를 해결하기 위한 효과적인 방법입니다. 각각의 기법은 특정 상황에 따라 장단점이 다르므로, 데이터의 특성과 문제의 요구 사항에 맞춰 적절한 방법을 선택하는 것이 중요합니다. 데이터 분석 및 모델 설계 시, 이러한 리샘플링 기법을 통해 보다 신뢰할 수 있는 결과를 도출해보세요.