이번 포스팅에서는 머신러닝 분류 문제에 있어서 '클래스 불균형' 에 대한 간단한 주제에 다룰 예정이다. 머신러닝 모델을 평가하는 하나의 지표로서 F1 score이란 것을 고려한다. F1 score은 Precision과 Recall의 조화평균으로부터 나오는 지표이다. F1 score은 그럼 언제 사용할까? 주로 데이터 Class(Lable)이 불균형 구조일 때 모델 성능을 정확히 평가한다고 한다.
필자는 '데이터 클래스 불균형' 이라는 개념에 대해 생소했고 이를 알아보기 위해 갓구글링의 도움을 받아보았다. 먼저 데이터 불균형 구조에 대한 정의부터 알아보자.
데이터 불균형이란 어떤 데이터에서 각 클래스(주로 범주형 변수)가 갖고 있는 데이터의 양에 차이가 큰 경우를 말한다.
예를 들어, 병원에서 질병이 있는 사람과 질병이 없는 사람의 데이터를 수집했다고 가정하자. 일반적인 경우에 보통 '질병이 있는 사람' 데이터가 양적으로 훨씬 적을 수 밖에 없을 것이다. 바로 이 때 데이터 불균형이 존재한다고 할 수 있다.
그렇다면 데이터의 클래스를 왜 균형있게 만들어줘야 할까? 그것은 바로 소수의 클래스의 의견에 귀를 기울이기 위해서다. 예를 들어서 개인의 재정상황 데이터를 기반으로 특정 부동산을 구입할지 구입하지 말아야 할지에 대해 예측해주는 모델을 만든다고 가정해보자. 이 때 '부동산을 구입해' 라는 클래스와 '부동산을 구입하지마' 라는 클래스 간의 무게 차이가 크다. 왜냐하면 '부동산을 구입해' 라는 클래스에는 많은 리스크가 따르기 때문이다. 즉, 현실상황에서 우리가 '부동산'을 구입할 때 동네 마트에서 구입하는 식자재처럼 리스크가 작은 것이 아니라는 의미이다. 그러므로 '부동산을 구입해'라고 예측하기 위해서는 '부동산을 구입하지마' 라고 예측하는 정확도에 비해 훨씬 더 큰 정확도를 가져야 한다. 따라서 우리는 이러한 상황에서 '클래스 균형'을 맞춰주기 위해 '부동산을 구입해' 라는 클래스에 더 많은 가중치(Weight)를 두어야 한다는 것이다.
그렇다면 이번엔 클래스 균형을 맞추기 위한 두 가지 방법을 소개하겠다.
1. Weight balancing
Weight balancing은 Train 데이터에서 각 loss를 계산할 때 특정 클래스에 대해서는 더 큰 loss를 계산해주는 것이다. 즉, 이전에 언급했던 '부동산 구입' 예시에서 처럼 '부동산을 구입해' 라는 클래스에는 더 큰 정확도가 필요하므로 '부동산을 구입해' 라는 클래스에는 더 큰 loss를 취해주는 것이다.
또 다른 방법으로는 클래스의 비율에 대해 가중치를 두는 방법이다. 예를 들어 두 개의 클래스 비율이 1:9라면 가중치를 9:1로 줌으로써 전체 클래스의 loss에 동일하게 기여하도록 한다.
Weight balancing 방법 중 Focal loss라는 방법도 있다. 예를들어 어떤 딥러닝 분류 모델에서 A,B,C라는 다중 클래스가 존재하고 A클래스로 분류하기 쉽지만 상대적으로 B,C 클래스는 분류하기가 힘들다고 가정해보자. 100번의 Epoch를 실시할 것이고 10번의 Epoch만에 99%의 정확도를 얻었다고 한다. 만약 아무런 조치도 취하지 않는다면 나마지 90번의 Epoch를 시행하는 동안 이미 A클래스를 쉽게 분류할 수 있음에도 계속적으로 A클래스 데이터에 대한 loss값이 기여할 것이다. 그렇다면 A클래스의 loss가 기여하는 시간동안 B,C 클래스 데이터에 더 집중을 하면 전체적인 분류 정확도가 높아지지 않을까? 즉 1번의 Epoch을 실시하고 loss에 의한 역전파(backpropagation)방법을 통해 파라미터(weight값)를 업데이트 하는데 이 순간에 loss를 계산할 때 현재까지 클래스별 정확도를 고려하여 가중치를 준다면 더욱 더 모델의 분류 정확도가 높아지지 않을까?
위의 그림처럼 한번의 epoch가 시행된 후 모든 클래스에 똑같은 가중치값을 부여하는 것이 아닌 분류성능이 높은 클래스에 대해서는 Down-weighting(가중치를 낮게 부여)을 한다. 위 그림에서는 감마(Gamma)값이 Down-weighting 값을 의미한다. 이러한 Down-weighting 방법은 분류가 힘든 클래스를 더욱 더 훈련시키는 효과가 있다.
2. Oversampling & Undersampling
클래스 균형을 맞춰주기 위한 또 다른 방법으로는 오버샘플링과 다운샘플링이 있다.
우선 왼쪽의 Undersampling을 보자. 파란색 데이터가 주황색 데이터보다 양이 훨씬 많은 상태이다. Undersampling은 현저히 양이 많은 파란색 데이터를 양이 적은 주황색 데이터에 맞춰주는 것이다. 이 때 양을 줄여버린 파란색 데이터들은 양이 많았던 원본 파란색 데이터의 대표성을 잘 지니고 있어야 하는 것이 중요하다.
다음은 오른쪽의 Oversampling이다. 이번에는 양이 적은 주황색 데이터를 양이 많은 파란색 데이터에 맞춰주는 방법이다. 주황색 데이터의 양을 늘려줄 때 원본 주황색 데이터를 복사하는 개념이기 때문에 양이 늘어난 주황색 데이터는 양이 적었던 주황색 원본 데이터의 성질과 동일하다.
##참고로 이 포스팅에서는 Oversampling과 Undersampling이라고 불리우지만 이 두개의 단어는 주로 신호처리 분야에서 Sampling rate를 높이고 낮출 때 사용한다고 한다. 따라서 머신러닝/데이터분석 분야에서 임의 데이터를 만들어내거나 많은 비율의 데이터를 줄이는 것을 각각 Up-sampling, Down-sampling이라고 불린다. 결론적으로 머신러닝 분야에서는 Up-sampling/Down-sampling 이라는 용어를 사용하면 되며 만약 아날로그 신호 데이터로부터 샘플링을 얘기하고자 할 때는 Oversampling/Undersampling 용어를 사용하면 된다.
# 참고 포스팅 글
https://3months.tistory.com/414
'Data Science > Machine Learning' 카테고리의 다른 글
[ML] Ensemble(앙상블)과 Semi-supervised learning (0) | 2020.05.29 |
---|---|
[ML] SVM(Support Vector Machine)서포트 벡터 머신 (0) | 2020.05.26 |
[ML] ANN(Artificial Neural Network) 인공신경망 (0) | 2020.05.12 |
[ML] Perceptron(퍼셉트론)의 이해와 종류 (0) | 2020.05.08 |
[ML] 데이터 학습방법으로서 MLE, MAP (0) | 2020.04.29 |