불균형 데이터셋의 분류 문제

딥러닝(neural network) 분류(classification) 모델을 학습할 때 종속 변수의 각 클래스의 데이터 개수가 비슷해야 한다. 데이터 개수가 비슷하지 않고 특정 클래스에 데이터 수가 몰려 있으면 그 클래스에 치우쳐진(편향된) 분류 모델이 나올 수 있다. 어느 한 클래스에 편향된 모델을 막기 위해 종속변수 \(y\)의 클래스 별 데이터 개수가 비슷한 학습데이터셋 확보가 중요하다.

하지만 일반적으로 실제 수집되는 데이터는 그렇지 않다. 예를 들어서 특정 질병 유무를 판단하는 모델이나 공정데이터를 이용해서 불량을 찾는 모델을 보면 비정상군의 데이터 확보의 어려움으로 인해 정상군의 데이터 수가 비정상군에 비해 훨씬 많다. 이렇게 클래스마다 데이터의 개수가 크게 차이나는 데이터셋을 불균형 데이터셋(imbalanced data set)이라고 한다. 비율을 비슷하게 맞추기 위해서 수가 많은 집단(majority class)의 데이터를 덜어내거나(undersampling) 적은 집단(minority class)의 데이터를 늘리는(oversampling) 전처리 방법에 대한 설명은 생략하고 다음 두 가지 내용을 다룰 것이다.

  • 불균형 데이터셋으로 학습한 모델이 효과적이지 않은 이유
  • 불균형 데이터셋을 고려한 이진분류 모델 평가 방법

1. 불균형 데이터셋으로 학습한 모델이 효과적이지 않은 이유

직관적으로 한 클래스의 데이터 개수가 다른 클래스 데이터보다 극단적으로 많다고 가정해보자(999:1 정도?). 임의로 데이터를 선택했다면 당연히 데이터의 개수가 많은 클래스에서 뽑혔을 확률이 높을 것으로 기대된다. 즉, 앞에서 언급한 것 처럼 분류 모델이 개수가 많은 클래스에 치우치게 되는데 이런 현상이 발생하는 이유를 살펴보자.

기계학습(machine learning)에서 모델 \(H\)가 학습한다는 뜻은 모델이 주어진 정보(학습데이터)를 잘 설명(표현 또는 예측) 하도록 \(H\)의 parameter를 찾는 것이다. 잘 학습된 \(H\)를 이용해서 의사결정 분류를 자동화하는 것이 분류 모델의 목적이다. 분류 모델 \(H\)를 학습하기 위해서 즉, \(H\)의 parameter들을 업데이트하기 위해서 \(H\)의 성능을 평가하는 parameter \(\theta\)에 대한 목적함수(objective function) \(f\)를 정의한다. 여기서 \(\theta\)는 parameter들의 집합을 의미한다. 예를 들어서

\[\theta=\{W_0,W_1,\ldots,W,b_0,b_1,\ldots,b \}.\]

목적함수 \(f(\theta)\)를 분류 모델의 정확도(accuracy)로 정의한다면 정확도 \(f\)가 최댓값을 갖는 \(\theta\)를 찾는 문제가 될 것이다.

\[\text{argmax}_\theta \, f(\theta)\]

하지만 정확도 \(f\)는 \(\theta\)에 대한 계단함수(step function)로 표현되기 때문에 \(\nabla _\theta f\)를 통한 \(\theta\)의 업데이트가 불가능하다(Gradient descent optimizer 적용 불가능). 그래서 미분이 가능하고 모델의 성능을 평가할 수 있는 목적함수로 데이터의 실제 라벨 \(y_i\)와 예측 확률 값 \(H(x_i)\)와의 오차를 측정하는 cost 함수로 정의한다. 쉽게 설명하기 위해서 이진분류 모델로 생각해보자. 이진분류 모델의 cost 함수는 MSE 대신 cross-entropy를 사용한다. 참조: Binary classification with Cross entropy. 이진분류 모델 \(H\)의 cost 함수인 cross-entropy를 살펴보자. 데이터의 개수는 \(N\)이다.

\[\begin{equation} \text{cost} = -\frac{1}{N} \sum_{i=1}^N \left [ y_i \log H(x_i) + (1-y_i)\cdot \log(1-H(x_i)) \right]. \end{equation}\]

이진분류 학습의 목표는 cost가 최솟값을 갖는 \(\theta\)를 찾는 것이다.

\[\text{argmin}_\theta \, \text{cost}(\theta)\]
  • \(y_i=1\)인 데이터의 경우
\[\text{error}=-\log H(x_i)\]

으로 오차 측정: \(y_i=1\)이므로 예측값 \(H(x_i)\)은 1에 가까운 값으로 학습

  • \(y_i=0\)인 데이터의 경우
\[\text{error}=-\log(1- H(x_i))\]

으로 오차 측정: \(y_i=0\)이므로 예측값 \(H(x_i)\)은 0에 가까운 값으로 학습

\(y_i=0\)인 데이터의 개수가 \(k\)라면 cost (1)은 다음과 같이 표현 될 수 있다.

\[\text{cost} = \frac{1}{N} \bigg [ \underbrace{-\sum_{i=1}^{N-k} \log H(x_i | y_i =1)}_{=:A} \, \underbrace{-\sum_{i=1}^{k} \log(1-H(x_i | y_i =0))}_{=:B} \bigg].\]

여기서 만약 \(k\)가 \(N\)에 가깝다면(\(y_i=0\)인 데이터가 다수인 경우) 전체 cost 중에서 B의 비중이 높기 때문에 cost를 최소로 만들기 위해서 오차 A의 영향을 무시할 수 있다. 다시 말해서 A에서 큰 오차가 발생하더라도 \((N-k)\)에 비해 \(k\)가 큰 수이기 때문에 B에서 발생하는 오차를 최소하는 것이 cost를 최소화 할 수 있는 것이다.

아래 그림은 \(y_i=0\)과 \(y_i=1\) 비율이 10000:10인 데이터의 cost가 최소가 되는 이진분류 결과를 보여준다. Sigmoid 함수를 \(x\)축과 접하게 함으로써 \(y_i=0\)일 때 발생하는 오차 B를 최소화하는 방향으로 학습이 진행 됐다. 빨간점과 파란색점이 실제로 분리되어있음에도(빨간점의 최댓값 \(<\) 파란점의 최솟값) 불구하고 아래 모델은 데이터 3개를 오판하였다.


2. 불균형 데이터셋을 고려한 이진분류 모델 평가 방법

다음은 이진분류 모델의 성능을 평가하는 방법에 대해 살펴보자. 분류모델이 학습데이터를 잘 학습해서 일반화가 잘 됐는지 확인하거나 여러 모델 중 가장 좋은 것이 어떤 것인지 찾을 때 정량적인 지표를 이용해서 모델의 성능을 평가하는 법을 다룰 것이다.

예측 결과와 실제 라벨을 비교해서 얼마나 예측이 정확한지 계산하는 정확도(accuracy)는 불균형 데이터 분류 모델의 성능을 제대로 평가하기 어렵다. 예를 들어서 정상군의 데이터가 99개, 불량군의 데이터가 1개 있는 불균형 데이터셋이 있다고 하자.

Normal Abnormal
99 1

만약에 분류 모델이 이 불균형 데이터로 인해서 모든 데이터를 정상이라고 판별하더라도 정확도는 99%이다. 물론 정확도가 100%이면 학습결과가 좋다고 할 수 있지만 그 외의 경우에서는 정확도가 모델의 성능을 제대로 평가하지 못한다. 데이터의 개수가 많은 집단의 데이터 비율을 정확도의 최소 기준(base line)으로 잡아야 한다. 즉, 위 경우 정확도가 99% 이하인 모델은 제대로 학습된 모델이 아니다.

그래서 모델의 성능을 제대로 설명할 수 있는 다양한 지표들을 알아보자. 앞으로 성공(positive)과 실패(negative)를 분류하는 이진분류 모델을 생각해보자. 성공과 실패 두 클래스로 분류된 데이터셋은 다음과 같이 나타낼 수 있다.

그리고 이진분류 모델의 분류 결과(예측값)를 다음과 같이 표현해보자.

분류 모델에 의해서 정상과 불량을 예측한 결과를 보여준다. 예를 들어서 모든 데이터를 정상이라고 판단한 모델은 다음 그림처럼 표현된다.

실제 데이터의 라벨값인 성공/실패 여부와 분류 모델의 예측 결과를 바탕으로 데이터를 다음과 같이 4가지로 나눌 수 있다. 실제 라벨값을 고려해서 예측이 맞았는지 틀렸는지 판단한 분류다.

  • True positive (TP): 성공이라고 한 예측이 인 경우
  • False positive (FP): 성공이라고 한 예측이 거짓인 경우
  • True negative (TN): 실패라고 한 예측이 인 경우
  • False negative (FN): 실패라고 한 예측이 거짓인 경우

앞의 True와 False는 예측이 맞았는지(True) 틀렸는지(False)를 말해준다. 즉, TP+TN은 예측이 참인 경우이고 FP+FN은 예측이 거짓인 경우의 수를 나타낸다. 뒤에 positive(성공)와 negative(실패)는 모델의 예측 결과를 보여준다. False positive는 성공이라고 예측했지만 이 예측이 거짓인 경우다. 즉 실제 라벨값은 실패(negative)다.

\[\underbrace{\text{False}}_{\text{예측: 거짓}} \quad \underbrace{\text{positive}}_{\text{예측값: 성공}} = \text{성공(positive)이라고 예측했지만 틀린(False) 예측}\]

이 분류를 표로 만들면 다음과 같고 이를 confusion matrix 오차행렬이라고 한다.

  Positive prediction Negative prediction
Observed positive True positive (TP) False negative (FN)
Observed negative False positive (FP) True negative (TN)

이 오차행렬을 이용하여 모델을 정량적으로 평가하는 법에 대해 살펴보자.

  • 정확도(accuracy)

실제 라벨과 예측의 결과를 비교해서 구하는 값으로 예측결과가 참인 경우의 수를 전체 데이터의 개수로 나눈 값이다.

\[\text{accuracy}=\frac{\text{TP} + \text{TN}}{\text{P}+\text{N}}\]
  • Sensitivity or Recall (True positive rate, TPR)

실제 라벨이 성공인 데이터 중에서 성공으로 예측된 데이터의 비율을 나타낸다. 즉, 성공인 데이터를 기준으로 얼마나 정확하게 예측했는지를 나타내는 지표다.

\[\text{Sensitivity} = \frac{\text{TP}}{\text{P}}\]
  • Specificity (True negative rate, TNR)

실제 라벨이 실패인 데이터에서 실패로 예측된 데이터의 비율을 나타내며 실패인 데이터를 얼마나 정확하게 예측했는지 알려준다(Sensitivity의 실패 version).

\[\text{Specificity} = \frac{\text{TN}}{\text{N}}\]
  • False negative rate, FNR

실제 라벨이 성공인 데이터 중에서 오차율을 나타낸다.

\[\text{FNR} = \frac{\text{FN}}{\text{P}} = 1-\text{TPR}\]
  • False discovery rate, FDR or False positive rate, FPR

실제 라벨이 성공인 데이터 중에서 오차율을 나타낸다.

\[\text{FDR} = \frac{\text{FP}}{\text{N}} = 1-\text{TNR}\]

TPR, TNR, FNR, FDR 4개 값은 실제 라벨을 기준으로 참 또는 거짓으로 예측한 비율로 정의했다.

이제 예측 결과를 기준으로 모델의 성능을 평가하는 지표에 대해 알아보자.

  • Precision or Positive predictive value, PPV

Precision은 성공이라고 예측한 경우 참으로 예측한 비율로 다음과 같이 정의한다.

\[\text{Precision} = \frac{\text{TP}}{\text{TP+FP}}\]
  • Negative predictive value, NPV

NPV는 실패이라고 예측한 경우 참으로 예측한 비율로 다음과 같이 정의한다.

\[\text{NPV} = \frac{\text{TN}}{\text{TN+FN}}\]

정리하면 다음과 같다.

지표
정확도(accuracy) $\frac{\text{TP} + \text{TN}}{\text{P}+\text{N}}$
오차율(error rate) $\frac{\text{FP} + \text{FN}}{\text{P}+\text{N}} = 1- $ accuracy
Sensitivity or Recall (True positive rate, TPR) $\frac{\text{TP}}{\text{P}} $
Specificity (True negative rate, TNR) $\frac{\text{TN}}{\text{N}} $
False negative rate, FNR $\frac{\text{FN}}{\text{P}} = 1-\text{TPR} $
False discovery rate, FDR or False positive rate, FPR $\frac{\text{FP}}{\text{N}} = 1-\text{TNR} $
Precision or Positive predictive value, PPV $\frac{\text{TP}}{\text{TP+FP}} $
Negative predictive value, NPV $\frac{\text{TN}}{\text{TN+FN}} $

Reference

  • Classifier evaluation with imbalanced datasets