본문 바로가기
Archive/데이터 분석 관련

[Data] Imbalanced Data 다루는 Technique 정리

by 다람이도토리 2022. 3. 20.
https://www.analyticsvidhya.com/blog/2021/06/5-techniques-to-handle-imbalanced-data-for-a-classification-problem/

이 글의 내용을 중심으로, 추가 정보를 찾아보아 정리하였습니다.
한번쯤은, 다시 한번 생각의 흐름을 정리해볼 토픽이라 추가 내용을 조금 더 찾아보았습니다.

들어가기

분류 문제를 푸는 상황을 고려하자. 결과(target class)의 비율이 크게 차이가 나지 않다면, 깔끔하겠으나 세상은 쉽지 않다(?)

Ex- 사기 검출 문제를 푼다고 생각하면, 사기 비율은 당연히 정상 케이스에 비해 지극히 적다.

불균형 데이터는 왜 문제가 될까?

불균형 데이터를 일반적인 방법대로 처리한다면 "편향"이 발생할 수 있게 된다.
구체적으로는, 극단적으로 모델을 만들어 분류에 실패해도 수치적인 성능 자체는 "좋아보일 수" 있다.

예를 들어, 환자 1000명 중 양성 환자가 5명만 있다고 가정하자. 한 의사가 (귀찮다고) 전원에게 음성을 때렸다.
이 의사의 정확도는 995/1000, 즉 99.5%다. 그러면 이 의사는 일을 잘한걸까? 전혀 아니라는 것을 알 수 있다. 극소수 케이스인 특이 케이스를 잘 골라내는 것 또한 중요한 문제임을 알 수 있다.

불균형 데이터를 다룰 때 고려 사항

적절한 Metric의 선택

위의 문제를 다시 고려해보자. 정확도가 아닌 다른 지표를 쓰면 어떻게 될까?

정밀도(precision) : 양성이라고 에측한 것 중 정말 양성일 정확도
재현율(recall) : 양성들을 얼마나 잘 찾아내었는가?
f1-score : 정밀도와 재현율의 조화평균
  실제 양성 실제 음성
예측 양성 20 5
예측 음성 20 55

이런 상황이 있으면
정확도 : 75%. 정밀도 80%, 재현율 50% 정도의 수치를 얻게 된다.

특히 f1-score을 고려하면, f1-score을 높이기 위해서는 정밀도와 재현율 양쪽에 대해 높은 수치를 얻어야 하므로, 두 수치간의 균형을 고려할때 좋은 지표로 활용할 수 있다.

Technique : Resampling / SMOTE

Resampling을 통해 언더샘플링이나 오버샘플링을 통해 데이터의 균형을 강제적으로 맞춰줄 수 있다.
혹은 SMOTE를 통해 불균형한 클래스쪽에 현재의 데이터 경향을 기준으로 새로운 데이터를 보정해줄 수 있다.

https://taksw222.tistory.com/99?category=475736 

 

[Data] UnderSampling, OverSampling

개요 분류 문제, 특히 binary-classification 상황을 고려하자. class 0, 1이 5 : 5 정도로 깔끔하게 나오는 상황은 분포가 균일하므로 학습에 문제가 없을 것이다. 그러나 이상탐지 문제처럼 하나의 클래

taksw222.tistory.com

이전에 쓴 글에서, 자세한 내용을 확인할 수 있으므로 해당 글로 대체한다.

Technique : Balanced Bagging Classifier

Imbalanced-learn에서 저공하는 balanced Bagging Clasisfier에서는 기본적인 classifier와 함께, 추가적인 parameter를 넣어 resampling 방법 등을 지정할 수 있다.

자세한 사용법은 다음 공식 문서를 참고하자.

https://imbalanced-learn.org/stable/references/generated/imblearn.ensemble.BalancedBaggingClassifier.html

가장 기본적 사용 형태는 다음과 같다.

from imblearn.ensemble import BalancedBaggingClassifier
from sklearn.tree import DecisionTreeClassifier
#Create an instance
classifier = BalancedBaggingClassifier(base_estimator=DecisionTreeClassifier(),
                                sampling_strategy='not majority',
                                replacement=False,
                                random_state=42)
classifier.fit(X_train, y_train)
preds = classifier.predict(X_test
*  Sampling 전략
float 반환시 -> minor / major 비율을 준다. 즉, major에 resampling이 적용된다.
str 반환시 ->
  * majority : 가장 많은 개체수를 가진 class를 resampling
  * not minority : 최소 개체수 가진 class 제외 전체 resampling (미설정시 기본값이다)
  * not majority : 최대 개체수 가진 class 제외 전체 reasampling

Technique : Threshold 조절하기

특히, 로지스틱 회귀같은 모델에서는 일반적으로는 0.5를 기준으로 class를 구분하게 될 것인데, 이러한 구분선의 위치 자체를 변경하는 방법 또한 존재한다.

Technique : 가중치 변경하기

특정 class에 대해서 더 높은 weight를 부여하는 방법 또한 존재한다.

* 추후 알아볼 내용 : Focal Loss (현재까지 클래스별 정확도를 고려하여 가중치를 부여하는 방식이라고 한다. 딥러닝쪽 모델과 연관있는듯.)