Machine Learning/Probability and Statistics

[펌] 정확도, 정밀도, 재현율

바나나인간 2019. 9. 20. 00:12

https://blog.naver.com/sogangori/220986343741

 

파이썬 - 정확도, 정밀도, 재현율, F1 스코어

정확도 : Accuracy정밀도 : Precision재현율 : RecallF1 Score : 정밀도와 재현율의 조화 평균 한마디...

blog.naver.com

 

 

정확도 : Accuracy

정밀도 : Precision

재현율 : Recall

F1 Score : 정밀도와 재현율의 조화 평균

 

 

 

한마디로 표현해보면

 

정확도 : 예측이 정답과 얼마나 정확한가?

정밀도 : 예측한 것중에 정답의 비율은?

재현율 : 찾아야 할 것중에 실제로 찾은 비율은?

F1 Score : 정밀도와 재현율의 평균

 

 

이중에서 F1 Score 값이 높으면 성능이 높다고 할 수 있다.

 

정확도, 정밀도, 재현율은 하나만 높다고 성능이 좋은 것은 아니다.

 

 

너목보(너의 목소리가 보여) 를 예로 들어보자

 

 

 

6명 중에는 음치도 있고 노래를 잘하는 실력자(정상)도 있다.

 

 번호 [  1,   2,   3,    4,    5,    6  ]

정답 : [음치,음치,음치,음치,정상,정상] 가 있다.

 

누가 음치인지 겉모습만 보고 맞춰야 한다.

 

감으로 예측을 한다.

       

예측 : [음치,음치,정상,정상,정상,정상]

 

정확도 : 나의 예측이 정답과 얼마나 정확한가? 

         1,2,5,6 번 맞추고 3,4번은 틀렸다. 6명중 4명 맞췄으므로 4/6 = 2/3 = 0.66 

정밀도 : 음치라고 예측한 사람들 중에 진짜 음치가 얼마나 있는가?

          내가 음치라고 예측한 1,2번 이 둘다 음치가 맞았다. 2/2 = 1.00

재현율 : 전체 음치 중에서 내가 맞춘 음치의 비율은?

          원래 음치가 4명 있는데 나는 그중에서 2명을 맞췄다. 2/4 = 0.5

F1 Score : 정밀도와 재현율의 평균 

            2 * 정밀도 * 재현율 /(정밀도+재현율) = 2 * 1.00 * 0.5 / (1.00 + 0.5) = 0.66

 

만약 음치 아니라 실력자를 찾는 것이 목적이었다면

 

정확도 : 나의 예측이 정답과 얼마나 정확한가? 

         1,2,5,6 번 맞추고 3,4번은 틀렸다. 6명중 4명 맞췄으므로 4/6 = 2/3 = 0.66 

정밀도 : 실력자라고 예측한 사람들 중에 진짜 실력자가 얼마나 있는가?

          내가 실력자라고 예측한 3,4,5,6번 중 실력자는 5,6번 뿐이다. 2/4 = 0.5

재현율 : 전체 실력자 중에서 내가 맞춘 실력자의 비율은?

          원래 실력자가 2명 있는데 나는 그중에서 2명을 맞췄다.  2/2 = 1.00

F1 Score : 정밀도와 재현율의 평균 

            2 * 정밀도 * 재현율 /(정밀도+재현율) = 2 * 0.5 * 1.0 / (0.5 + 1.0) = 0.66

 

두 가지 경우 정확도와 F1 Score는 모두 같다.

 

 

파이썬으로 구현해보자

 

import numpy as np

import sklearn.metrics as metrics

 

y = np.array([1,1,1,1,0,0]) #0은 정상(실력자), 1은 음치

p = np.array([1,1,0,0,0,0]) #나의 예측

 

accuracy = np.mean(np.equal(y,p))

right = np.sum(y * p == 1)

precision = right / np.sum(p)

recall = right / np.sum(y)

f1 = 2 * precision*recall/(precision+recall)

 

print('accuracy',accuracy)

print('precision', precision)

print('recall', recall)

print('f1', f1)

 

# sklearn 을 이용하면 전부 계산해준다.

print('accuracy', metrics.accuracy_score(y,p) )

print('precision', metrics.precision_score(y,p) )

print('recall', metrics.recall_score(y,p) )

print('f1', metrics.f1_score(y,p) )

 

print(metrics.classification_report(y,p))

print(metrics.confusion_matrix(y,p))

[출처] 파이썬 - 정확도, 정밀도, 재현율, F1 스코어|작성자 sogangori