brunch

You can make anything
by writing

C.S.Lewis

by 여운 Dec 26. 2022

영원히 헷갈리지 않을 precision과 recall

메일함에 스팸이 너무 많이 쌓여서 귀찮아진 자연어 처리 전문가가 어떤 메일이 스팸인지 분류하는 모델을 만들었다고 하자. 이 모델이 얼마나 잘하는지는 어떻게 평가할 수 있을까?


가장 널리 알려진 방법은 정확도(accuracy)이다. 단순히 전체 메일 중에 그 모델이 맞게 분류한 메일이 몇 개나 되는지, 그 비율을 따지면 되지 않을까?

하지만 현실은 그렇게 호락호락하지 않다.

이 세상엔 스팸보다 스팸이 아닌 메일이 더 많다. 꼼수를 부려 일부러 모든 메일을 무조건 스팸이 아닌 메일로 분류하는 바보 같은 모델을 만들었다고 하자. 이 모델을 정확도로 평가하면 어떻게 될까? 전체 메일 100개 중에서 10개가 스팸, 90개가 스팸 메일이 아니라고 하면, 이 모델이 아무리 바보 같을지라도 정확도 90%를 달성하게 된다.


그래서 필요한 것이 recall이다.

recall은 (진짜로 True이고 모델도 True로 예측한 데이터의 수)/(진짜로 True인 데이터의 수)이다.

"진짜로 True, 즉 스팸인 데이터"는 10개이고, "진짜로 True이고 모델도 True로 예측한 데이터"는 0개이다. 이 바보 같은 모델은 항상 False (스팸이 아니라)고 예측하기 때문이다. 따라서 recall은 0.0으로 매우 매우 작은 값이 된다. 바보 같은 모델이 바보 같다는 사실을 잘 포착했다.


하지만 반대로 True를 남발하는 모델이라면 어떨까? 아주 예민하게 메일을 의심해서 대부분의 메일을 스팸으로 분류하는 모델이 있다고 하자. 그러면 recall 값은 매우 높아질 것이다. 하지만 이것도 바람직한 모델이 아니다.

이 모델을 멈춰 세우기 위해서는 precision이 필요하다.

precision은 (모델이 True로 예측했고 진짜로 True인 데이터의 수)/(모델이 True로 예측한 데이터의 수)이다.

True를 남발하는 모델이라면 분모인 "모델이 True로 예측한 데이터의 수"가 엄청 커져서 전체 precision 값은 작아질 것이다.


이렇게 무조건 False를 남발하는 모델을 멈춰 세우기 위해서는 recall, 무조건 True를 남발하는 모델을 멈춰 세우기 위해서는 precision이 필요한데, 분자는 똑같고 분모만 달라서 이 둘이 무지 헷갈린다! 누가 누구를 멈춰 세우는 거지?!


precision의 분모는 (모델의) prediction이 True인 것, recall의 분모는 reference가 True인 것이라고 생각하면 다시는 헷갈리지 않을 수 있다. reference의 의미가 약간 이해가지 않을 수 있는데, 번역 과제에선 label 문장을 reference 문장이라고도 많이 부른다. 여기서의 reference도 label(실제 답)의 의미 정도로 받아들이면 된다.



f1은 이 둘의 조화평균인데 다음의 식에 대입해 계산하면 된다. 정확도는 True 또는 False를 남발하는 모델에 속기 쉽지만, 정확도 대신 f1을 쓰면 True 또는 False만 남발하는 바보 같은 모델을 바보 같다고 잘 평가할 수 있다.




Thumbnail Photo by Solen Feyissa on Unsplash

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari