8. 데이터 샘플링

김용준·2023년 12월 17일

불균형한 데이터셋에서의 데이터 샘플링은 모델의 훈련에 있어서 중요한 과정 중 하나입니다. 이 블로그에서는 언더샘플링, 오버샘플링, SMOTE 등의 다양한 데이터 샘플링 기법에 대해 다뤄보겠습니다.

1 언더샘플링

1.1 정의 및 원리

언더샘플링은 다수 클래스의 데이터를 줄여서 클래스 간 균형을 맞추는 방법입니다. 이를 통해 모델이 불균형한 데이터에서 더 나은 학습을 수행할 수 있습니다.

1.2 주요 언더샘플링 기법

1.2.1 무작위 언더샘플링

다수 클래스에서 임의로 선택된 샘플을 제거하는 방법입니다.

· 장점 : 빠르게 모델을 훈련할 수 있음.
· 단점 : 정보 손실이 발생할 수 있고, 과소적합 문제가 발생할 수 있습니다.

1.2.2 토마토 언더샘플링

토마토 언더샘플링은 다수 클래스에서 중요한 정보를 가진 샘플을 우선적으로 선택하여 제거하는 방법입니다.

· 장점 : 다수 클래스의 중요한 정보를 보존하면서 언더샘플링 가능.
· 단점 : 계산 비용이 높을 수 있고, 정보 손실의 위험이 존재.

1.3 장단점 및 주의 사항

· 장점 : 빠르게 모델을 훈련할 수 있음.
· 단점 : 정보 손실이 발생할 수 있고, 과소적합 문제가 발생할 수 있습니다. 선택한 언더샘플링 기법은 데이터의 특성과 목적에 맞게 고려되어야 합니다.

2. 오버샘플링

2.1 정의 및 원리

오버샘플링은 소수 클래스의 데이터를 증가시켜 균형을 맞추는 방법입니다. 이를 통해 모델이 소수 클래스를 더 잘 학습할 수 있습니다.

2.2 주요 오버샘플링 기법

2.2.1 무작위 오버샘플링

소수 클래스에서 임의로 선택된 샘플을 복제하여 데이터를 증가시키는 방법입니다.

· 장점 : 간단하고 빠르게 구현 가능.
· 단점 : 무작위로 복제하기 때문에 과적합 문제가 발생할 수 있음.

2.2.2 SMOTE (Synthetic Minority Over-sampling Technique)

SMOTE는 소수 클래스의 샘플들 사이에 가상의 샘플을 생성하여 오버샘플링을 수행하는 방법입니다. 인접한 샘플들을 고려하여 새로운 샘플을 생성합니다.

· 동작 방식
소수 클래스의 각 샘플에 대해 인접한 샘플들을 찾음.
인접한 샘플들 중 무작위로 선택하여 새로운 샘플을 생성.
생성된 샘플을 원본 데이터에 추가.

· 장점 : 소수 클래스의 다양성을 유지하면서 오버샘플링 가능.
· 단점 : 잘못된 생성 샘플이 도입될 수 있으며, 계산 비용이 상대적으로 높음.

2.3 장단점 및 주의 사항

· 장점 : 소수 클래스의 정보를 놓치지 않고 학습 가능.
· 단점 : 무작위 오버샘플링은 과적합 가능성 존재, SMOTE는 인접 샘플 간의 상관성을 고려해야 함. 선택한 오버샘플링 기법은 데이터의 특성과 목적에 따라 적절하게 사용되어야 합니다.

3. 샘플링 기법 예시

아래 나오는 코드는 imbalanced-learn 라이브러리를 사용하여 무작위 언더샘플링과 오버샘플링, SMOTE 기법을 수행하는 예시입니다. 시각화를 통해 클래스 분포의 변화를 확인할 수 있습니다. 코드를 실행하기 전에 필요한 라이브러리를 설치해야 합니다.

pip install imbalanced-learn

3.1 언더샘플링

아래의 언더샘플링 예시 코드는 RandomUnderSampler 클래스를 사용하여 소수 클래스의 데이터를 무작위로 제거하여 클래스 간의 균형을 맞추는 과정을 보여줍니다.

from imblearn.under_sampling import RandomUnderSampler
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
import seaborn as sns

# 샘플 데이터 생성
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2,
                       n_redundant=10, n_clusters_per_class=1, weights=[0.99], 	flip_y=0, random_state=1)

# 클래스 분포 확인
sns.countplot(x=y)
plt.title('Class Distribution Before Under-sampling')
plt.show()

# 언더샘플링 적용
under_sampler = RandomUnderSampler(sampling_strategy='auto', random_state=1)
X_resampled, y_resampled = under_sampler.fit_resample(X, y)

# 언더샘플링 후 클래스 분포 확인
sns.countplot(x=y_resampled)
plt.title('Class Distribution After Random Under-sampling')
plt.show()

언더샘플링은 소수 클래스의 데이터를 줄이는 방식으로 데이터 불균형 문제를 해결합니다. 그러나 무작위로 데이터를 제거하므로 소수 클래스의 정보 손실 가능성이 있습니다.

3.2 오버샘플링

오버샘플링 예시 코드는 SMOTE 클래스를 사용하여 소수 클래스의 데이터를 증가시켜 클래스 간의 균형을 맞추는 과정을 보여줍니다. 무작위 오버샘플링을 위해 RandomOverSampler 클래스를 사용할 수도, SMOTE를 사용할 수도 있습니다.

3.2.1 무작위 오버샘플링

from imblearn.over_sampling import RandomOverSampler
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
import seaborn as sns

# 샘플 데이터 생성
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2,
                       n_redundant=10, n_clusters_per_class=1, weights=[0.99], 	flip_y=0, random_state=1)

# 클래스 분포 확인
sns.countplot(x=y)
plt.title('Class Distribution Before Random Over-sampling')
plt.show()

# 무작위 오버샘플링 적용
over_sampler = RandomOverSampler(sampling_strategy='auto', random_state=1)
X_resampled, y_resampled = over_sampler.fit_resample(X, y)

# 무작위 오버샘플링 후 클래스 분포 확인
sns.countplot(x=y_resampled)
plt.title('Class Distribution After Random Over-sampling')
plt.show()

3.2.2 SMOTE 기법

from imblearn.over_sampling import SMOTE
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
import seaborn as sns

# 샘플 데이터 생성
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2,
                       n_redundant=10, n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=1)

# 클래스 분포 확인
sns.countplot(x=y)
plt.title('Class Distribution Before SMOTE Over-sampling')
plt.show()

# SMOTE 오버샘플링 적용
over_sampler = SMOTE(sampling_strategy='auto', random_state=1)
X_resampled, y_resampled = over_sampler.fit_resample(X, y)

# SMOTE 오버샘플링 후 클래스 분포 확인
sns.countplot(x=y_resampled)
plt.title('Class Distribution After SMOTE Over-sampling')
plt.show()

오버샘플링은 데이터의 불균형을 해소하기 위해 소수 클래스의 샘플을 증가시키는 기법입니다. 무작위 오버샘플링은 단순한 복제를 통해 데이터를 증가시키고, SMOTE는 소수 클래스의 샘플을 이용하여 합성샘플을 생성하여 데이터를 증가시킵니다.

4. 효과적인 데이터 샘플링을 위한 고려 사항

데이터 샘플링은 불균형한 데이터셋에서 모델의 훈련에 있어 중요한 전처리 단계입니다. 하지만, 적절한 데이터 샘플링을 선택하고 적용하기 위해서는 몇 가지 고려 사항이 필요합니다.

4.1 샘플링 기법 선택

· 4.1.1 언더샘플링, 오버샘플링, 혹은 둘의 조합 :
문제에 따라 어떤 샘플링 기법을 사용할지 결정해야 합니다. 언더샘플링은 소수 클래스의 데이터를 줄이고, 오버샘플링은 다수 클래스의 데이터를 늘립니다. 둘을 조합할 수도 있습니다.

4.2 샘플링 비율 설정

· 4.2.1 적절한 샘플링 비율 :
언더샘플링을 할 때는 소수 클래스의 얼마나 많은 샘플을 유지할 것인지, 오버샘플링을 할 때는 몇 배의 데이터를 생성할 것인지를 결정해야 합니다. 이는 실험과 검증을 통해 조정될 수 있습니다.

4.3 모델 성능 평가

· 샘플링 전과 후의 모델 성능 평가 :
샘플링을 적용하기 전과 후에 모델을 평가하고 비교하여 성능 향상이 있었는지 확인해야 합니다. 특히 정확도 외에도 정밀도, 재현율, F1 점수 등을 고려하여 모델의 성능을 평가합니다.

4.4 다양한 실험

· 다양한 샘플링 실험 수행 :
여러 샘플링 기법과 설정을 실험하여 어떤 조합이 가장 효과적인지 확인합니다. 실험을 통해 최적의 샘플링 전략을 찾을 수 있습니다.

5. 결론

데이터 샘플링은 머신러닝 모델이 불균형한 데이터에서 효과적으로 학습하고 일반화되도록 하는 핵심 전처리 기술 중 하나입니다. 이 블로그에서 다뤘던 언더샘플링, 오버샘플링, 그리고 SMOTE와 같은 다양한 샘플링 기법을 통해 불균형한 클래스 간의 데이터 분포를 균형있게 조절할 수 있습니다.

좋은 데이터 샘플링은 모델의 성능 향상뿐만 아니라, 모델이 실제 환경에서 더 효과적으로 작동할 수 있도록 도와줍니다. 실험과 검증을 통해 최적의 샘플링 전략을 찾고, 모델의 성능 평가 지표를 종합적으로 고려하여 최상의 결과를 얻을 수 있습니다.

데이터 샘플링은 문제에 따라 다르기 때문에, 주어진 상황과 목표에 따라 적절한 전략을 선택하는 것이 중요합니다. 끊임없는 실험과 성능 평가를 통해 데이터 샘플링이 모델 성능 향상에 어떠한 영향을 미치는지 지속적으로 모니터링하며, 모델의 품질을 높이는 데 기여할 수 있습니다.

profile
김용준입니다.

0개의 댓글