본문 바로가기

데이터와 함께 탱고를/머신러닝

분류 모델에 대한 성능 평가 지표들

Precision & Recall

Precision 은 모델의 예측 값 중, 실제 값과 같은 데이터의 비율을 말하고,
Recall 은 실제 값 중, 모델의 예측 값과 같은 데이터의 비율을 말한다.

다시 정리하면,
예측해야할 값의 클래스가 A, B, C 가 있다고 할 때,

Precision = (예측 데이터 중, 실제 클래스 A 인 데이터의 수) / (클래스 A 로 예측된 값들의 데이터 수)
Recall = (실제 데이터 중, 클래스 A 로 예측된 값들의 데이터 수) / (실제 클래스 A 인 데이터의 수)

일반적으로 각 클래스 A, B, C 에 대한 각각의 성능 지표를 구한 뒤, 평균을 내어 하나의 지표로 통합하여 표현한다. 평균 외에 다른 방법도 있긴 하다.

이 두 값 모두 0~1 사이의 값을 가지며 1로 갈수록 좋다.

출처 : https://towardsdatascience.com/multi-class-metrics-made-simple-part-i-precision-and-recall-9250280bddc2

위 그림을 예로 들어보면,
Cat 에 대한 Precision 은 4 / (4+6+3) 이고, Recall 은 4 / (4+1+1) 이다.

Precision 과 Recall 중 무엇을 사용할지는 상황에 따라 다르다.
예를 들어, 암 환자를 진단하는 경우를 생각해보면, Precision 과 Recall 은 다음과 같이 생각해볼 수 있다.

  1. Precision : 암 환자라 예측한 수 중 실제 암환자인 비율
  2. Recall : 실제 암환자 중, 예측한 암환자의 비율

이 경우 Recall 을 사용해야 한다.
암 환자가 100명이 있다고 하자. 이 중 내가 만든 모델이 30명을 암환자라고 예측했고, 실제 이 30명은 암환자 였다고 하자.
Precision 값은 30 / 30 = 1이 되고, 이 모델은 매우 좋은 성능을 지니는 것 처럼 보인다.
하지만 실제 암 환자임에도 암 환자라고 진단받지 못한 70명에게는 굉장히 치명적이다.
정상 환자를 암 환자로 잘못진단 하는 것 보다, 암 환자를 정상 환자로 진단하는 것이 상식적으로 더 위험하기 때문이다.
Recall 로 계산해보면, 30 / 100 이 되고, 이 모델은 매우 좋지 않은 성능을 지니는 것을 알 수 있다.

일반적으로, Precision 과 Recall 은 Trade-off 관계에 있다.
따라서, 위와 같이 어떤 지표를 사용할지 확실한 경우가 아니면, 한 값만 극단적이지 않고 두 값 모두 적절히 높은 것이 좋은 성능을 나타낸다 하겠다.

F1-score

F1 score 는 Precision 과 Recall 두 값 모두 고려하기 위한 지표로, 이 두 값을 조화평균을 내어 계산한다.
0~1 사이의 값을 가지며 1로 갈수록 좋다.

클래스 데이터가 불균형할 때 사용하기 좋다.

Accuracy

Accuracy 는 전체 데이터 중, 실제 정답과 동일한 데이터 수의 비율을 말한다.
즉, Accuracy = (실제 데이터 = 예측 데이터 인 데이터 수) / (전체 데이터 수)

가장 직관적이고 사용하기 편하지만,
클래스 데이터가 불균형할 때 해석의 왜곡을 불러온다.

예를 들어, 전체 데이터 100가 있고 이 중 A 클래스가 90개 , B클래스가 10개가 있다고 하자.
만약 내가 만든 모델이 A 클래스는 100개, B 클래스는 0개라고 예측해도 accuracy 는 90%가 된다.
90% 라는 수치만 보면 잘 예측하는 모델이라 생각할 수 있는데, 사실 예측 값을 놓고보면 전혀 아닌 것이다.

따라서, 클래스 데이터가 어느 정도 균형구조일 때만 사용하는게 일반적이다.

Confusion Matrix

Confusion Matrix 는 성능 평가지표 그 자체는 아니지만, 위에서 설명한 지표들을 하나의 Matrix 로 설명할 수 있다.
먼저, Confusion Matrix 는 이진 분류 상황만을 가정한다.
다음과 같이 예측 값-실제 값을 비교한 테이블, Confusion Matrix 라 불리는 테이블을 만들 수 있다.

예측 값과 실제 값을 비교하면 다음과 같이 4가지 경우의 수가 나온다.

  • TP (True Positive) : 맞춘 경우. 실제 값이 1이고, 예측 값도 1인 경우.
  • FN (False Negative) : 틀린 경우. 실제 값이 1인데, 예측 값은 0인 경우.
  • FP (False Positive : 틀린 경우. 실제 값이 0인데, 예측 값은 1인 경우.
  • TN (True Negatives) : 맞춘 경우. 실제 값이 0이고, 예측 값도 0인 경우.

TP 에서 앞의 T 는 실제 값 == 예측 값인 경우를 의미하고, P 는 예측 값이 1인 경우를 의미한다.
맞췄는가? T 예측값은? P. 이런 순서로 이해하면 보기가 쉽다.

위에서 이야기한 3가지 지표는 이제 다음과 같이 이해해볼 수 있다.

  • Accuracy
    • 전체 케이스 중, 맞춘 케이스의 비율
    • (TP + TN) / (TP + FN + FP + TN)
  • Precision
    • 모델이 1이라고 예측한 케이스 중, 실제 값이 1인 케이스의 비율
    • TP / (TP + FP)
  • Recall
    • 실제 값이 1인 케이스 중, 모델이 1이라고 예측한 케이스의 비율
    • TP / (TP + FN)

ROC-AUC score

ROC-AUC 는 좀 더 섬세한 설명이 필요하다.
StatQuest with Josh Starmer 의 영상을 참고하여 적어둔다.

먼저, ROC-AUC score 를 사용하기 위해서는 우리가 예측한 값은 0~1 사이에 있어야 한다.
즉 이전에는 단순히 0과 1로만 예측했다면 이제는 0.33 이라든가 0.56 과 같은 값도 가능하다는 말이다.

여기서는 예를 들기 위해, 몸무게로 비만인지 아닌지를 예측해보는 문제를 풀어보자.
예측 모델을 Logistic Regression 을 사용한다고 하자.
Logistic Regression 은 0~1 사이의 값으로 예측한다.

데이터를 그래프로 그리면 다음과 같다.

Logistic Regression 모델을 훈련시켜 다음과 같은 함수를 얻었다.

각 데이터는 Logistic Regression 함수 식에 입력되어 0과 1사이의 값 (그래프에서 Is Not Obese 는 0 Is Obese 는 1이다) 으로 예측될 것이다.

이제 적절한 threshold 를 두어, 이렇게 0~1로 나온 값들을 0과 1로 분류해보자.
먼저 0.5를 threshold 로 두면 다음과 같이 된다.

잘 분류가 된 것도 있고, 잘 분류가 안된 것도 있다.
위 그래프에서는 2개의 데이터만 잘 분류가 안되었다. 
(1인데 0으로 분류된 데이터 1개, 0인데 1로 분류된 데이터 1개)

이제 이를 Confusion Matrix 로 보면 다음과 같다.

위 그래프를 보고 하나하나 숫자를 하나씩 채우면 이렇다!

이제 Confusion Matrix 에서 우리가 관심있는 것만 보기로한다.
우리는 TPR (True Postivie Rate) 과 FPR (False Positive Rate) 에만 관심을 가질 것이다.

TPR 은 다음과 같이 정의된다.

실제로 1인 것 중 내가 예측한 값이 1인 비율이며, Recall 하고 동일한 값이다.
즉 내가 잘 예측한 경우다. 이 값은 높을수록 좋다.

FPR 은 다음과 같이 정의된다.

실제로는 0인 것중, 내가 예측한 것이 1인 비율이다.
즉, 내가 잘 못 예측한 경우다. 이 값은 낮을수록 좋다.

지금까지 한걸 생각해보자.
훈련시켜놓은 모델을 가지고,

  1. 하나의 threshold = 0.5를 가지고
  2. TPR 과 FPR 을 계산할 수 있다.

이제 다음과 같은 그래프를 생각하고, Threshold 를 0부터 1까지 옮겨보며 TPR과 FPR 을 계산해보자.

맨 처음 Threshold 가 0인 경우를 보자.
이 경우에도 마찬가지로 Confusion Matrix 를 그려볼 수 있고, 여기에서 TPR 과 FPR 값을 계산할 수 있다.
Threshold 가 0인 경우, TPR 은 1 FPR 은 1 이 된다.
이를 오른쪽 그래프에 점으로 찍으면 다음과 같다.

생각해보자. 방금은 TPR = FPR = 1 이었다.
TPR 과 FPR 이 같다는게 무슨 의미일까?
TPR 과 FPR 의 정의를 생각해보면, 잘 맞추는 비율, 잘 못 맞추는 비율 정도로 생각해볼 수 있는데,
TPR = FPR 이라는건, 내가 예측한 값 중, 절반은 맞고 절반은 틀리다는 것이다.
그리고 Threshold 를 0부터 1까지 옮기면서, TPR = FPR 이 되는 경우는 앞으로 위 그래프에서 초록색 점선 위로 등장할 것이다.

이제 다시 Threshold 를 0에서 0.1, 0.2 ... 1까지 하나씩 옮겨보며 TPR, FPR 을 계산하고 이를 그래프에 점으로 찍어보자.

이렇게 0부터 1까지 Threshold 를 옮기면 무수히 많은 점이 찍힐 것이다.
이렇게 찍힌 점들을 쭉 연결하고, x축과의 넓이를 구하면 다음과 같이 빨간색으로 표시할 수 있다.

먼저 이렇게 점들을 연결한 곡선을 ROC 커브 (Receiver Operating Characteristic) 라고 한다.
그리고 그 곡선 아래의 넓이를 AUC (Area Under Curve) 라고 하며, 이게 이 모델의 성능지표가 된다.
이 넓이 값을 구해보니 0.9 였다.

이 값이 왜 모델의 성능 지표인가?
우리가 지금까지 사용한 모델말고, 다른 모델로 같은 문제를 예측했다고 해보자.
그리고 이 다른 모델 역시 같은 과정을 통해 AUC 를 나타낼 수 있다.
여기서는 파란색으로 표시하였다.

딱 봐도 면적이 빨간색 보다 작다.
이게 무엇을 의미하는 걸까?
x 축과 y 축을 다시 살펴보자. 
y 축은 TPR 을 나타낸다. 즉 TPR 높을수록 모델은 잘 예측하고 있는 것이고, TPR 이 높을수록 모델의 AUC 가 넓어진다.

즉, 우리는 이 넓이 값, AUC 의 값으로 빨간색을 그려낸 모델이 파란색을 그려낸 모델보다 더 잘 예측하는 모델임을 알 수 있다.

정리해보면, ROC AUC score 는 Threshold 를 0부터 1까지 옮기며 곡선을 그리고 그 곡선 아래의 넓이를 구한 값이라 할 수 있겠다.