본문 바로가기

머신러닝/[기타]

Precision at k(Pr@k), Average Precision(AP), Mean Average Precision(MAP)

 일전에 분류 성능평가 - 에 대해 언급한 적이 있는데, 여기에 추가하여, 실제 논문에서 자주 볼 수 있는 Precision at k(Pr@k), Average Precision(AP), Mean Average Precision(MAP) 라는 개념에 대해 정리해둘게요.

 정밀도(Precision)와 재현율(Recall)에 대한 개념을 알고계시다는 가정하에, 다시 한번 말로만 지껄여보면, 정밀도라는 건, 모델이 참이라고 예측(검출)했는데 찐으로 참인 비율. 재현율이라는 건, 실제로 참인 것들 중에 모델도 참이라고 예측한 비율입니다. 그리고 이러한 정밀도와 재현율은 Trade-off 관계에 놓여 있어, 하나가 높아지면 하나는 낮아질 수 밖에 없는 구조였습니다.

 쨋든 정밀도든 재현율이든 일단 계산을 하긴 할텐데, 우선 저희가 가진 샘플의 수는 한두 개가 아니쥬? 개수 자체가 좀 많아요. 그리고 이런 샘플에 대한 예측 결과마다, 그 신뢰도(Confidence)값이 달라요. 신뢰도 99%로 뱉어낸 모델의 T/F와, 신뢰도 1%로 뱉어낸 모델의 T/F를 동등한 위치에 두고 정밀도를 계산하는건, 뭔가 합리적이지 않습니다. 그럼 이걸 으뜨케 처리하느냐. 내가 원하는 임계값 이상의 신뢰도를 갖는 샘플들로만 정밀도를 계산하는 방법이 있겠습니다. 이게 Precision at k(Pr@k)입니다. 신뢰도 순으로 랭킹을 매긴 테이블 위에서 상위 k개의 샘플로 정밀도를 계산하시면 됩니다.

 그렇게 Pr@k를 계산하고 보니, 마음에 걸리는게 하나 있습니다. 결국 어느 정도 이상의 신뢰도를 가져야 내가 인정해줄지, 내가 선택해야하는 파라미터가 하나 생겼는데, 이게 정확한 답이 있는 문제가 아니네요. 내 실험결과가 좋아보이게 사기치기도 좋아보이고, 결국 전체 샘플을 다 사용하지 못하니 정보손실도 있을 것 같습니다. 그래서 Average Precision(AP)을 계산합니다. 방법은 Precision-Recall graph(PR Curve)를 그리면, 둘의 관계가 Trade-off니 전반적으로 우하향하는 그래프가 그려질텐데, 이 그래프의 아래 면적을 계산하면 되겠네요. 다만 이렇게하면, Pr@k의 장점이었던 신뢰도라는 개념을 사용하지 못한다는 단점이 다시 수면 위로 올라오네요. 여기서도, 결국 상황에 맞는 지표를 채택하는 센스가 필요합니다.

 쨋든 이렇게 계산한 AP는, 근본으로 돌아가보면, 결국 하나의 클래스 또는 쿼리에 대한 결과값입니다. 내가 가진 클래스가 한개밖에 없는 상황이 아니라면, 내 모델을 평가하기 위해서는, 모든 클래스에 대한 평가를 해야합니다. 가장 쉽게 생각하면, 각 클래스별 AP를 평균내는 방법이 있겠쥬? 그게 Mean Average Precision(MAP)입니다.

끗.