Machine Learning/Evaluation matric

정밀도와 재현율

진성01 2022. 5. 15. 23:21

이전 장에서 정확도와 오차행렬에 대해 다루었다. 정확도는 가장 직관적인 성능 지표이지만 불균등한 label을 가진 데이터셋에서 성능을 왜곡할 수 있다. 정확도는 '정확히 예측한 건 수'에 초점을 맞춘다면, 정밀도와 재현율은 Positive 데이터셋(양성)에 초점을 맞춘 평가 지표이다.

 

정밀도, 재현율의 정의

 

정밀도 = TP / (FP + TP)
재현율 = TP / (FN + TP)

정밀도는 Positive로 예측한 대상 중 실제로 Positive로 일치한 데이터의 비율이고,

재현율은 실제 값이 Positive인 데이터 중 예측 값이 Positive로 일치한 데이터의 비율이다.

 

정밀도, 재현율의 상호 보완 관계

 

정밀도와 재현율은 상호 보완적인 지표이기 때문에 한 쪽이 높아지면 한 쪽은 낮아지기 쉽다.이를 오차행렬 표를 보며 이해해보자.

정밀도/재현율을 시각화한 오차 행렬

정밀도는 Orange/Green이다. 이를 늘리기 위해서는 어떻게 해야할까? 모델은 실제 클래스는 변화시킬 수 없고, 예측 클래스만 변화시킬 수 있다. 따라서 정말로 확실한 Positive만 Positive로 예측하고 나머지는 다 Negative로 예측하는 것이다. 다음과 같이 수행하면 표 상에서 왼쪽으로 데이터가 몰릴 것이고, TP에만 값이 몇 개 존재할 것이다. 극단적으로 가장 정확한 단 하나의 Positive만 Positive로 예측하고 나머지를 Negative로 하였다면, 정밀도는 1/1 즉, 100%가 된다.

 

그런데 다음과 같이 정밀도를 100%로 만들고 재현율을 확인해 보자. 재현율은 Orange/Blue이다. 가장 확실한 하나의 Positive만 Positive로 분류하였기 때문에 이를 제외한 나머지 모든 데이터는 Negative로 분류하였을 것이다. 따라서 TN과 FN이 크게 늘어나게 된다(Negative로 많이 판단할수록 왼쪽에 데이터가 많아지게 되고, 반대로 Positivie로 많이 판단할수록 오른쪽에 데이터가 많아진다). 따라서 재현율은, 데이터셋이 커지면 커질수록 0%에 수렴한다. 

 

그럼 다시 재현율을 높여보자. 어떻게 하면 재현율이 100%가 될 수 있을까? 간단하다. 모든 데이터를 Positive로 판단하면 된다. 다음과 같이 수행하면, 모든 데이터가 오른쪽으로 모일 것이고, FN은 0이 되게 된다. 따라서 재현율은 100%가 되게 된다.

 

재현율이 100%인 상태에서 정밀도를 확인해보자. 모든 값이 오른쪽에 분포해 있으므로 전체 데이터셋에서 TP를 제외하면 모두 FP일 것이다. 보통의 데이터셋의 경우 Positive와 Negative가 비슷하게 분포하거나, Negative가 더 많은 양상을 띄기 때문에 정밀도는 50%에 미치지 못할 가능성이 크다.

 

정밀도, 재현율 중 특정 지표가 더 중요한 경우

 

이렇게 정밀도와 재현율은 한 쪽이 높아지면 한 쪽은 낮아지기 쉽다. 경향 상 Positive로 많이 예측할수록 재현율이 높아지고, Negative로 많이 예측할수록 정밀도가 높아진다. 두 지표를 모두 최상으로 만들 수는 없기 때문에 적정선을 찾아 두 지표 모두 준수하게 나타나다록 하거나, 설계하려는 모델에 따라 특정 지표가 더 중요한 지표로 간주할 수 있다.

 

재현율이 더 중요한 경우: 실제 Positive를 Negative로 잘못 판단하면 업무 상 큰 영향이 발생하는 경우

  • 코로나 검사 키트의 경우 양성(Positive)인 환자를 음성(Negative)으로 판단할 경우 환자가 격리하지 않아 다른 사람에게 전염시킬 수 있다. 따라서 음성을 양성으로 잘못 판단하는 한이 있더라도, 양성은 꼭 양성으로 판단해야 한다.
  • 금융 사기 적발 모델의 경우, Positive인 사기 건을 Negative로 잘못 판단할 경우 회사에 미치는 손해가 크다. 따라서 Positive는 꼭 Positive로 판단해야 한다.

정밀도가 더 중요한 경우: 실제 Negative를 Positive로 잘못 판단하면 업무상 큰 영향이 발생하는 경우

  • 스팸 메일 판단 모델의 경우 스펨 메일인 Positive를 Negative로 잘못 판단하는 것은 큰 문제가 되지 않지만, 스펨이 아닌 메일 즉, Negative를 Positive로 잘못 판단할 경우 메일을 스팸처리해 중요한 메일을 받지 못하게 될 수 있다. 따라서 Negatie는 꼭 Negative로 판단해야 한다.

 

predict_proba(), Binarizer, precision_score(), recall_score()을 이용한 실습

 

사이킷런에서는 개별 데이터별로 예측 확률을 반환하는 predict_proba()메서드를 제공한다.

 

다음과 같이 Negative일 확률과 Positive일 확률을 데이터별로 반환한다. 모델은 둘 중 더 큰 확률값을 가지는 것을 채택한다. 즉, 두번째 인자(Positive 확률)가 0.5이상일 경우 Positive로, 0.5이하일 경우 Negative로 예측한다.

만약 0.5로 설정되어있는 이 임계값을 변경해주면 어떻게 될까? 0.6으로 늘린다고 가정하면, Positive보다 Negative로 예측할 확률이 올라가 정밀도가 높아지고, 0.4로 줄인다고 가정하면, Negative보다 Positive로 예측할 확률이 올라가 재현율이 높아진다.

 

Binarizer()은 threshold값을 입력하고, fit, transform을 진행하면 0과 1로 분류해주는 메서드이다. 이를 이용하면 분류를 위한 임계값을 조정할 수 있다.

pred_proba[:,1]은 1차원 형태의 데이터로 나타난다. 이를 Binarizer()에 인자로 사용하기 위해서는 반드시 reshape(-1,1)을 통해 2차원, 열방향 데이터로 변경해야 인식할 수 있다.

※score를 계산하기 위한 함수(accuracy_score(), precision_score())에 인자는 1차원 형태의 데이터를 인식하기 때문에 predict()결과를 reshape(-1,1)을 통해 변경해주지 않아도 되는 것이다.

 

사이킷런에서는 정밀도와 재현율을 계산하는 precision_score(), recall_score()메서드를 제공한다. 

첫 번째 인자는 test셋의 label값을 입력하고 두 번째 인자는 모델을 이용해 X_test의 label을 예측한 값을 입력하면 된다.

 

 

소개한 함수들을 이용하여 임계값을 조정해가며 정밀도와 재현율이 어떻게 바뀌는지 알아보자

임계값을 0.4로 설정하였으므로, Negative보다 Positive로 판단할 확률이 높다. 따라서 재현율이 더 높게 나타난 것을 확인할 수 있다.

 

임계값을 0.6으로 설정하였으므로, Positive보다 Negative로 판단할 확률이 높다. 따라서 재현율보다 민감도가 높게 나타난 것을 확인할 수 있다.

 

마지막으로 그래프로 확인해보자(그리는 방법은 생략).

임계값이 올라감에 따라 precision은 높아지고 recall은 낮아진다. 반대로 임계값이 낮아지면 precision은 낮아지고 recall은 높아지는 양상을 보인다. 둘 다 비슷한 지표를 보이는 지점은 0.45 부근인 것을 확인할 수 있다.

 

 

 

#이 글은 권철민 작가님의 [파이썬 머신러닝 완벽가이드]를 통해 공부한 내용을 바탕으로 정리하였습니다.

'Machine Learning > Evaluation matric' 카테고리의 다른 글

피마 인디언 당뇨병 예측  (0) 2022.05.20
F1 score, ROC, AUC  (1) 2022.05.16
정확도(accuracy), 오차 행렬(confusion matrix)  (0) 2022.05.12