기록하는삶

[인공지능 수학] 조건부 확률 용어 정리, Precision, Recall, F1-score 본문

AI/인공지능 수학

[인공지능 수학] 조건부 확률 용어 정리, Precision, Recall, F1-score

mingchin 2022. 3. 1. 15:44
728x90
반응형

사건 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)

 

 

728x90
반응형