본문 바로가기

Enginius/Machine Learning

Precision과 Recall

 Precision과 Recall은 통계가 들어간 논문을 봤던 사람이라면 한번쯤은 봤을 개념이다. 대략적인 개념이야 어깨 넘어로 들었다고 하지만 실제로 이를 계산하려고 하면 헛갈릴 때가 많다. 그래서 정리도 한번 할 겸 이번 포스팅을 시작한다. 


 Precision과 Recall을 계산하기 위해선 아래 표에 대해서 알아야 한다. 

 (T: True, F: False, P: Positive, N: Negative)

 

 실제 값

실제 값

추정 값

 TP: 1이라고 예측 했는데 실제론 1

 FP: 1이라고 했는데 실제론 0

추정 값 

 FN: 0이라고 예측 했는데 실제론 1

 TN: 0이라고 했는데 실제론 0 


 기본적으로 Precision Recall은 1 or Nothing 문제에 적합 한 것 같다. 즉 multi class 문제에는 정의하기 조금 애매해 지는 것 같다. 여튼 다시 원래 주제로 돌아오자면, Precision, Recall, Accuracy는 다음과 같이 정의된다. 


 '$Precision = \frac{tp}{tp+fp}$'

 '$Recall = \frac{tp}{tp+fn}$'

 '$Accuracy = \frac{tp+tn}{tp+tn+fp+fn}$'


 이것의 물리적 의미를 살펴보면,

 Precision의 경우 내가 1이라고 예측한 것(positive) 중에서 실제로 1인 것(TP)의 비율이다. 즉 내가 예측을 하긴 했는데 이게 얼마나 잘 하는지에 대한 것이다. 

 Recall의 경우 실제로 1인 것 중에서 내가 correct를 얼마나 했나를 나타낸다. 사실 좀 애매한 개념이긴 하다. 이 개념은 Sensitivity라고도 불린다. 즉 전체 1 중에 내가 몇개를 맞췄냐는 것이다. 

 Accuracy는 그런 것 없고 그냥 전체 중에서 맞게 예측한 것이 몇개를 나타낸다. 



 자 그럼 문제가 하나 있다. positive와 negative가 있는 문제가 아니라 그냥 label을 맞추는 문제라면? 


 내 생각에는 두 가지 방법이 있을 것 같다. 

 하나는 특정 label에 대한 precision recall을 그릴 수 있을 것 같다. 즉 여러 개의 label일 때 개별 label에 대해서 위의 계산을 다 하는 것이다. 그래서 해당 label이 맞으면 positive, 틀리면 negative로 하는 것이다. 

 다른 하나는 특정 label에 대해서 계산을 하고, 구한 TP, FP, FN, TN을 모두 다 더하는 것이다.