정리 조금/Basics

F1 score

Turtle0105 2023. 1. 13. 01:38

Binary classification

Intro

  이진 분류는 두가지 범주를 갖는 표본을 분류하는 것이다. 분류는 일상 뿐 아니라 여러 산업에서 중요하게 사용되어 왔다. 전통적인 통계 모형인 (MLE를 IRLS로 추정하는) logistics regression부터, 오래 된 머신러닝 기법이지만 여전히 tabular data에서는 건재한 random forest & SVM 그리고 한때 Kaggle을 휩쓸던 강력한 XGBoost를 거쳐, 아직 빛을 보지못한 여러 최신 분류 모델까지... 이번 포스터에서는 이런 방법론에 대한 자세한 이야기를 하기전에 먼저 이진 분류 모델 평가 지표에서 가장 많이 쓰이는 것들 중 하나인 F1 score에 대하여 알아보고자 한다.

Comfusion matrix

 
Confusion martix
  이진 분류 모델의 결과는 이런 테이블로 정리할 수 있다. 이 테이블의 이름은 confusion matrix, 혼동행렬이다. 실제로 엄청나게 혼동된다. 우선 각 요소의 의미는 아래와 같다.
 

True positive (TP)
* 양성(+)이라고 예측하여 맞춘 것

True negative (TN)

* 음성(-)이라고 예측하여 맞춘 것

False positive (FP)

* 양성(+)이라고 예측하여 틀린 것

False negative (FN)

* 음성(-)이라고 예측하여 틀린 것

 

Metrics

  왜 이렇게 복잡하게 나누어 생각 하는가? 그냥 전체중에서 맞게 예측한 것이 얼마나 되는지 보면 되는것이 아닌가? 이 지표를 accuracy(Acc)라고 하는데, 아래 식으로 보면 전체분에 맞춘것을 의미하며 익숙한 지표이다.

 

 

  Coin toss와 같이 아주 간단한 예시를 보자.
Example 1

  100번 동전을 던졌을 때 예시와 같이 85번을 맞추는 모델이 있다면 매우 좋은 모델일 것이다. 이때의 ACC는 아래와 같이 계산된다.

 

$$ Acc={{45+40}\over{45+40+7+8}}=85\% $$

 

 

  그렇다면 다음과 같이 사막에서 비오는 날을 맞추는 경우는 어떨까?

Example 2

  일반적으로 사막은 거의 비는 오지 않고, 햇볕만 내리쬔다. 이에따라 모델은 거의 다 비가 오지 않는다고 학습될 것이고 예시의 결과처럼 100일 중 93일을 비가 오지 않는다고 찍는 모델이 있다 하자. 이 경우에서 ACC를 계산하면 무려 95번이나 맞추게 되어 높은 값이 나온다.

 

$$ Acc = {{90+5}\over{90+5+2+3}}=95\% $$

 

  실제로 저 confusion matrix를 보지않고, Acc의 숫자만 보고서는, 비가오는 날을 잘 선별하는 좋은 모델인지, 아니면 그냥 일반적으로 비가 안오니까 비안온다고 찍어서 수치만 잘 나오는 좋지 못한 모델인지 판단이 잘 서지 않는다.

 

  이렇게 ACC만으로는 판단하기 어려운 경우가 존재한다. 비오는 날을 잘 골라낸다는 실제적인 평가와 신뢰 할 만한 판단을 위해 Recall과 Precision 두 가지 지표를 더 활용한다. Recall은 실제 양성(+) 중 맞는 경우를, Precision은 양성(+) 이라고 판단 한 것중 맞는 경우를 의미한다. 아래의 식을 보면 더 이해하기 쉬울 것이다. 

 

$$ Recall = {{TP}\over{TP+FN}} $$

 

$$ Precision = {{TP}\over{TP+FP}} $$

 

  이 두가지 지표를 example 2에 적용해 보면 아래와 같이 나온다. 

  실제 비 오는 날 중에 비온다고 잘 맞춘 경우는 8번 중 5번으로 (Recall 0.63) 그리고 비온다고 맞춘 날 중에 실제로 비가온 날은 7번 중 5번으로 (Precision 0.71) 제법 괜찮아 보인다. 하지만, Acc 0.95라는 매우 좋아보이는 성능수치와는 거리감이 꽤 있다.

 

F1 score

  F1 score는 이 두 지표의 조화평균이며, 아래와 같이 계산된다.

  그런데 왜 그냥 산술평균이 아니라 조화평균인 것 일까? 우선 조화평균은 대표적으로 속력의 평균을 구할 때 많이 사용된다. 아래와 같이 평균 속력 x를 구하고 싶다.

 

  이 경우 단순하게 10m/s와 20m/s로 왕복했으니 산술평균으로 15m/s가 답이 아닌가 싶다.

 

  하지만, 속력의 의미를 생각해보면 다른 답이 나와야한다. 주어진 속력 대로라면, A에서 B로 갈 때에 10초, 반대로 B에서 A로 갈 때에 5초로 총 15초가 걸린다. 결국 15초 동안 200m를 움직이니, 200/15 (m/s)의 값이 나오며 대략 13.33m/s로 15m/s와 다르다. 시간당 거리는 같은 시간 단위로 비교해야 하기 때문에 발생하는 문제다. 조화평균은 결국 같은 단위로 계산하여 타당한 속력의 평균을 낼 수 있게한다. 

 

 

  속력에서의 거리처럼 같은 맥락으로, Recall과 Precision 둘 다 분자에 TP가 있다. Recall과 Precision의 조화평균은 결국 분모의 구성 2TP + FN + FP 중 2TP의 비율을 알고 싶은 것이다. 

 

 

  마지막 예시로 Recall과 Precision이 아래와 같이 나오는, 모델이 대부분 양성(+)이라고 찍는 경우를 생각해보자. 이 경우 산술평균과 조화평균이 매우 상이하게 나온다. 산술평균을 보면 찍어서 둘 중 하나 맞추는 정도의 모델로 보이지만, 조화평균을 보면 매우 좋지 않아보이는 모델이다. 실제로도 전부 positive라고 찍는 모델로 정상적이지 않은 경우이다.

Example 3

Outro

  데이터를 만지다보면 여러 상황이 온다. 포스트에서 다룬 metric들이 필요한 상황이 올 때가 있고, balanced accuracy가 필요하거나, 혹은 Area Under Curve (AUC) 같은 지표가 더 필요할 때가 있다. 여유가 있다면, 여러 상황에 맞는 지표를 활용 할 수 있도록 더 많은 지표를 이해해야 할 것 같다.

 

  혹시라도 포스터에 잘못된 내용이 있어 알려주시면 감사할 것 같습니다.

남은 이야기들

1. Trade-off

  이진 분류의 평가는 상황에 따라 더 복잡하며, 고려할 내용도 많다.

  예를들어, 암 진단과 같이 하나라도 놓친다면 매우 큰 피해를 보는 상황이 있을 수 있다. 때문에 모든 실재 암을 탐지해야하여 암이라 판단하는 threshold를 낮추어 recall을 높이는 방향으로의 작업이 필요하다. 주변에서 건강한 상태를 암으로 오진하여 큰 병원을 방문하는 사례를 드물게 볼 수 있는 이유이다.

  반대로 유해매체 차단 알고리즘에서는 하나라도 유해매체를 안보이게 하는 것이 중요하다. 때문에 유해매체가 아니라고 보여주는 것 중에서 유해매체가 정말로 없어야 한다. 이 경우 threshold를 높여 precision을 높이는 방향으로 진행한다. 청정 유튜버가 알고리즘의 오해를 사서 노란딱지를 받고 하소연하는 일이 종종 보이는 이유이다.

  복합적으로는 자율주행차의 예시가 있다. 지율주행은 오브젝트를 감지하는 알고리즘이 필요하며, 이를 학습시키기 위해 도로위의 주요 사물에 박스를 친 영상 자료를 사용한다. 이때 박스를 너무 작게 주면 사고가 일어나게 되고, 반대로 박스를 너무 크게 주면 false alarm이 자주 일어나게 되어 도로위가 혼란스럽게 될 것이다. 때문에 데이터 레이블링 시 딱 맞는 박스를 치도록 권장된다.  

 

Threshold

  사막예시 (example 2) 를 가지고 양성(+)과 음성(-)을 나누는 기준 값, threshold를 바꿔가며 지표들에게 일어나는 상황을 봐보자. 아래의 그림은 threshold가 0.5인 경우다.

  Threshold를 왼쪽으로 많이 옮기면, 다시말해 아무리 맑은 날에도 어지간하면 다 비가 온다고 예측하면 실제 비오는 날에 대한 예측은 전부 맞겠지만, 비가온다고 한 날 중에 오지 않는 날이 훨씬 많이 끼어있어 실제로 비가 온 날의 비율은 매우 적어질 것이다. 정리하자면, Recall은 올라가고 Precision은 내려간다. 

  반대로 보수적으로 어지간히 흐리고 습하고 먹구름이 끼어서 비가올것 같은날이 아니고서는 비가 온다고 예측하지 않는 경우라면, 비가 온다고 한 날 중에는 비가 오지 않는 날이 없음으로 실제로 비가 온 날의 비율이 매우 높을 것이며, 실제로 비가 올만한 날인데도 오지 않는다 해버리니 실제 비가 온 날 비가 왔다고 맞춘 비율은 매우 낮아지게 된다. 즉, Recall은 내려가지만, Precision은 올라간다.

2. F1 에서 1의 의미

  아래는 $F_{\beta}-score$로 $\beta$가 1보다 커지면 recall에, $\beta$가 1보다 작아지면 precision에 더 가중치를 주어 구한 점수이다.

   분수식을 조금 바꾸어보면 분모가 $\beta^2 * recall^{-1} + precision^{-1}$가 되며, 결국 recall의 분모부분인 TP + FN에 $\beta^2$가 곱해지는 꼴이 된다. 때문에 $\beta$값이 커질수록 $F_{\beta}-score$는 recall에 가까운 값이 된다. 반대로 $\beta$값이 1에서부터 0에 가까워 지면 precision 값에 가까워진다. $(1 + \beta^2)$의 값은 TP의 scale을 맞춰주는 계수로 크게 신경쓰지 않아도 된다. 

 

  수치적으로 사막예시 (example 2)의 recall과 precision값에 $\beta$를 조정하며, F 값이 어떻게 움직이는지 확인해보면 아래와 같다.

def f_score(recall, precision, beta):
  return (1 + beta**2)*precision*recall/((beta**2)*precision+recall)
import numpy as np
betas = np.arange(0,10,0.1)
recall, precision = 0.63, 0.71
fs = f_score(recall, precision, betas)
import matplotlib.pyplot as plt
plt.plot(betas, fs)

 

  그래서 결국 F1 score에서 1의 의미는 $F_{\beta}-score$에서 $\beta=1$인 경우로, precision과 recall 두 수치 모두 동일한 가중치를 주어 계산한 평균의 경우라 생각하면 된다.

 

출처

그림: 내가 만듦

지식참고: Wikipedia - F1 Score

 

Binary_Classification_Metrics.pdf
0.22MB

'정리 조금 > Basics' 카테고리의 다른 글

SSH, Host Keys  (0) 2023.10.12
Expectation vs. Average  (0) 2023.09.04
Exact & Asymptotic p-values  (0) 2023.08.31
Scale Free Network  (0) 2023.08.31
Replicates  (0) 2023.08.28