미식가의 개발 일기

[머신러닝] 클래스 불균형을 해결하기 위한 샘플링(언더 샘플링, 오버 샘플링) 본문

ML, DL

[머신러닝] 클래스 불균형을 해결하기 위한 샘플링(언더 샘플링, 오버 샘플링)

대체불가 핫걸 2024. 10. 4. 10:05
클래스 불균형이란?
특정 클래스의 데이터 수가 다른 클래스에 비해 훨씬 적거나 많은 현상


전체 데이터 중에서 90%가 클래스 A이고 10%만이 클래스 B인 경우, 모델이 단순히 "모든 데이터가 클래스 A"라고 예측해도 정확도가 90%에 달할 수 있습니다. 그러나 이 경우 모델은 클래스 B를 거의 예측하지 못하게 되어 성능 평가 지표로는 부적절합니다.

이처럼 클래스 비율이 극단적으로 다를 경우 소수 클래스의 패턴을 학습하기 어렵고, 잘못된 예측 결과를 초래할 수 있습니다.

 

이러한 클래스 불균형 문제를 해결하기 위해 샘플링 기법이 존재합니다.

 

샘플링 기법

데이터의 분포를 조정하여 학습 데이터 세트의 클래스 비율을 맞추는 방법
!pip install imbalanced-learn

※ 라이브러리 설치 필요

 

 

언더샘플링 (Undersampling)

다수 클래스의 샘플 수를 줄여 소수 클래스와의 비율을 맞추는 방법
  • 장점: 데이터 수가 줄어 학습 속도가 빨라질 수 있음
  • 단점: 중요한 정보가 있는 데이터를 제거할 가능성이 있음

 

from imblearn.under_sampling import RandomUnderSampler

under_sample = RandomUnderSampler()
u_x_train, u_y_train = under_sample.fit_resample(x_train, y_train)

 

 

오버샘플링 (Oversampling)

소수 클래스의 샘플 수를 늘려 다수 클래스와 비율을 맞추는 방법
  • 장점: 모든 데이터의 정보를 보존하면서 클래스 균형을 맞출 수 있음
  • 단점: 데이터가 단순히 반복되면 오버피팅의 위험이 있음

 

from imblearn.over_sampling import RandomOverSampler

over_sample = RandomOverSampler()
o_x_train, o_y_train = over_sample.fit_resample(x_train, y_train)

 

 

 

SMOTE (Synthetic Minority Over-sampling Technique)

소수 클래스의 샘플들을 이용하여 인접한 샘플들 사이에 새로운 샘플을 합성하여 데이터 수를 늘리는 기법
  • 장점: 데이터 분포를 더 다양하게 만들어 단순 오버샘플링보다 일반화 성능을 향상
  • 단점: 새로운 데이터를 합성하기 때문에, 소수 클래스의 경계선에서 잘못된 샘플이 생성될 수 있음

 

from imblearn.over_sampling import SMOTE

smote = SMOTE()
s_x_train, s_y_train = smote.fit_resample(x_train, y_train)

 

반응형