모델을 평가하는 방법인 특이도, 민감도, 재현율, 정확도, 정밀도를 정리했습니다.
2021. 12. 9 최초작성
2022. 2. 3
우선 아래 표에 있는 TP, FP, TN, FN - 4가지에 해당되는 개수를 각각 구해야 합니다.
4가지 경우는 다음 두가지를 기준으로 합니다.
- Positive는 양성으로 판정을 의미, Negative는 음성으로 판정을 의미.
- True는 판정이 옳았음을 의미, False는 판정이 틀렸음을 의미.
민감도(sensitivity)는 전체 양성에서 검출된 양성 개수이며 재현율이라고도 합니다.
민감도 = TP / (TP + FN)
TP + FN : 전체 양성 개수
TP : 양성으로 판정했는데 실제로 양성인 경우
특이도(specificity)는 전체 음성 개수에서 검출된 음성 개수입니다.
특이도 = TN/(TN+FP)
TN + FP : 전체 음성 개수
TN : 음성으로 판정했는데 실제로 음성인 경우
민감도와 특이도는 한 쪽이 증가하면 다른 한 쪽이 감소하는 경향을 보일 수 있습니다. 예를 들어 검사 항목을 모두 양성으로 판정하면 민감도는 1이 되지만 특이도는 0이 되며 반대로 모두 음성으로 판정하면 특이도는 1이 되지만 민감도는 0이 됩니다.
궁극적으로는 민감도와 특이도가 둘 다 높게 나오는 방법을 찾아야 합니다.
TN, FP, FN, TP 계산을 하기 위해 sklearn에서 제공하는 confusion_matrix 함수를 사용할 수 있습니다.
예측된 값 y_pred와 정답값 y_pred를 입력으로 사용하면 됩니다.
두 배열의 같은 인덱스에 있는 원소를 비교하여 결과를 계산하게 됩니다.
from sklearn.metrics import confusion_matrix # 1은 양성, 0은 음성을 의미합니다. y_true = [0, 0, 0, 1, 1, 1, 1, 1, 1, 1] y_pred = [0, 1, 1, 0, 0, 0, 1, 1, 1, 1] tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel() print('tn, fp, fn, tp = ', tn, fp, fn, tp) sensitivity = tp/(tp + fn) # 민감도 또는 재현율 specificity = tn/(tn + fp) # 특이도 print('sensitivity, specificity = ', sensitivity, specificity) |
실행결과 다음과 같은 결과를 얻을 수 있습니다.
하나만 살펴보면 TN은 음성(0)으로 판정했는데 실제로 음성(0)인 경우로 y_pred에서 0이었는데 y_true에서도 0인 값을 찾으면 됩니다. 배열의 첫번째 인덱스 하나만 존재하므로 confusion_matrix 함수 결과와 일치합니다.
tn, fp, fn, tp = 1 2 3 4
sensitivity, specificity = 0.5714285714285714 0.3333333333333333
시험삼아 다음처럼 첫번째 원소만 다르고 나머지는 동일하게 바꾼후, 민감도와 특이도 값을 출력해봅니다.
y_true = [0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
y_pred = [1, 0, 0, 1, 1, 1, 1, 1, 1, 1]
실행결과입니다. 전체 양성(1) 중에 양성을 모두 찾았으므로 민감도는 1.0입니다. 전체 음성(0) 3개중에 2개를 찾았으므로 특이도는 0.66이 됩니다.
tn, fp, fn, tp = 2 1 0 7
sensitivity, specificity = 1.0 0.6666666666666666
그외 정확도(accuracy)와 정밀도(precision)가 있습니다.
정확도 - 전체 중에 양성과 음성을 맞춘 개수
정확도 = (TP+TN) / (TP+FN+FP+TN)
정밀도 - 양성이라고 판정한 것 중에 실제 양성 개수
정밀도 = (TP / TP + FP)
참고
https://m.blog.naver.com/win0k/221599042773
https://www.waytoliah.com/1222
https://adnoctum.tistory.com/981