기록하는삶
[인공지능 수학] 조건부 확률 용어 정리, Precision, Recall, F1-score 본문
사건 A가 일어난 상황(조건)에서 사건 B가 일어날 확률을 조건부확률이라 칭하며, 기호로 P(B|A)이라 표현한다. 사건 B가 일어날 확률인 P(B)를 모르는 상황에서, 사건 A가 일어날 확률인 P(A)와 사건 A가 일어난 상황에서, 그리고 일어나지 않은 상황에서 사건 B가 일어날 확률을 알고 있다면, 이를 통해 B가 일어날 확률을 계산할 수 있는데, 그것이 바로 베이즈 정리에 해당한다. 이는 '사전 확률을 이용해 사후 확률을 구할 수 있다' 등의 복잡한 용어를 사용해 표현하지만, 사실 사건 B가 일어나는 경우는 A가 일어났을 때 B가 일어나거나 A가 일어나지 않았을 때 B가 일어나는 두 가지 경우 밖에 없다는 간단한 원리에 기초한다. (아래의 그림에서 A1이 A가 발생한 경우, A2가 A가 발생하지 않은 경우라 생각하면 된다.)
이러한 조건부 확률과 베이즈 정리에 활용되는 용어를 이해하기 위한 예시로 빈번하게 등장하는 예시가 질병의 진단인데, 아래 이미지에서 'theta = 환자가 암인 경우, D = 암이라고 진단하는 경우'라 생각하면, 의사가 암을 진단하는 상황에서 총 4가지의 상황이 발생한다.
① True Positive: 암 환자를 실제 암이라 진단
② False Positive: 암 환자가 아닌 사람을 암이라 진단(위양성, 1종 오류라 칭함)
③ False Negative: 암 환자를 암이 아니라 진단(위음성, 2종 오류라 칭함)
④ True Negative: 암 환자가 아닌 사람을 암이 아니라 진단
상황에 따라 다르겠지만, 이 경우에는 암 환자를 아니라고 진단하는 2종 오류가 환자를 방치하는 더 큰 문제가 될 수 있겠다. 이와 같은 상황에서 진단을 하는 의사가 얼마나 정밀한 판단을 하는가를 수치화하기 위해 사용하는 것이 정밀도(Precision), 재현율(Recall), F1-socre 등이다.
1) 정밀도(Precision)
코로나 진단 키트를 예시로 생각하면, 양성이라 판정한 사람 중 실제 양성인 사람의 비율을 의미한다고 생각하면 된다. 산식은 True Positive / (True Positive + False Positive). 아래 예시처럼 위양성의 영향을 받기 때문에, 위양성의 확률을 줄일 수 있다면 Precision이 높아질 수 있다.
2) 재현율/민감도(Recall)
실제 양성인 사람 중 양성이라 판단한 사람의 비율을 의미한다. 산식은 True Positive / (True Positive + False Negative)
위 두 수치는 모두 0과 1사이의 값을 가지며, 1에 가까울수록 1종 오류와 2종 오류가 줄어든다는 것을 의미한다. 즉, 오류가 적고 목적에 맞게 분류하고 있다는 것을 뜻하기 때문에 성능이 더 우수하다고 평가할 수 있겠다. 이 두 지표를 활용해 만든 것이 f1-score로, 위 두 지표의 조화 평균으로 구할 수 있다.
3) F1-socre = 2 / (1 / Precision + 1 / Recall)
2는 0과 1사이의 값을 가지게 하기 위해 곱해준 것이고, Precision과 Recall이 1에 가까울수록 F1-socre 역시 1에 가까워지므로, 높을수록 좋은 성능을 보인다고 말할 수 있겠다.
머신러닝을 통해 분류 문제를 풀고자 할 때, 모델의 성능을 판단하는 지표로 F1-score를 활용할 수 있으며, sklearn이 이를 제공한다. 사용 예시는 아래와 같다.
from sklearn.metrics import f1_score
with torch.no_grad():
print("Calculating validation results...")
model.eval()
f1 = 0.0
for val_batch in val_loader:
inputs, labels = val_batch
inputs = inputs.to(device)
labels = labels.to(device)
outs = model(inputs)
preds = torch.argmax(outs, dim=-1)
loss_item = criterion(outs, labels).item()
acc_item = (labels == preds).sum().item()
f1 += f1_score(preds.cpu().numpy(),
labels.cpu().numpy(), average='macro')
f1 = f1/len(val_loader)
'AI > 인공지능 수학' 카테고리의 다른 글
[인공지능 수학/AI Math] 엔트로피와 크로스엔트로피, KL Divergence, JS Divergence (0) | 2022.03.11 |
---|