- 분류를 수행하는 머신러닝 알고리즘으로 모델링을 하면 분류기의 예측력을 검증/평가 해야한다.
- Accuracy
- Recall
- Precision
- F1 Score
1. Accuracy (정확도)
accuracy는 다음과 같이 정의할 수 있다.
전체 예측 건수에서 정답을 맞힌 건수의 비율이다. (여기서 정답을 맞힐 때 답이 Positive든 Negative든 상관 없다. 맞히기만 하면 된다.)
Accuracy의 단점
예를 들어 내일 서울에 시간당 1m 이상의 눈이 내릴지 여부를 예측한다고 해보자. 그땐 뭐 머신러닝이고 뭐고 할 거 없이 나 혼자서도 매우 정확한 분류기를 만들 수 있다. 그냥 무조건 Negative를 예측하면 이 분류기는 99.9% 정도의 accuracy를 나타낼 거다. 그 정도 눈 내리는 날은 거의 없으니까. 이 분류기는 정답을 True Negative로만 잔뜩 맞히는 셈이다. True Positive는 하나도 발견하지 못하고.
이런 상황을 정확도 역설(Accuracy Paradox)라고 부른다.
그래서 이렇게 실제 데이터에 Negative 비율이 너무 높아서 희박한 가능성으로 발생할 상황에 대해 제대로 된 분류를 해주는지 평가해줄 지표는 바로 recall(재현율)이다.
2. Recall (재현율)
recall은 다음과 같이 정의할 수 있다.
실제로 정답이 True 인 것들 중에서 분류기가 True로 예측한 비율이다. 그래서 애초에 True가 발생하는 확률이 적을 때 사용하면 좋다.
그래서 위에서 예로 들었던 시간당 1m 이상의 눈이 내릴지 예측하는 과제에 적절한 거다. 그러면 실제로 그렇게 눈이 내린 날짜 중 몇 개나 맞히는지 확인할 수 있으니까. 만약 여기서 언제나 False로 예측하는 분류기가 있다면 accuracy는 거의 99%를 넘기겠지만, True Positive를 찾을 수 없으니 recall이 0이 된다.
Recall의 단점
그러나 안타깝게도 recall 또한 완벽한 통계 지표가 아니다. 시간당 적설량 1m 이상이 될지 분류하는 과제에서 언제나 True만 답하는 분류기가 있다고 해보자. 그러면 accuracy는 낮지만 눈이 많이 온 날에 대해서만큼은 정확하게 맞힐 수 있기 때문에 recall은 1이 된다. 이 역시 말이 안 되는 지표다.
그리고 이럴 때 해당 알고리즘에 결함이 있음을 잘 나타내는 지표는 바로 precision이다.
3. Precision (정밀도)
precision은 다음과 같이 정의할 수 있다.
분류기가 눈이 많이 내릴 것이라고 예측한 날 중에 실제로 눈이 많이 내린 날의 비율을 구하는 거다.
그래서 언제나 True만 답하는 분류기가 있다면 recall은 1로 나오겠지만, precision은 0에 가까울 거다. 시간당 1m 이상 눈 내리는 날이 며칠이나 되겠는가.
Precision의 단점
결국 precision을 사용할 때의 단점은 곧 recall을 사용할 때의 장점이 되기도 한다.recall과 precision은 서로 반대 개념의 지표이기 때문이다. 하나가 내려가면 다른 하나는 올라갈 수밖에 없다.
그래서 알고리즘을 평가할 때 recall과 precision 모두 나름대로 유용한 지표이긴 하지만, 그 알고리즘의 성능을 충분히, 효과적으로 표현하기에는 한계가 있다. 그래서 생겨난 게 recall과 precision의 조화평균, F1 Score다.
4. F1 Score
F1 score는 다음과 같이 정의할 수 있다.
조화평균에 대해서는 중고등학교 때 언젠가 배웠을 거다. 나도 가물가물하긴 한데 사실 잊어버렸더라도 상관 없다. 컴퓨터가 알아서 계산해줄 테니 일단 개념만 알고 가면 되지 뭐.
아무튼 흔히 말하는 평균(산술평균)을 쓰지 않고 조화평균을 구하는 이유는 recall, precision 둘 중 하나가 0에 가깝게 낮을 때 지표에 그것이 잘 반영되도록, 다시말해 두 지표를 모두 균형있게 반영하여 모델의 성능이 좋지 않다는 것을 잘 확인하기 위함이다.
예를 들어 recall, precision이 각각 1과 0.01이라는 값을 가지고 있다고 하자.
산술평균을 구하면 (1 + 0.01) / 2 = 0.505, 즉 절반은 맞히는 것처럼 보인다. 그러나 조화평균을 구해보면 2 * (1 * 0.01) / (1 + 0.01) = 0.019가 된다. 낮게 잘 나온다.
이제야 분류기의 성능을 좀 제대로 확인할 수 있을 것 같다.
요약
본 포스팅에서는 분류 모델의 성능을 확인할 수 있는 다양한 지표들에 대해 다뤘다.
지표들을 계산하기에 앞서 정답을 맞히거나 틀리는 경우의 수들을 먼저 이해해야 한다.
- True Positive (truth = 1, guess = 1)
- True Negative (truth = 0, guess = 0)
- False Positive (truth = 0, guess = 1) – Type I error
- False negative (truth = 1, guess = 0) – Type II error
이제 이 경우의 수를 사용해서 모델 성능을 평가하는 네 개의 지표를 산출할 수 있는데, 각각의 특징과 장단점이 있다.
- Accuracy: 모든 분류 건수 중에서 분류기가 몇개의 정답을 맞혔는가 (맞거나 틀리다고 정확히 분류했는가)
- Recall: 맞다고 분류해야 하는 건수 중에서 분류기가 몇개나 제대로 분류했는가
- Precision: 분류기가 맞다고 분류한 건수 중에서 실제로 맞는 건수가 몇개나 되는가
*** Recall과 Precision은 상충하는 개념이기 때문에 하나가 높아지면 다른 하나는 낮아진다.
- F1 score: Recall과 Precision의 균형값 (조화평균)
어쨌든 분류기의 성능이 좋다는 뜻은 오류가 적다는 뜻이다. 오류가 발생하는 두 가지 경우를 잘 생각해보고, 그 과제의 경중에 따라 효과적인 지표를 사용해서 모델을 검증해야 한다.
scikit-learn에서 확인하는 방법
그리고 파이썬 라이브러리 scikit-learn에서는 이런 통계 지표들을 쉽게 확인할 수 있다. 이렇게.
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score
labels = [1, 0, 0, 1, 1, 1, 0, 1, 1, 1]
guesses = [0, 1, 1, 1, 1, 0, 1, 0, 1, 0]
print(accuracy_score(labels, guesses))
print(recall_score(labels, guesses))
print(precision_score(labels, guesses))
print(f1_score(labels, guesses))
Confusion matrix 구하기
from sklearn.metrics import confusion_matrix
print(confusion_matrix(labels, guesses))
'Machine Learning' 카테고리의 다른 글
Interpretable Machine learning (0) | 2020.12.14 |
---|---|
AUC-ROC 심화 이해 (0) | 2020.08.30 |
Shap value - 중요 변수 추출 방법 (0) | 2020.06.30 |
Hierachical , DBscan Clustering (0) | 2020.06.28 |
K-means , medoids Clustering (unsupervised learning) (0) | 2020.06.28 |