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
이전에 쓴 글에서, 자세한 내용을 확인할 수 있으므로 해당 글로 대체한다.
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 (현재까지 클래스별 정확도를 고려하여 가중치를 부여하는 방식이라고 한다. 딥러닝쪽 모델과 연관있는듯.)
'Archive > 데이터 분석 관련' 카테고리의 다른 글
[Data] 시계열 분석 - AR, MA, ARMA, ARIMA (0) | 2022.04.07 |
---|---|
[Data] 이상탐지 문제 소개 (0) | 2022.03.27 |
[Data] 군집분석 - Gaussian Mixture Model (0) | 2022.03.19 |
[Data] Shapely Value 간단하게 알아보기 (0) | 2022.03.17 |
[Data] 회귀진단이란 무엇일까? (0) | 2022.03.14 |