https://blog.naver.com/sogangori/220986343741
정확도 : 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
'Machine Learning > Probability and Statistics' 카테고리의 다른 글
[펌] Softmax 함수 (0) | 2019.01.08 |
---|