Sampling 개념

코딩다시시작·2025년 3월 5일

LG DX SCHOOL

목록 보기
13/33
post-thumbnail

불균형 데이터 처리 기법 자세한 설명

불균형 데이터를 처리하는 방법에는 크게 언더샘플링(Under Sampling), 오버샘플링(Over Sampling), 그리고 합성 데이터 생성(SMOTE, ADASYN 등)이 있다.
각 기법의 특징과 장단점을 자세히 살펴보자.


📌 1. 언더샘플링(Under Sampling)

💡 개념:
다수 클래스(majority class)의 데이터 수를 줄여서 소수 클래스(minority class)와 비율을 맞추는 기법이다.

📌 방법:

  • 무작위 언더샘플링: 정상 데이터를 랜덤하게 선택하여 줄이는 방식
  • 유의미한 정보 기반 샘플링: 데이터의 분포를 고려하여 대표적인 데이터만 남기는 방식
  • NearMiss: 소수 클래스와 가장 가까운 다수 클래스 데이터만 남기는 방식

📌 장점:
✅ 데이터 중복이 없어서 과적합(overfitting) 위험이 낮음
✅ 샘플링 속도가 빠름

📌 단점:
정상 데이터가 많이 손실될 가능성이 있음
❌ 일부 중요한 데이터를 잃을 수도 있음

📌 Python 코드 예제:

from imblearn.under_sampling import NearMiss

# 언더샘플링 적용
X_under, y_under = NearMiss().fit_resample(X, y)

print(f"Before UnderSampling: {Counter(y)}")
print(f"After UnderSampling: {Counter(y_under)}")

📌 2. 오버샘플링(Over Sampling)

💡 개념:
소수 클래스(minority class)의 데이터를 늘려서 데이터 불균형을 해소하는 방법이다.

📌 방법:

  • 무작위 오버샘플링: 소수 클래스를 단순 복제하여 데이터 개수를 증가
  • 유의미한 샘플링: 특정 기준에 따라 소수 클래스를 복제
  • 합성 데이터 생성: 기존 데이터를 기반으로 새로운 데이터를 생성 (SMOTE, ADASYN 등)

📌 장점:
✅ 데이터 손실 없이 소수 클래스를 보강할 수 있음
✅ 언더샘플링보다 정보 손실 위험이 적음

📌 단점:
❌ 단순 복제 방식은 과적합(overfitting) 위험이 높음
❌ 오버샘플링을 잘못하면 일부 샘플이 중복되어 모델 성능이 낮아질 수도 있음

📌 Python 코드 예제:

from imblearn.over_sampling import RandomOverSampler

# 오버샘플링 적용
X_over, y_over = RandomOverSampler().fit_resample(X, y)

print(f"Before OverSampling: {Counter(y)}")
print(f"After OverSampling: {Counter(y_over)}")

📌 3. SMOTE (Synthetic Minority Over-sampling Technique)

💡 개념:
소수 클래스를 단순 복제하는 것이 아니라, 소수 클래스의 데이터를 기반으로 새로운 데이터를 생성하는 방식이다.
즉, 기존 데이터를 기반으로 K-최근접 이웃(KNN) 방식으로 새로운 데이터를 생성한다.

📌 특징:

  • 기존 소수 클래스 데이터를 랜덤하게 복제하지 않고, 새로운 데이터를 생성
  • KNN을 활용하여 소수 클래스 사이의 새로운 데이터를 합성

📌 장점:
✅ 단순 복제 방식보다 오버피팅 위험이 낮음
✅ 소수 클래스의 분포를 더 자연스럽게 만듦

📌 단점:
❌ 새로운 데이터를 생성하기 때문에 노이즈가 포함될 가능성이 있음
❌ 다수 클래스와 경계가 모호해질 수도 있음

📌 Python 코드 예제:

from imblearn.over_sampling import SMOTE

# SMOTE 적용
X_smote, y_smote = SMOTE().fit_resample(X, y)

print(f"Before SMOTE: {Counter(y)}")
print(f"After SMOTE: {Counter(y_smote)}")

📌 SMOTE 적용 전후 비교:


📌 4. ADASYN (Adaptive Synthetic Sampling Approach)

💡 개념:
SMOTE와 비슷하지만, 더 어려운(밀도가 낮은) 샘플에 대해 더 많은 synthetic 데이터를 생성하는 방식이다.

📌 특징:

  • 새로운 데이터를 생성할 때, 소수 클래스의 데이터 밀도를 고려
  • 밀도가 낮은 곳에서는 더 많은 데이터를 생성하고, 밀도가 높은 곳에서는 적게 생성

📌 장점:
✅ 더 어려운 데이터를 중심으로 학습을 강화할 수 있음
✅ SMOTE보다 모델 성능이 향상될 가능성이 있음

📌 단점:
❌ 새로운 데이터를 무작위로 생성하므로 노이즈가 많아질 위험이 있음
❌ 데이터 분포가 왜곡될 가능성이 있음

📌 시각적 예시:

📌 Python 코드 예제:

from imblearn.over_sampling import ADASYN

# ADASYN 적용
X_adasyn, y_adasyn = ADASYN().fit_resample(X, y)

print(f"Before ADASYN: {Counter(y)}")
print(f"After ADASYN: {Counter(y_adasyn)}")

🎯 결론: 언제 어떤 기법을 써야 할까?

기법데이터 손실오버피팅 위험계산 비용노이즈 발생 가능성
언더샘플링있음(다수 클래스 일부 삭제)낮음낮음낮음
오버샘플링없음높음(단순 복제 시)낮음낮음
SMOTE없음낮음(새로운 데이터 생성)중간중간
ADASYN없음낮음(새로운 데이터 생성)높음높음

데이터가 충분하다면?SMOTE, ADASYN 사용
데이터가 부족하다면?오버샘플링 추천
데이터가 너무 많아서 학습 시간이 오래 걸린다면?언더샘플링 고려


profile
gpt로 다시 배우는 개발

0개의 댓글