지난 시간에 Sklearn 라이브러리를 활용하여 데이터를 전처리하는 방법을 알아보았습니다. Sklearn 라이브러리들이 모델을 생성하고 학습하는 것을 굉장히 편리하게 해주어 누구나 쉽게 모델을 만들 수 있습니다. 그렇다면 우리가 만든 모델이 과연 어느정도의 성능을 보이는지 평가를 해야할 것입니다. 이번 글에서는 모델을 평가하는 지표들인 Confusion Matrix에 대하여 알아보도록 하겠습니다.
Confusion Matrix?
Confusion Matrix는 모델이 2가지 경우에 대하여 예측한 결과를 의미합니다. 즉 양성인지 음성인지를 판단한 결과를 보여줍니다. 코로나 때문에 PCR검사를 받은 경험이 있나요? PCR검사를 받으면 당일 저녁 혹은 다음날 아침에 결과 문자를 받게 됩니다. 이 때 Positive(양성) 혹은 Negative(음성)를 들어보셨을 것입니다. 그 의미와 동일하게 Positive와 Negative를 Confusion Matrix에서 사용합니다. Positive는 긍정의 느낌 Negative는 부정의 느낌이라고 생각된다고 그렇게 사용해서는 안되고, Positive는 내가 관심을 갖고있는 대상이 발생하는 경우 Negative는 관심을 갖고있는 대상이 발생하지 않은 경우가 됩니다. 따라서 암 환자를 분류하는 경우에 암에 걸렸을 경우 Positive, 불량품을 분류할 때 불량품인 경우에 Positive가 됩니다.
아무튼 2가지 클래스로 Classification한 결과는 다음과 같습니다.
Confusion Matrix에는 True Positive, False Positive, False Negative, True Negative 이렇게 4가지 결과값으로 나타나게 됩니다.
앞에 나오는 True, False는 모델이 맞추었는지 못 맞추었는지에 대한 값입니다. 만약 모델이 성공적으로 문제를 맞추었다면 True가 되고, 아니라면 False가 됩니다. 뒤에 나오는 Positive와 Negative는 모델이 예측한 값을 의미합니다.
- True Positive : 모델이 양성을 잘 맞춘 경우(실제 양성)
- True Negative : 모델이 음성을 잘 맞춘 경우(실제 음성)
- False Positive : 모델이 양성으로 잘못 말한 경우(실제 음성)
- False Negative : 모델이 음성으로 잘못 말한 경우(실제 양성)
좌측에 Predicted Value가 모델이 예측한 결과를 의미하고, 위 Actual Value는 실제 결과를 보여주게 됩니다.
모델 평가지표 정확도만 보면 될까?
머신러닝 모델을 만드는 목적은 무엇일까요? 머신러닝 모델은 과거의 데이터를 통해 학습되고 새로운 데이터가 들어왔을 때 그 값에 대한 예측을 합니다. 즉 과거의 데이터를 기반으로 미래의 상황을 예측합니다. 모델을 평가하는 가장 직관적인 방법은 정확도라고 생각합니다. 정확도는 생성한 모델이 다른 상황에 대하여 얼마나 잘 맞추는지에 대한 지표입니다. 지표 자체가 단순하고 명확하기 때문에 처음 머신러닝을 공부하고 모델을 만들었을 때 처음 성능을 평가하기 위해 사용합니다. 정확도를 Confusion Matrix값으로 표현하면 다음과 같습니다.
$$정확도(Accuracy) = \frac{TP + TN}{TP + TN + FP + FN}$$
그런데 과연 정확도가 좋다고 성공적인 모델일까요? 정답은 아닙니다. 모델은 데이터를 기반으로 만들어집니다. 즉 데이터의 품질에 따라서 모델의 성능이 천차만별입니다. 그리고 학습한 데이터를 잘 맞추기 위한 방향으로 모델이 학습되므로 데이터의 특징을 따라가게 됩니다. 데이터를 수집하는 과정에서 굉장히 적절한 데이터를 모았다면 정확도만으로 충분히 모델을 평가할 수 있습니다. 하지만 데이터를 수집하는 과정에서 모델링을 고려하는 것은 굉장히 어려운 일입니다.
정확도만으로 모델을 훌륭하다고 판단하는 것이 어렵다는 이유를 설명하기 위해 예를 들어보겠습니다. 환자가 암에 걸렸는지 안걸렸는지를 판단하는 모델을 만들기 위해 사람들의 건강검진관련 데이터를 수집하였다고 가정하겠습니다. 암에 걸린 사람은 100명 중 1명이 발견되었고 약 10000개의 데이터를 수집하였다고 하겠습니다. 그렇다면 수치상으로 10000개의 데이터 중 단 100개만 암이고 나머지 9900개는 암이 아닌 데이터가 됩니다. 이 때 생성된 모델을 정확도만 고려하여 모델을 만든다면 어떻게 될까요? 그냥 모두 암이 아니라고 모델이 판단해버린다면? 정확도 99%에 엄청난 모델이 형성됩니다. 이 모델의 높은 정확도에 안도하며 암 검증에 활용한다면 굉장히 안타까운 일이 발생합니다.
이러한 문제 때문에 Precision과 Recall이라는 지표를 사용하게 됩니다. Precision은 정밀도 Recall은 재현율이라고 부릅니다.
Precision은 모델이 암이라고 판단한 것 중 얼마나 많이 맞았는지에 대한 지표이고, Recall은 실제 암인 경우를 얼마나 잘 맞추었는지에 대한 지표입니다.
Precision과 Recall
Precision과 Recall을 좀 더 자세하게 알아보겠습니다.
Precision은 정밀도라고 하였습니다. 모델이 양성이라고 판단했을 때 양성일 정확도를 의미합니다. 이를 Confusion Matrix로 표현하면 다음과 같습니다.
$$정밀도(Precision) = \frac{TP}{TP + FP}$$
Recall은 재현율이라고 부릅니다. 모델이 양성을 얼마나 잘 맞추는지를 의미합니다. 비슷하다고 햇갈릴 수 있는데 쉽게 이해하면 실제 양성인 값을 얼마나 잘 맞추는지를 의미합니다. 마찬가지로 Confusion Matrix 값으로 표현하겠습니다.
$$재현율(Recall) = \frac{TP}{TP + FN}$$
정밀도와 재현율은 일종의 말장난과 같습니다. 정밀도는 모델이 양성이라고 말했을 때 그게 양성일지에 대한 신뢰도이고, 재현율은 실제 값이 양성인 값을 얼마나 많이 골라냈는지를 의미합니다. 따라서 그냥 모두 양성이라고 해버리면 재현율은 1로 최고 값이 됩니다. 하지만 정밀도는 굉장히 낮아지게 됩니다. 반면 정말 양성이라고 분류되어지는 경우만 양성으로 분류시켜버리면 정밀도는 1로 최고가 됩니다. 하지만 재현율은 굉장히 낮아지게 됩니다.
재현율과 정밀도의 관계에 임계값을 추가하여 설명드리겠습니다. 어떤 모델이 양성인지 음성인지를 판단하는 기준을 임계값(threshold)이라고 합니다. 특정 모델이 예측한 수치가 임계값 이하이면 음성 이상이면 양성으로 구분이되는 것이죠. 이 떄 임계값을 굉장히 낮춘다면 대부분의 경우가 양성으로 분류되기 떄문에 recall 값은 올라가지만 precision은 떨어지게 됩니다. 반대로 굉장히 높힌다면 진짜 양성인 경우만 양성으로 분류되기 때문에 precision값은 올라가지만 recall값은 떨어지게 됩니다. 둘 사이의 관계는 임계값에 따라서 trade-off의 관계를 보여주게 됩니다. 따라서 각각의 수치를 따로 판단하여 모델을 평가한다면 좋은 결과를 기대하기 어렵습니다. 두개의 수치를 모두 사용하여 모델을 평가해야 좋은 성능을 낼 수 있게됩니다.
$F1$ Score
Recall과 Precision을 함께 사용한 지표가 F Score입니다.
$$F=\frac{(\beta{^2} + 1)*Precision*Recall}{\beta^2*Precision + Recall}$$
여기서 $\beta$가 1이 되는 경우에 Precision과 Recall값이 조화평균이 됩니다. 이를 $F1$ Score라고 부릅니다.
$$F1=\frac{2*Precision*Recall}{Precision + Recall}$$
조화평균을 사용하는 이유는 Recall과 Precision이 조화롭게 적절한 값을 찾기 위함입니다. 만약 일반적인 평균을 사용하는 경우는 어떻게 될까요? Recall값이 1이고 Precision 값이 0.01이라고 가정하겠습니다. 이러한 모델은 굉장히 잘못된 모델임을 인지할 수 있습니다.
만약 이 결과를 일반적인 방법의 평균을 사용하여 평가한다면 약 0.5의 값이 나오게 됩니다. 잘못된 결과임에도 매우 높은 결과가 나오게 됩니다. 하지만 조화평균을 사용한 경우에는 약 0.02의 값이 나오게 됩니다.
따라서 $F1$ Score를 조화평균으로 사용함으로써 Recall과 Precision이 적절한 값으로 맞추어지는 Threshold값을 찾을 수 있게됩니다.
Reference
- https://en.wikipedia.org/wiki/Confusion_matrix
- https://leedakyeong.tistory.com/entry/%EB%B6%84%EB%A5%98-%EB%AA%A8%EB%8D%B8-%EC%84%B1%EB%8A%A5-%ED%8F%89%EA%B0%80-%EC%A7%80%ED%91%9C-Confusion-Matrix%EB%9E%80-%EC%A0%95%ED%99%95%EB%8F%84Accuracy-%EC%A0%95%EB%B0%80%EB%8F%84Precision-%EC%9E%AC%ED%98%84%EB%8F%84Recall-F1-Score
- https://sumniya.tistory.com/26
'Artificial intelligence > Etc' 카테고리의 다른 글
Hello RL : Frozen Lake 소개 및 기본 코드 (1) | 2022.09.15 |
---|---|
Object Detection의 개요 (0) | 2022.07.30 |
Sklearn 라이브러리를 활용하여 데이터 전처리하기 (0) | 2022.07.08 |
파이썬으로 머신러닝 시작하기 (0) | 2022.07.03 |
머신러닝이란? (0) | 2021.07.16 |