본문 바로가기

Data Handling/Data Preprocessing

언더 샘플링(Undersampling)과 오버 샘플링(Oversampling)

* 해당 포스팅은 파이썬 머신러닝 완벽 가이드(권철민, 2019) 교재를 참고하여 공부하며 작성한 글입니다.

순서

  1. 언더 샘플링과 오버 샘플링의 개념
  2. SMOTE 개념
  3. SMOTE 코드

 

1. 언더 샘플링과 오버 샘플링의 개념

데이터가 불균형한 분포를 가지는 경우, 모델의 학습이 제대로 이루어지지 않을 확률이 높습니다.

이 문제를 해결하기 위해 나온 개념이 언더 섬플링(Undersampling)오버 샘플링(Oversampling)입니다.

 

https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets

 

언더 샘플링은 불균형한 데이터 셋에서 높은 비율을 차지하던 클래스의 데이터 수를 줄임으로써 데이터 불균형을 해소하는 아이디어 입니다.

하지만 이 방법은 학습에 사용되는 전체 데이터 수를 급격하게 감소시켜 오히려 성능이 떨어질 수 있습니다.

 

오버 샘플링은 낮은 비율 클래스의 데이터 수를 늘림으로써 데이터 불균형을 해소하는 아이디어 입니다.

이 방법이 가능하다면 언더 샘플링보다 훨씬 좋은 해결책이 될 수 있을것 같은데,

문제는 "어떻게" 없던 데이터를 생성하느냐 입니다.

 

 

2. SMOTE 개념

대표적인 방법으로 소개할 개념은  SMOTE(Synthetic Minority Over-sampling Technique) 입니다.

SMOTE 는 낮은 비율 클래스 데이터들의 최근접 이웃을 이용하여 새로운 데이터를 생성합니다.

완전히 똑같은 특성을 가진 데이터를 복사하는 것은 의미가 없기 때문에,

아래 그림과 같이 근접해 있는 데이터들과 일정한 거리를 떨어진 위치에 데이터를 생성하는 것입니다.

 

https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets

 

하지만 오버 샘플링을 고려할때 주의해야 할 것이 있습니다.

바로 재현율과 정밀도인데요,

양성 데이터가 음성 데이터보다 훨씬 부족한 데이터로 예를 들었을때,

오버 샘플링을 하게 되면 양성으로 예측하는 비율이 높아지기 때문에 정밀도가 감소하게 됩니다 (반대로 재현율은 증가하게 됩니다).

따라서 정밀도의 감소율을 낮추고 재현율의 증가율은 높이는 방법에 유의하며 SMOTE 패키지를 사용해야 합니다.

 

 

3. SMOTE 코드

마지막으로 SMOTE를 구현하는 코드를 작성해 보겠습니다.

코드는 fit_sample 메서드를 사용하여 쉽게 구현가능 합니다.

# imbalanced-learn 패키지
from imlearn.over_sampling import SMOTE

# 검증 데이터나 테스트 데이터가 아닌 학습데이터에서만 오버샘플링 사용할 것
smote = SMOTE(random_state=11)
X_train_over, y_train_over = smote.fit_sample(X_train, y_train)