1. 들어가며
딥러닝 또는 통계를 공부하다 보면 평가지표 개념을 반드시 접하게 됩니다. 평가지표란 성능을 수치화하여 하나의 값으로 표현하는 방법입니다. 딥러닝 모델의 성능을 객관적으로 평가하기 위해 반드시 필요하죠. 그런데 문제는 이 평가지표가 단순히 하나의 점수가 아니라는 겁니다. 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1-Score, AUROC 등 자료마다 사용하는 평가지표가 다르죠.
이렇게 다양한 평가지표를 사용하는 이유는 각 평가지표마다 점수를 측정하는 관점이 다르기 때문입니다. 무엇을 중요하게 볼 것인지 기준이 다르다는 말이죠. 따라서 측정 방법도 다르고, 한 가지 측정 방식이 높다고 해서 다른 측정 방식에서도 높다고 말할 수 없죠.
이번 글에서는 제조 현장에 딥러닝 모델을 도입하여 제품 검사를 하려 하는 기업의 대표 입장이 되어보겠습니다. 기업 대표 입장이 되어 어떠한 성능을 가진 딥러닝 모델을 도입해야 할지 고민해 보겠습니다. 이 과정에서 자연스럽게 각 평가지표의 특징과 장단점을 파악해 보겠습니다.
2. 정확도 (Accuracy)
2-1. 정확도로 성능 측정하기
자, 우리 한번 제조 기업의 대표가 되었다고 상상해 보겠습니다. 스마트 팩토리를 만들기 위해 불량 검출 자동화 로봇을 구입하려고 합니다. 최종적으로 두 기업의 로봇이 구매 후보군에 올랐다고 가정해 볼게요.
위 표는 우리 제품 5개에 대한 불량 검사 결과입니다. 시험에 사용한 제품 4개는 정상이었고, 1개는 불량 제품이었습니다. 어느 회사 로봇이 더 불량을 잘 찾는지 실험을 해 본 거죠. 두 로봇 모두 5개의 문제 중 3개를 맞췄습니다. 그래서 두 로봇의 성능이 60%라고 보고서가 올라왔죠. 일단 성능이 60%라는 내용은 이해가 됩니다. 보통 점수는 맞은 개수를 전체 문제 개수로 나눠서 구하니까요.
그런데 뭔가 찝찝합니다. 점수는 같다고 하는데 뭔가 불공평한 평가라는 느낌을 지울 수가 없네요. 로봇 A는 꼭 찾아야 할 불량 1개를 못 찾았습니다. 반면 로봇 B는 불량은 잘 찾아냈지만 정상 제품에 대해서 불량이라고 판별했군요. 우리 입장에서는 ‘불량을 잘 못 찾은 것’과 ‘정상을 잘 못 찾은 것’은 의미가 다릅니다. 정상 제품에 대해 불량이라고 판별한다면 사람이 재검사를 해서 출하하면 됩니다. 하지만 불량 제품에 대해 정상이라고 판별한다면 이건 얘기가 전혀 다르죠. 이렇게 되면 불량 제품이 그대로 고객에게 전달되게 되니까요. 따라서 우리는 ‘정상을 판별하는 능력’은 좀 떨어지더라도, ‘불량을 판별하는 능력’은 좋은 로봇을 찾아야 합니다.
2-2. 정확도의 한계
이처럼 맞춘 문제의 개수를 전체 문제의 개수로 나눠 측정하는 성능 지표를 정확도라고 합니다.이는 우리가 일상생활에서 사용하는 점수 개념과 동일합니다.
하지만 위의 사례처럼 정확도를 사용하여 성능을 평가하면 곤란한 경우가 종종 있습니다. 맞춰야 하는 두 가지 경우의 중요도가 다른 경우입니다. 위의 사례처럼 불량과 정상의 중요도가 다른 경우가 해당되겠죠. 위에서는 스마트 팩토리에서의 불량 검출을 예로 들었는데요. 교과서에서 가장 많은 예시로 사용하는 사례는 ‘암 진단율’입니다. 정상인에게 암에 걸렸다고 오판하는 것도 문제가 있긴 하겠죠. 하지만 이런 경우 정밀 검사를 통해 정정해 주면 됩니다. 반면 암환자를 정상이라고 판단하면 어떻게 될까요? 환자와 병원의 신뢰도 모두에게 치명적이겠죠?
이렇게 판별해야 하는 각 경우의 중요도가 다른 경우는 정확도가 아닌 다른 평가 지표가 필요합니다.
3. 정밀도(Precision) & 재현율(Recall)
3-1. 정밀도와 재현율로 성능 측정하기
3-1-1. 스마트 팩토리 사례로 이해하기
다시 위의 스마트 팩토리를 구현하려고 하는 대표 입장으로 돌아가 보겠습니다. 우리에게 중요한 건 정상을 검출하는 능력보다는 불량을 검출하는 능력이죠. 이 부분에 초점을 맞춰 생각해 보니 이런 아이디어가 떠올랐습니다. ‘불량에만 초점을 맞춘 평가 지표’를 만들면 어떨까요? 이때 불량이란 두 가지 경우를 말합니다. 실제 불량인 경우와 로봇이 불량이라고 예측한 경우입니다.
두 가지 경우로 나눠서 각각 생각해 보죠. 먼저 실제 불량인 경우를 생각해 보겠습니다. 실제 불량인 제품의 입장에서 측정한 성능은 다음과 같을 겁니다.
실제로 불량인 제품은 1개였죠. 로봇 A는 이걸 못 맞췄고요, 로봇 B는 이걸 맞췄습니다. 이렇게 생각해 보면 로봇 A의 성능은 0%고, 로봇 B의 성능은 100%가 되겠네요.
반면 로봇이 불량으로 예측한 사례에만 초점을 맞춰 생각해 보죠. 로봇이 불량으로 예측한 제품의 입장에서 측정한 성능은 다음과 같습니다.
로봇 A는 1개의 제품을 불량이라고 예측했고 그 제품은 불량이 아니었죠. 따라서 성능은 0%입니다. 반면 로봇 B는 3개의 제품을 불량이라고 예측했고, 그중 1개만 진짜 불량이었습니다. 따라서 성능은 33.3%가 되겠네요.
위와 같이 ‘실제 불량’에 초점을 맞춰 성능을 측정하는 방식을 재현율(Recall)이라고 합니다.
반면 ‘예측한 불량’에 초점을 맞춰 성능을 측정하는 방식은 정밀도(Precision)이라고 하죠.
Recall을 재현율이라고 번역했는데요. 영어 사전을 검색해 보면 recall은 ‘기억해 내다’, ‘찾아내다’는 뜻이 있습니다. 즉 recall은 ‘실제 불량을 얼마나 잘 찾는지’를 나타내는 지표라고 생각할 수 있습니다.
Precision은 정밀도라고 번역했는데요. ‘예측한 불량 중 얼마나 정밀하게 찾아냈는지’를 나타내는 지표라고 생각할 수 있습니다.
3-1-2. 교과서대로 이해하기
이제 교과서에 나오는 표현 방법대로 이해해 보겠습니다. 일단 ‘예측한 불량’, ‘실제 불량’ 이렇게 글로 표현하면 너무 길죠. 단순하게 표현하기 위해 경우의 수를 정리해 볼게요. 제품의 불량, 정상 여부와 로봇이 예측한 결과인 불량, 정상에 따라 결과를 분류해 볼게요. 그럼 아래와 같이 4가지의 경우로 나뉩니다.
불량을 불량으로, 정상을 정상으로 예측한 경우는 잘 맞춘 경우입니다. 반대로 불량을 정상으로, 정상을 불량으로 예측한 경우는 틀린 경우죠. 위 표에서는 O와 X로 정답, 오답 경우를 표시했습니다. 이를 통계학 등에서는 다음과 같은 표로 정리합니다.
같은 그림인데요, 단어가 좀 어렵고 헷갈리게 쓰여있죠. ‘양성’이냐 ‘음성’이냐는, ‘불량’이냐 ‘정상’이냐 라는 의미입니다.
코로나 검사를 할 때를 생각해 보죠. 코로나에 걸렸을 때 ‘양성’이라고 하고 안 걸렸을 때 ‘음성’이라고 하는 것과 동일한 개념입니다. 이게 positive, negative라고 표현되어 있어서 좋다, 나쁘다의 의미가 아닙니다. 따라서 먼저 본 표와 동일하게 4가지 경우가 양성, 음성에 따라 표현될 겁니다.
1. 불량(양성, positive)을 불량(양성, positive)이라고 예측해 맞춘 경우를 True Positive라고 표현합니다.
Positive라고 예측해서 맞았다(True)라는 의미입니다.
2. 불량(양성, positive)을 정상(음성, negative)이라고 예측해 틀린 경우를 False Negative라고 표현합니다.
Negative라고 예측해서 틀렸다(False)라는 의미입니다.
3. 정상(음성, negative)을 불량(양성, positive)이라고 예측해 틀린 경우를 False Positive라고 표현합니다.
Positive라고 예측해서 틀렸다(False)라는 의미입니다.
4. 정상(음성, negative)을 정상(양성, positive)이라고 예측해 맞춘 경우를 True Negative라고 표현합니다.
Positive라고 예측해서 맞았다(True)라는 의미입니다.
이를 바탕으로 재현율과 정밀도를 표현하면 다음과 같습니다.
재현율은 실제 불량(양성)에 초점을 맞추고 있고, 정밀도는 예측한 불량(양성)에 초점을 맞추고 있는 모습을 볼 수 있습니다.
3-2. 정밀도와 재현율의 한계
자, 이제 불량에 초점을 맞춘 평가지표가 생겼네요. 이에 맞춰 새롭게 보고서가 올라왔습니다. 그런데 보고서를 보다 보니 또 맘에 안 드는 부분이 있습니다. 성능을 재현율과 정밀도라는 2개의 지표로 표현하다 보니 확 와닿지가 않는다는 겁니다. ‘이 설비의 재현율은 80%이고, 정밀도는 60%입니다.’라고 하니 좋다는 건지 나쁘다는 건지 헷갈리네요. 정확도로 표현할 때는 100%에 가까울수록 좋고, 낮을수록 나쁘다는 단순함이 있었는데 말이죠.
4. F1-Score
4-1. F1-Score로 성능 측정하기
재현율과 정밀도를 반영하되, 0~1 또는 0~100%까지의 숫자 하나로 성능을 표현해 줄 수는 없을까요? 제일 먼저 드는 생각은 단순하게 재현율과 정밀도를 더해주는 방법입니다.
그런데 문제가 좀 있네요. 둘을 더하려고 봤더니 분모가 다릅니다. 이래서는 둘을 더할 수가 없죠. 그런데, 분자가 같네요? 분모는 다르지만 분자가 같을 때 사용하기 딱 좋은 평균 측정 방법이 있죠. 조화 평균입니다.
이 부분에 대한 설명은 조화평균에 대한 설명글을 참고해 주세요.
따라서 재현율과 정밀도를 사용하여 조화 평균을 구해보면 다음과 같습니다.
그럼 최종적으로 성능을 다음과 같이 표현할 수 있겠네요.
이렇게 재현율과 정밀도의 조화 평균으로 표현하는 지표를 F1-Score라고 합니다. 식을 보면 틀린 문제없이 다 맞혔다면 (F=0인 경우) F1-Score가 1이 되는 걸 알 수 있습니다. 반면 많이 틀릴수록 (F가 커질수록) F1-Score는 작은 값을 갖겠죠.
4-2. F1-Score의 한계
이제 불량에 초점을 맞춘 재현율과 정밀도를 조합하여 하나의 숫자로 성능을 표현할 수 있게 되었습니다. 담당 직원이 로봇 별 성능을 F1-Score로 수정하여 다시 보고서를 제출했습니다. 그런데 이번에도 또 눈이 멈춰서는 부분이 있네요. 로봇 제조사에서 로봇의 threshold에 따른 F1-Score를 제출했습니다. 로봇의 threshold에 따라 F1-Score가 달라진다니, 이게 무슨 말일까요? 우선 로봇의 threshold가 무슨 의미인지를 알아야겠죠. 로봇은 어떻게 불량과 정상을 판별할까요?
로봇은 우선 위의 그림처럼 제품별로 불량 점수를 측정합니다. 이 불량 점수가 높을수록 더 불량이라고 판단했다는 의미입니다. 그러고 나서 제품들을 불량 점수 순으로 정렬합니다. 이제 불량의 기준선 (임계점, threshold)를 정해줘야 합니다. 이 기준선보다 높으면 불량으로, 낮으면 정상이라고 판단하는 겁니다. 아마 사람도 본능적으로 이와 동일한 프로세스를 거쳐 판단하겠죠. 그런데 이 threshold에 따라 F1-Score가 달라진다는 건 무슨 말일까요?
F1-Score 식을 다시 살펴보겠습니다.
F는 틀린 개수 (False)를 의미합니다. TP는 불량이라고 대답을 해서 맞은 경우를 의미하죠. 이 두 개 값은 모두 threshold에 따라 변하는 값입니다. Threshold가 변하면 불량으로 판단했던 제품도 정상으로 판단하게 되니까 말이죠. 따라서 threshold에 따라 F1-Score가 변할 수밖에 없겠네요. 이렇게 되면 기껏 하나의 값으로 성능을 표현하기 위해 F1-Score를 도입한 의미가 없어지죠. F1-Score로 성능을 표기해 주기 위해서는 threshold도 같이 표시해줘야 하니까요.
5. ROC커브, AUROC
5-1. 민감도와 특이도
그럼 모든 threshold에 대해 하나의 숫자로 성능을 표현할 방법은 없을까요? 우선 제일 먼저 드는 생각은 불량 검출에 대한 가장 명확한 지표인 재현율을 모든 threshold에 따라 측정해 보는 겁니다. Threshold가 0일 때는 재현율이 1이 나올 겁니다. 모든 제품을 불량으로 판단하겠다는 거니까요. 반대로 threshold가 max일 때는 재현율이 0이 나오겠죠. 모든 제품을 정상으로 판단할 거니까요. 이렇게 모든 threshold에 대해 재현율을 측정하면 아래와 같은 그래프가 나올 겁니다.
재현율 그래프의 threshold에 대한 면적은 로봇의 불량 검출 성능을 의미하겠네요. 그런데 문제가 하나 있습니다. 전체 면적이 1이 아니라는 겁니다. 왜냐하면 x축은 threshold인데, threshold는 0~1 사이 값을 갖는 지표가 아니니까요. 모든 threshold에 대한 재현율의 면적을 구하면서 그 값의 max가 1이 되게 할 수는 없을까요? 그러자면 x축을 threshold가 아닌 다른 값으로 바꿔야겠네요. 이 새로운 값은 이런 조건을 만족해야 합니다.
- Threshold에 따라 재현율과 마찬가지로 0~1 사이 값을 가져야 합니다.
- 재현율과는 반비례 관계를 가져야 합니다.
이를 만족하는 개념이 필요합니다. 통계학에서는 이를 민감도(sensitivity)와 특이도(specificity)라는 이름으로 설명합니다.
민감도는 재현율과 동일한 개념입니다. 특이도는 위의 그림과 같이 민감도와 반대 개념임을 알 수 있습니다. 이 둘은 실제로 threshold에 따라 반비례할까요?
왼쪽은 threshold=0일 때의 민감도와 특이도 값을 나타냅니다. 오른쪽 그림은 threshold=100일 때의 민감도와 특이도 값을 나타냅니다. 서로 반비례 관계임을 알 수 있죠?
5-2. AUROC
이제 x축을 특이도로 바꿔서 모든 threshold에 대해 민감도(재현율) 값의 점을 찍어봅시다. 그런데 x축을 그냥 특이도 말고, 1-특이도 로 바꿔서 민감도 값이 0부터 1까지 올라가는 방향으로 찍어보겠습니다.
이렇게 나오는 그래프를 ROC커브라고 합니다. 그리고 이때의 그래프 면적을 ROC의 면적이라는 의미로 AUROC (Area Under ROC)라고 합니다. 이 AUROC는 모든 threshold에 대해, 그리고 양성을 얼마나 잘 찾는지에 초점을 맞춘 평가 지표입니다. 모델의 성능에 따라 아래와 같은 모양으로 표현이 됩니다.
만약 모델이 불량에 대한 구분 능력이 없다면 (랜덤으로 예측한 것과 같다면) 일직선으로 표현될 겁니다. Threshold의 변화에 따라 민감도와 특이도가 동등한 수준으로 변할 거니까요. 반면 모델의 불량에 대한 구분 능력이 좋다면 위로 볼록한 형태로 그려질 겁니다. 반대로 모델의 불량에 대한 구분 능력이 안 좋다면 아래로 볼록한 형태로 그려지겠죠.
6. 마무리
지금까지 다양한 평가지표에 대해 살펴봤습니다. 먼저 정확도에 대해 살펴봤습니다. 정확도는 우리가 평소에 사용하는 평가방식과 동일하죠. 그저 전체 문제 중 몇 개를 맞췄는지 평가합니다. 따라서 문제의 정확도에 따라 다른 점수를 줄 수 없다는 한계가 있었죠.
이러한 한계를 극복하기 위해 만든 개념이 정밀도와 재현율이었습니다. 정밀도와 재현율은 상대적으로 더 중요한 ‘불량’에만 초점을 맞춰 평가하는 방식이었죠. 하지만 정밀도와 재현율이라는 서로 다른 두 개의 값으로 성능이 표현된다는 한계가 있었습니다.
이를 극복하기 위해 살펴본 개념이 F1-Score였습니다. F1-Score는 정밀도와 재현율의 조화평균값입니다. 따라서 하나의 값으로 성능을 표현할 수 있었죠. 하지만 F1-Score는 threshold에 따라 다른 값이 나온다는 한계가 있었습니다. 따라서 F1-Score로 성능을 표기하려면 threshold도 같이 명기해줘야 했죠.
이러한 한계를 극복하기 위해 사용한 지표가 AUROC였습니다. AUROC는 모든 threshold에 대해 Recall 성능을 측정한 뒤 그래프 아래 면적을 측정한 값입니다. 따라서 모든 threshold에 대해 불량에 초점을 맞춘 점수를 하나의 값으로 표현할 수 있었습니다.
무작정외우기만 했는데 이건 매우 귀한 교육자료
감사합니다!