불균형 클래스 (class imbalance)
불균형 클래스는 머신러닝의 분류 문제에서 발생하는 문제이다. 데이터를 보면 보통 target의 클래스 비중이 차이가 많이 나는 경우가 많다. (사기 탐지, 폐기 예측, 의료 진단, 이메일 분류 등)
<이러한 불균형을 해결해주어야 하는 이유>
대부분의 머신러닝 알고리즘은 데이터가 클래스 내에 고르게 분포되어 있다고 가정한다. 그렇기 때문에 알고리즘은 다수 클래스를 예측하는 데 더 편향된다는 것이다. 알고리즘에는 소수 클래스에 있는 패턴을 학습하기에 충분한 정보가 없다. 클래스 빈도 차이는 모델의 전반적인 예측 가능성에 영향을 미친다.
쉽게 이해하기 위한 예를 들어보면, 내가 고향에서 오랫동안 살다가 최근에 새로운 도시로 이사했고 이사한지 한달정도 되었다고 생각해보자. 고향 동네에 대해서는 어린 시절부터 쭉 살았기 때문에 골목길, 가게들, 관광지에 대해 잘 알고 있고 정보도 많을 것이다. 하지만 최근 이사한 도시에 대해서는 아직 곳곳의 위치가 정확히 어디인지 제대로 알지 못하기 때문에 잘못된 길로 들어 길을 잃을 가능성도 높을 것이다. 여기서 고향은 다수 클래스이고 새로운 도시는 소수 클래스라고 생각할 수 있다.
불균형 클래스 해결 방법
1) 언더샘플링 or 오버샘플링
언더샘플링: 다수 클래스를 소수 클래스의 수에 맞게 줄여서 샘플링하는 것
오버샘플링: 소수 클래스를 다수 클래스의 수에 맞게 늘려서 샘플링하는 것
2) 클래스 가중치 조절
• 소수 클래스에는 가중치를 더하고, 다수 클래스에는 가중치를 빼서, 오분류되는 것을 막는 것이다.
• 대부분의 sklearn 분류 모델링 라이브러리와 boosting 모델링 라이브러리들에는 기본적으로 “class_weight” 파라미터가 빌트인 되어 있다. 디폴트는 보통 none값으로 두 클래스에 동일한 가중치가 부여되어 있다.
위의 예를 이어서 생각해보자. 지난 한 달동안 새로운 도시에 살면서 필요할 때만 잠깐 나가는게 아니라, 한 달 내내 그 도시 여러군데를 돌아다니면서 지냈다고 생각해보자. 한 달 내내 도시 골목길부터 온갖 장소를 이해하는데 더 많은 시간을 보냈을 것이다. 이렇게 더 많은 시간을 보내는 것은 새로운 도시를 더 잘 이해하는 데 도움이 될 것이고, 길을 잃을 가능성도 줄어들 것이다. 이것이 정확히 클래스 가중치가 작용하는 방법이다. 훈련데이터로 모델을 학습할 동안, 알고리즘의 비용 함수에서 소수 클래스에 더 많은 가중치를 부여하여 소수 클래스에 더 높은 패널티를 제공할 수 있고 알고리즘은 소수 클래스에 대한 오류를 줄이는 데 초점을 맞출 수 있다.
<파이썬으로 모델링할 때 적용하는 방법>
방법 1 class-weight 파라미터에 'balanced' 옵션을 넣어준다.
'balanced' 로 넣어주면, 모델이 각 빈도에 반비례하는 클래스 가중치를 자동으로 할당한다.
공식으로 보면 -> weight of class_n = 전체 클래스 값 카운트 / ( 클래스 갯수 * 해당 클래스 값 카운트)
• 타겟: 사기여부(사기맞다 / 사기아니다 → 클래스 2개)
• 사기 맞음: 670
• 사기 아님: 37,330
• 전체 카운트: 38,000
weights for 사기맞음 = 38000 / (2*670) = 28.358
weights for 사기아님 = 38000 / (2*37330) = 0.509
방법 2 class-weight 파라미터에 원하는 비율을 직접 넣어준다.
'balanced' 옵션을 사용하면 대부분 좋은 결과를 얻을 수 있다. 그러나 간혹 클래스 불균형이 극단적인 경우 직접 수동으로 가중치를 지정해줄 수 있다.
궁금한 점! 파이썬에서 클래스 가중치에 대한 최적의 값을 찾는 방법이 있을까?
[참고자료]
위 내용은 아래 포스트를 참고하여 학습한 내용이다. class weight을 이해하는데 매우 도움이 되었다.
https://www.analyticsvidhya.com/blog/2020/10/improve-class-imbalance-class-weights/
https://ichi.pro/ko/logeu-byeonhwan-mogjeog-mich-haeseog-163022810139081
https://www.researchgate.net/post/Log_transformation_not_working
https://www.statisticssolutions.com/transforming-data-for-normality/
'코드스테이츠 AI 부트캠프 > Section 2' 카테고리의 다른 글
AIB_234_복습정리 : PDP, SHAP (0) | 2021.12.04 |
---|---|
[비공개] AIB_222_복습정리 : Random Forests, Hyper parameter tuning (0) | 2021.12.04 |
[비공개] AIB_221_복습정리 : Decision Trees (0) | 2021.12.04 |
AIB_212_복습정리 : Multiple Linear Regression / Bias-Variance Trade off (0) | 2021.12.04 |
AIB_211_복습정리 : Simple Linear Regression (0) | 2021.12.04 |