working_helen

[모델링] 불균형 데이터 처리/SMOTH 본문

TAVE/뿌스팅 project

[모델링] 불균형 데이터 처리/SMOTH

HaeWon_Seo 2023. 8. 1. 15:03

모델링 과정에서 학습한 내용 중 불균형 데이터 처리 방법에 대해 공부해본다.

 

1. 데이터 불균형 문제

2. Under Sampling

3. Over Sampling

4. SMOTH

5. 파이썬 코드

 


1. 데이터 불균형 문제

- 머신러닝 분류 문제는 새로운 데이터가 어떤 범주에 속하는지 판단하는 것을 목표로 한다.
- 하지만 현실의 많은 데이터는 각 범주의 비율이 불균형한 경우가 많다.

- 데이터의 불균형은 머신러닝 학습에 영향을 주며, 특히 적은 비율을 차지하는 소수 범주가 관심 대상인 경우 데이터의 불균형을 해소한 후 학습을 진행해야 한다.
- 예를 들어 여성이 10%, 남성이 90%인 학습 데이터로 사용한다면, 다수 집단인 남성에 속할 것이라 예측하는 것이 맞을 확률이 높기 때문에 소수 집단인 여성을 예측하는 것에 대한 정확성이 떨어질 수 있다.

Sampling 샘플링은 데이터의 불균형 문제를 해결하기 위한 방법으로, 원본 데이터에서 각 범주가 자치하는 비율이 균형을 맞추도록 새롭게 데이터를 추출하는 방식이다.
- Sampling 방식은 크게 Undersampling과 Oversampling 두가지로 나뉜다.

 

 

 

출처 : http://www.incodom.kr/SMOTE#h_44c5eb78bea2d7895e1f4ae1a7368ff7

2. Under Sampling

- 소수 범주 데이터가 어느정도 확보되었을 때, 소수 범주의 데이터 수에 다수 범주의 데이터 수를 맞추는 방식.
다수 범주 데이터 수를 줄임으로써 데이터 불균형을 해소한다.
- 학습데이터가 감소하며, 다수 범주의 유의미한 정보가 손실될 수 있다는 단점이 있다.

Under Sampling 기법

Random Under Sampling : 다수 범주에서 무작위로 일부만 샘플링

 

3. Over Sampling

- 다수 범주와 어느정도 균형이 맞춰지도록 소수 범주의 데이터 수를 늘리는 방식.
소수 범주의 데이터 수를 늘림으로써 데이터 불균형을 해소한다.
- 정보의 손실은 발생하지 않지만, 같은 데이터가 여러번 포함되면 Overfitting이 나타날 수 있다.
Over Sampling은 학습 데이터 세트에서만 진행한다. validation set과 test set에서 오버샘플링 하는 경우 결국 원본 데이터가 아닌 데이터로 검증하는 것이므로 올바른 검증이 되지 않는다.

Over Sampling 기법

- Random Over Sampling : 소수 범주에서 무작위 복원 추출하여 데이터 수를 늘림
- SMOTH

 


4. SMOTH (Synthetic Minority Over-sampling Technique)

- 소수 집단의 데이터를 바탕으로 가짜 소수집단 데이터를 생성한다.
- Random Over Sampling에서는 기존 소수집단 데이터에서 복원 추출한다면, SMOTH에서는 소수집단 데이터의 특징을 분석하고 유사한 패턴을 가지는 가짜 데이터를 추가적으로 생성하는 방식이다.
- 동일한 데이터를 반복적으로 재사용하지 않고 변형을 주기 때문에 Random Over Sampling에 비해 Overfitting 발생 가능성이 적다. 하지만 소수 데이터의 특성에만 집중하여 샘플링하기 때문에 생성된 데이터가 다른 클래스의 데이터와 중첩되거나 노이즈를 생성하는 문제가 발생할 수 있다.

- k-NN 알고리즘을 활용해 유사 데이터를 생성한다.

출처 : http://www.incodom.kr/SMOTE#h_44c5eb78bea2d7895e1f4ae1a7368ff7

소수 클래스의 데이터 중 특정 데이터(벡터)와 가장 가까운 k개의 이웃 벡터를 선정
기준 벡터와 선정한 벡터 사이를 선분으로 이음
선분 위의 임의의 점이 새롭게 생성된 가짜 데이터가 됨

 


5. 샘플링 파이썬 코드

파이썬 imblearn (imbalanced-learn) 모듈은 다양한 샘플링 클래스를 제공한다.

pip install imbalanced-learn
from imblearn.over_sampling import RandomUnderSampler, RandomOverSampler, SMOTE


# Random Under Sampling
undersample = RandomUnderSampler(sampling_strategy='majority')
X_under, y_under = undersample.fit_resample(X, y)

undersample = RandomUnderSampler(sampling_strategy=0.4) 
X_under, y_under = undersample.fit_resample(X, y)



# Random Over Sampling
oversample = RandomOverSampler(sampling_strategy='minority')
X_over, y_over = oversample.fit_resample(X, y)

oversample = RandomOverSampler(sampling_strategy=0.4) 
X_over, y_over = oversample.fit_resample(X, y)



#SMOTH
smote_sample = SMOTE(sampling_strategy=0.4) 
X_sm, y_sm = smote_sample.fit_resample(X, y)



# Sampling 결과 확인
print("SMOTE 적용 전 학습용 피처/레이블 데이터 세트 : ", X_train.shape, y_train.shape)
print('SMOTE 적용 전 y값의 분포 :\n',y_train.value_counts())

print('SMOTE 적용 후 학습용 피처/레이블 데이터 세트 :', X_train_sm.shape, y_train_sm.shape)
print('SMOTE 적용 후 값의 분포 :\n', pd.Series(y_train_sm).value_counts() )

 

sampling_strategy 파라미터
- 'majority'로 지정하면, 다수 집단의 수를 소수 집단의 수와 동일하도록 샘플링
- 'minority'로 지정하면, 소수 집단의 수를 다수 집단의 수와 동일하도록 샘플링
- 0~1의 값으로 지정하면,  (소수 집단 데이터수 / 다수 집단 데이터수)가 해당 값이 되도록 샘플링


 

 


Reference

https://abluesnake.tistory.com/116
https://coding-potato.tistory.com/17
http://www.incodom.kr/SMOTE#h_44c5eb78bea2d7895e1f4ae1a7368ff7