본문 바로가기

DEVELOP_NOTE/ML

[Imbalance Data] 불균형데이터를 극복하고 모델을 학습하는 방법

real world의 데이터를 분석하고 모델링을 하다보면, 가장 흔하게 발생하는 문제중 하나가 바로 'Imbalance Dataset'이다.

머신러닝 모델이 적절하게 학습하기 위해서는, 학습데이터가 예측하고자 하는 목적과 카테고리에 부합한 데이터가

균형있게 분포해야하고, 또 학습하기에 충분한 양을 가져야한다.

 

하지만 real world데이터에서는 불균형한 데이터의 사례가 매우 많다.

대표적으로 '이상거래 탐지(Fraud Detection)'를 예로들 수 있다.

횡령이나, 보이스피싱으로 발생하는 이상거래는 전체 거래중 0.1%도 되지않아, 대표적인 데이터불균형 사례로 꼽힌다.

이런 과제의 경우, 모델을 개발하고 정확도를 높이기 이전에, 불균형 데이터를 어떻게 처리할 것인지가 관건이 된다.

 

오늘은 이러한 불균형 데이터를 학습하기 위한 여러가지 전략에 대해서 정리해보고자 한다.


 불균형데이터를 효과적으로 학습하는 전략은 크게 아래와 같이 분류할 수 있다.

1) 학습 데이터를 조정하는 방법
2) 다양한 평가기준(metric)을 활용하는 방법

 

 

1. 학습데이터를 조정하는 방법

가장 대표적인 불균형 데이터 처리 방식으로, 학습 데이터를 직접적으로 조정하여 불균형 현상으로 인한 학습문제를 제거하거나 상쇄하는 전략을 의미한다. 

 

(1) 미약한 데이터를 더 수집할 수 있는 방안 검토

당연한 이야기이지만, 가장 첫번째로, 부족한 target데이터를 더 수집할 수 있는 방안을 검토하고 최대한 데이터 균형을 맞추도록 시도해야한다.

 

(2) Resampling

가장 많이 사용되는 방법으로, 데이터의 리샘플링을 통해 비율을 조정하는 방법이다.

크게, Over-sampling과 Under-sampling으로 대표된다.

 

 

1) Under-Sampling

다수를 차지하는 비율의 데이터를 소수 데이터와 적절하게 분포시키기 위해, 제거하는 방법을 의미한다.

 

대표적으로 아래와 같은 under-sampling 기법들이 존재한다.


  • Random under-sampling :
    • 무작위로 데이터를 추출하여 제거하는 방법
  • Cluster-based Under Sampling :
    • 다수 클래스의 데이터를 클러스터링하여, 각 클러스터에서 대표 샘플(centroid)을 선택함으로써 샘플수를 줄이는 방식. 데이터의 분포를 유지하는데 유리하며, 랜덤샘플링 방식에 비해 정보 손실을 줄일 수 있다.
  • Tomek Links :
    • 다수 클래스와 소수 클래스의 샘플 사이에서 서로 가장 가까운 쌍을 찾고, 다수 클래스의 샘플을 제거함으로써 경계를 더 명확히 나누는 방식이다. 두 샘플이 서로의 최근접 이웃(Nearest Neighbor)이고, 서로 다른 클래스에 속해있다면(경계선을 나누는 기준이 되는 두 샘플) 이들을 Tomek Link라고 한다. 이 방식은 클래스간의 경계를 정제하는데 효과적이고, 결정 결계 주변의 노이즈를 제거하는데 유리한 방법이다.

 

2) Over-Sampling

오버샘플링은 소수 클래스의 데이터수를 인위적으로 늘려, 다수 클래스의 샘플수와 균형을 맞추는 방법이다.

가장 간단하게는 Rnadom Over sampling이 있으며,

대표적으로 SMOTE(Synthetic Minority Over-sampling Technique)방식이 많이 사용된다.

  • SMOTE(Synthetic Minority Over-sampling Technique)
    • SMOTE는 소수 클래스의 샘플을 인위적으로 늘려 데이터의 불균형 문제를 해결하는 오버 샘플링 기법 중 하나이다. 이 방법은 소수 클래스의 샘플을 분석하여, 새로운 합성 샘플을 생성함으로써 다수 클래스와 소수 클래스 사이의 균형을 맞추는 방법이다.

SMOTE의 기본적인 동작 방식은 다음과 같다.

STEP 1. 샘플 선택:
소수 클래스에서 샘플을 무작위로 선택한다.

STEP 2. k-최근접 이웃 찾기:
선택한 샘플에 대해 k-최근접 이웃(k-Nearest Neighbors) 알고리즘을 사용하여 가장 가까운 소수 클래스 샘플을 찾는다.

STEP 3. 샘플 생성:
선택한 샘플과 그 최근접 이웃 사이를 선형적으로 연결하는 방식으로 새로운 샘플을 생성한다. 이때, 두 샘플 사이를 임의의 비율로 내분하는 점을 새로운 샘플로 추가한다.

STEP4. 반복:
이 과정을 원하는 수의 새로운 샘플이 생성될 때까지 반복한다.

 

이 방법을 통해 생성된 데이터는 원래의 데이터 분포를 따르면서도 소수 클래스의 표본 수를 증가시키므로,

머신러닝 모델이 소수 클래스를 더 잘 학습할 수 있게 된다.

 

다만, SMOTE를 사용할 때 주의할 점이 있는데, SMOTE의 방식은 인위적으로 생성된 데이터를 이용하기 때문에 모델이 과적합 (Overfitting)될 위험이 있다.

따라서 오버샘플링 된 데이터를 사용하여 모델을 학습시킨 후, 반드시 실제 데이터의 분포를 반영하는 테스트셋에서 모델의 평가가

필요하다.

 

 

 

2. 다양한 평가 기준을 사용하는 방법

불균형 데이터에서 Accuracy metric을 통해 모델을 평가하면, 매우 높은 스코어를 확인할 수 있다.

당연하다. 100개중 1개만 거짓인 데이터를 학습할 경우 모델은 당연히 높은 확률로 대부분을 '참'으로 분류할 것이고, 정확도는 99%로

계산될것이다.

따라서, Precision, Recall, F1-Score와 같은 metric을 사용하고, ROC-Curves 시각화를 통해 불균형데이터를 학습한 모델이

소수의 데이터를 제대로 예측해내고 있는지 여러방면으로 검증해야한다.

 

  • Confusion Matrix
    • Confusion Matrix는 실제 클래스와 예측된 클래스의 매칭을 이용하여, 분류 모델을 평가하는 도구이다. 이진 분류 문제에서 실제 클래스는 Positive / Nagative로 나누어져 있고, 분류 모델은 샘플들을 positive / negative로 분류한다.
     

 

 

  • Precision(정밀도)
    • 분류모델이 Positive(정답)으로 예측한것 중 실제로 Positive(정답)인 샘플의 비율
  • Recall(재현율, 민감도)
    • 실제 Positive(정답)중 분류모델이 Positive(정답)으로 예측한 비율

 

 

 

마치며

오늘은 Imbalance data를 효과적으로 학습하기 위한 여러가지 전략들을 정리해보았다.

그동안 실무 데이터를 처리하면서, 단순히 random over sampling 또는 random under sampling을 사용하여

불균형 데이터를 처리해 왔었는데, 데이터 분포를 고려할 수 있는 여러가지 방법이 있음에도 적용하기 위한 노력이 부족했던것 같다.

앞으로는 데이터의 분포를 효과적으로 유지할 수 있는 방법인 SMOTE, Cluster-based Under Sampling과 같은 방법을 사용하여

좀 더 효과적으로 불균형 데이터를 처리할 수 있도록 적용해봐야겠다.


 

 

 

Reference

https://joonable.tistory.com/27

 

resampling으로 imbalanced data(불균형 데이터 문제) 해결하기

Resampling으로 imbalanced data(불균형 데이터 문제) 해결하기 imbalanced data : 데이터 내 각각의 class들이 차지하는 데이터의 비율이 균일하지 않고 한쪽으로 치우친 데이터 major class : dataset 내에서 상대

joonable.tistory.com