코드스테이츠 AI 부트캠프/Section 2

AIB_231_복습정리 : 불균형 클래스

yourhm 2021. 12. 4. 22:32

불균형 클래스 (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/

 

How To Dealing With Imbalanced Classes in Machine Learning

Learn how to deal with imbalanced classes in machine learning by improving the class imbalance using Python and improve your model

www.analyticsvidhya.com

https://ichi.pro/ko/logeu-byeonhwan-mogjeog-mich-haeseog-163022810139081

 

로그 변환 : 목적 및 해석

로그 변환을 사용하는 방법 및 로그 변환 된 변수를 사용하여 회귀 모델의 계수를 해석하는 방법 정규 분포 란? 로그 변환을 시작하기 전에 정규 분포에 대해 빠르게 이야기하겠습니다. 정규 분

ichi.pro

https://www.researchgate.net/post/Log_transformation_not_working

 

Log transformation not working?

Read 5 answers by scientists to the question asked by Giacomo Hurst on Apr 30, 2019

www.researchgate.net

https://stats.stackexchange.com/questions/107610/what-is-the-reason-the-log-transformation-is-used-with-right-skewed-distribution

 

What is the reason the log transformation is used with right-skewed distributions?

I once heard that log transformation is the most popular one for right-skewed distributions in linear regression or quantile regression I would like to know is there any reason underlying this

stats.stackexchange.com

https://www.statisticssolutions.com/transforming-data-for-normality/

 

Transforming Data for Normality - Statistics Solutions

One of the most common assumptions for statistical analyses is that of normality, with nearly all parametric analyses requiring this assumption in one way or another.

www.statisticssolutions.com

https://a292run.tistory.com/entry/Statistics-for-Data-Science-What-is-Skewness-and-Why-is-it-Important-1

 

Statistics for Data Science: What is Skewness and Why is it Important?

이글은 www.analyticsvidhya.com의 내용임. (링크) Statistics for Data Science: What is Skewness and Why is it Important? Skewness : 왜도, 뒤틀림, 비대칭도 Overview 왜도(skewness)는 데이터 과학과 분석..

a292run.tistory.com