TOP-1 Accuracy: softmax 의 최종 output에서 최대값을 추출합니다. 일반적으로 accuracy 라고 생각하면 떠올리면 됩니다. 제일 높은 확률값을(= 자동으로 예측된 정답 후보군 들 중 제일 높다고 생각되는 것) 을 의미합니다.
Top-N Accuracy: 예측 클래스가 소프트맥스 분포의 상위 N 값에 포함되는 빈도를 측정하는 경우를 의미합니다.
예를 들어보겠습니다.
'실제 이미지': 사과
를 어떤 모델에 넣어서 분류를 했다고 하겠습니다.
'모델의 예측 확률': 배:0.3 , 딸기: 0.25, 사과: 0.2, 오렌지:0.1, 레몬: 0.05 , 포도: 0.04, 체리: 0.03, 감: 0.04
로 나왔다고 하겠습니다.
이 때, top-1-accuracy 를 사용하면 모델의 예측은 '틀렸'습니다. 왜냐면, top-1 정확도를 따르면 '배'라고 예측하기 때문에 실제 라벨은 '사과'이기에 '오답' 입니다.
하지만 top-5-accuracy 를 사용하면 '배,딸기,사과,오렌지,레몬' 5개 안에 속하면 정답으로 처리됩니다. 그러므로, 이 때 모델의 예측 확률의 top-5-accuracy 입장에서는 '정답'입니다. 왜냐면 실제 라벨의 값이 상위 5개 예측값 안에 들어가기 때문입니다.
이제 파이썬 코드로 이해해보겠습니다.
1. 예측된 값들의 스코어를 하나의 컨테이너에 담고, 정답이라고 생각하는 인덱스를 하나 던졌습니다.
# make random prediction
prediction = [350, 50, 100, 25, 60, 40, 300 ,200 , 5, 1, 3]
label = 9
2. 여기서 prediction 에 속하는 값들을 확률로 바꿉니다. (softmax 꼴로 만듬)
# transform the predictions into probabilities
predictions_sum = 0
for pred in prediction:
predictions_sum += pred
for idx, pred in enumerate(prediction):
prediction[idx] = pred / predictions_sum
-결과-
3. 상위 5개의 확률을 구한 다음 정렬합니다.
# initilize sorting variables with indices
sorted_predictions = list()
sorted_predictions_indices = list()
# calculate top-5-accuracy
for _ in range(5):
M, M_idx = None, 0
for pred_idx, pred in enumerate(prediction):
if pred_idx in sorted_predictions_indices:
pass
elif M == None or pred > M:
M = pred
M_idx = pred_idx
sorted_predictions.append(M)
sorted_predictions_indices.append(M_idx)
이제, 전체 코드의 출력 결과를 확인해보겠습니다.
상위 5개의 확률값이 있는 인덱스를 정답으로 제출했을 때, 정답으로 처리됨을 볼 수 있습니다.
그렇다면, top-5 accuracy , error 등은 언제 사용할까요?
클래스의 갯수 많을 때 사용합니다. 5000개의 클래스로 훈련된 분류기를 테스트할 때, top-1-accuracy 로 성능을 측정하기에는 굉장히 까다로울 수 있습니다. 이를 top-5-accuracy 로 한다면 조금은 정답의 범위가 넓어지므로 성능 지표에서 조금 더 높게 나옵니다.
어찌 생각하면 top-1-accuracy 만 사용해야 하는 게 아닌가라는 생각이 들수도 있지만...
논문들을 보다보면 top-5 -accuracy, top-1-accuracy 등 상위 n개의 클래스를 정답 군으로 해서 성능을 테스트하는 것을 보게 됩니다. 우선, 여러 논문에서 성능 지표로 top-N-accuracy 로 사용하고 있으니 이에 대한 개념은 이 정도로 알고가면 좋을 것 같습니다.
- 참고 -
https://medium.com/nanonets/evaluating-models-using-the-top-n-accuracy-metrics-c0355b36f91b
https://enjoyso.tistory.com/122
https://froggydisk.github.io/blog/second-post/
https://www.kaggle.com/questions-and-answers/164379
'머신러닝,딥러닝' 카테고리의 다른 글
checkpoint , tensorflow1과 2에서의 차이점 (NLP pretrained model) ; difference in checkpoint of Tensorflow version (0) | 2020.06.11 |
---|---|
how to use docker image and container in ML,DL? (0) | 2020.06.09 |
numpy reshape(-1,1) (0) | 2020.05.02 |
conda 가상환경 명령어 모음(생성,제거,확인,활성화,패키지 설치) (0) | 2020.04.15 |