반응형

ML 실무(Work, Life, Future)

이 글의 목적은 ML 엔지니어가 현업에서 일하면서 겪게 되는 일과 주변 환경, 마주하게 되는 문제, 그리고 해결방법 등의 다양한 경험과 노하우를 공유함으로써 ML 분야에 관심 있는 사람들이 실무에 대한 이해도를 높이고 업무에 적응하는데 도움이 되는 정보를 제공하는 것입니다. 최대한 쉽게 설명할 수 있도록 노력하겠습니다. (이해가 잘 안 되는 부분이나 잘못된 부분이 있으면 댓글, 메일로 알려주세요.)

왜 ML Metric(성능지표)가 필요한가?

이미지 안에 고양이가 들어있는지 아닌지를 구분하는 모델을 만들었다고 생각해봅시다. 잘 만들었다고 자랑하고 싶은데 어떻게 자랑해야 할까요? 쉽게 생각나는 방법이 다른 모델과 비교하는 것입니다. 100 장의 이미지 중에 10장의 고양이 사진이 있는데 내가 만든 모델에서는 10장 모두 찾았고 다른 사람의 모델에서는 9장만 찾았다면 내가 만든 모델이 더 좋은 모델이라고 할 수 있을 것입니다. 내 모델은 10개 중에 10개를 다 찾아서 100%이고, 다른 사람의 모델은 10개 중에 9개만 찾았으니 90% 맞추었다고 할 수 있으니까요. 동의하시나요?
그런데
만약에 내가 만든 모델에서는 100장 중에서 고양이가 있다고 판단한 이미지가 20장이고 다른 사람의 모델에서는 9장이라면 어떨까요? 즉, 내 모델에서는 20장이 고양이가 들어가 있다고 판단했지만 실제로는 10장만 있었고 다른 사람의 모델에서는 9장을 고양이가 들어있다고 판단했고 실제로 9장이 고양이가 들어가 있던 것입니다. 내 모델은 20번 있다고 했는데 10번만 있었으니 50% 맞추었다고 할 수 있고 다른 사람의 모델에서는 9번 있다고 했는데 9번 모두 있었으니 100% 맞추었다고 할 수 있겠네요. 이렇게 생각해보니 다른 사람의 모델이 더 좋은 것 같습니다.
위에서 설명드린 것처럼 단순히 있다/없다로 분류하는 문제에서도 여러 종류의 지표로 그 성능을 평가할 수 있습니다. 이것은 어떤 모델을 선택해서 사용하는 것이 더 좋은지 판단 기준이 되기 때문에 적합한 성능 지표를 산출하고 비교하는 것은 매우 중요합니다. 따라서 분류 문제에 있어서 많이 쓰이는 다양한 성능평가 지표를 알아보고 언제 어떤 지표로 평가/비교하는 게 좋은지 알아보도록 하겠습니다. 그리고 마지막으로는 이해 내용을 확인하는 퀴즈를 풀어보겠습니다. 자 그럼 먼저, 실제 데이터 분류 유형(고양이 있음/없음)과 모델의 추정 분류 경우(고양이가 있다고 추정/없다고 추정한 경우)를 기반으로 각각 발생한 결과수를 정리해서 혼돈 행렬(Confusion Matrix)을 만들어보고 이를 이용한 다양한 성능지표에 대해서 알아보겠습니다.

혼돈 행렬(Confusion Matrix)

위에서 말씀드린 것처럼 혼돈 행렬은 실제 데이터의 분류 유형과 모델의 추정 분류 유형으로 구분됩니다. 그래서 아래와 같은 행렬/표를 만들 수 있습니다.

  추정 분류(고양이 있음) 추정 분류(고양이 없음)
실제 분류(고양이 있음) TP: True Positive FN: False Negative
실제 분류(고양이 없음) FP: False Positive TN: True Negative

내가 만든 모델의 경우에서 Positive의 의미는 "고양이가 있다"를 나타 냅니다.
TP: True Positive는 모델이 있다고 판단해서 맞은 개수입니다.(실제로 고양이가 있는 이미지를 모델이 있다고 판단한 경우)
FN: False Negative는 모델이 없다고 판단해서 틀린 개수입니다.
FP: False Positive는 모델이 있다고 판단해서 틀린 개수입니다.
TN: True Negative는 모델이 없다고 판단해서 맞은 개수입니다.
"맞추었다"를 True로, "틀렸다"를 False로, "있다"를 Positive로, "없다"를 Negative로 기억하면 좋을 것 같습니다.
위의 표를 앞에서 설명한 '내가 만든 모델'의 결과로 혼돈 행렬을 만들어 보면 아래와 같습니다.

전체 테스트 데이터수 100 건 추정 분류(고양이 있음) 추정 분류(고양이 없음)
실제 분류(고양이 있음) 10 (모델이 있다고 판단해서 맞은 갯수) 0 (모델이 없다고 판단해서 틀린 갯수)
실제 분류(고양이 없음) 10 (모델이 있다고 판단해서 틀린 갯수) 80 (모델이 없다고 판단해서 맞은 갯수)

처음에 예를 설명하면서 했던 내용들이 깔끔하게 정리되어 보이는 것 같습니다.
(잠시 아래를 보지 말고 '다른 사람이 만든 모델'의 혼돈 행렬을 직접 만들어 보세요.)
'다른 사람이 만든 모델'의 결과로 채워 보면 아래와 같습니다. 9건만 고양이로 분류하고 나머지는 모두 고양이 없음으로 분류한 경우이지요.

  추정 분류(고양이 있음) 추정 분류(고양이 없음)
실제 분류(고양이 있음) 9 1
실제 분류(고양이 없음) 0 90

자, 지금까지 모델의 출력 결과에 따른 혼돈 행렬을 만들어 보았습니다. 그럼 이제부터는 이 행렬을 이용하여 다양한 성능 지표를 만들어 보겠습니다.

정확도(Accuracy)

말 그대로 모델의 정확도를 나타내는 지표입니다. 그래서 True 부분에 집중해서 계산됩니다. 모델이 맞춘 숫자와 실제 데이터 숫자의 비율로 계산할 수 있습니다. 즉, True로 시작하는 TP와 TN의 합을 전체 추정 개수(또는 총 실제 분류 건수:위의 예시에서는 총 데이터 수 100건)로 나누어 주면 됩니다. 아래는 내가 만든 모델에 대한 Accuracy를 계산한 내용입니다.
내가 만든 모델의 Accuracy = (TP + TN) / 총 실제 분류 건수 = (10 + 80) / 100 = 0.9 (= 90%)
(아래를 보지 말고 다른 사람이 만든 모델의 Accuracy를 계산해 보시지요.)
다른 사람이 만든 모델의 Accuracy = (TP + TN) / 총 실제 분류 건수 = (9 + 90) / 100 = 0.99 (= 99%)
Accuracy 관점에서 보면 다른 사람이 만든 모델이 더 좋은 성능으로 나타납니다.

정밀도(Precision)

모델이 얼마나 정밀하게 Positive를 찾아내는지 평가하는 지표입니다. 그래서 이 지표는 모델의 Positive 결과에 집중해서 계산됩니다. 즉, 전체 Positive라고 추정한 건수 중에 얼마나 맞추었는지를 평가합니다. 다시 말하면, TP 값을 전체 Positive건수(TP + FP)로 나누어서 계산합니다.
내가 만든 모델의 Precision = TP / (TP + FP) = 10 / (10+10) = 0.5 (= 50%)

(아래를 보지 말고 다른 사람이 만든 모델의 Precision를 계산해 보시지요.)
다른 사람이 만든 모델의 Precision = TP / (TP + FP) = 9 / (9 + 0) = 1 (= 100%)
Precision 관점에서 보면 다른 사람이 만든 모델이 더 좋은 성능으로 나타납니다.

재현율(Recall)

모델이 얼마나 많은 Positive Case를 찾아내는지 평가하는 지표입니다. 그래서 이 지표는 실제 분류 Case 중 Positive를 집중해서 계산됩니다. 즉, 실제 분류 Positive 건수 중에서 얼마나 많은 건수를 맞추었는지를 평가합니다. 다시 말하면, TP 값을 전체 실제 분류 Positive건수(TP + FN)로 나누어서 계산합니다.
내가 만든 모델의 Recall = TP / (TP + FN) = 10 / (10+0) = 1 (= 100%)
(아래를 보지 말고 다른 사람이 만든 모델의 Recall을 계산해 보시지요.)
다른 사람이 만든 모델의 Recall = TP / (TP + FN) = 9 / (9 + 1) = 0.9 (= 90%)
Recall 관점에서 보면 내가 만든 모델이 더 좋은 성능으로 나타납니다.

F1 Score

일반적으로 정밀도와 재현율이 모두 중요한 경우가 많이 있습니다. 즉, 모델이 정밀하게 Positive를 찾아내는 것도 중요하고 많은 최대한 많은 Positive Case를 찾아내는 것도 중요한 경우이지요. 이러한 경우 사용하는 성능지표가 F1 Score입니다. F1 score는 조화 평균의 일종으로 Precision과 Reacall 값을 이용하여 산출됩니다. 공식은 F1 Score = 2 * (Precision * Recall) / (Precision + Recall)입니다. 이를 바탕으로 각 모델의 F1 Score 값을 만들어 보겠습니다.
내가 만든 모델의 F1 score = 2 * (Precision * Recall) / (Precision + Recall) = 2 * (0.5 * 1) / (0.5+1) = 0.66 (= 66%)
(잠시 아래를 보지 말고 '다른 사람이 만든 모델'의 F1 score를 직접 계산해 보세요.)
다른 사람이 만든 모델의 F1 score = 2 * (Precision * Recall) / (Precision + Recall) = 2 * (1 * 0.9) / (1+0.9) = 0.94 (= 94%)
F1 score 관점에서 보면 다른 사람이 만든 모델이 더 좋은 성능으로 나타납니다.

성능 지표 선택

위의 지표들을 보면 어떤 것은 '내가 만든 모델'의 성능이 더 좋고 어떤 것은 '다른 사람이 만든 모델'의 성능이 더 좋게 나옵니다. 이런 경우 어떤 모델을 사용해야 할까요? 중간에 F1 Score 설명할 때 말씀드린 것처럼 모델을 사용하는 목적에 맞는 성능 지표를 사용하는 것이 좋습니다. 직설적으로 말씀드리면 무조건 고양이가 있는 사진을 최대한 많이 찾고 싶으면 Recall을, 고양이가 있는 사진만 잘 골라내고 싶은 경우(즉, 고양이가 없는 사진을 있는 것으로 잘못 찾아내는 것을 최소화하는 경우) Precision을, 두 경우 모두 중요할 경우 F1 score를 사용하는 것이 좋겠습니다.
모두 이해하셨나요? 그럼 질문드려보겠습니다. 아래의 질문을 읽고 어떤 성능지표가 적합한지 맞추어 보세요.

1. 제품 생산 라인에서 품질 이상을 발견하는 정상/불량 판정 모델을 만들었다고 가정하겠습니다. 고객의 품질 요구 수준이 많이 높습니다. 그래서 모델이 불량품을 판별하면 생산 라인이 멈추고 해당 불량품과 관련된 라인에서 1시간 전 이후로 생산된 제품에 대해서 전체 수작업 검사를 진행합니다. 이후 불량품을 제거하고 공정을 재시작합니다. 이러한 경우 어떤 성능 지표로 평가하는 것이 좋을 까요? 그 이유는 무엇인가요?
2. 보험 사기를 적발하는 사기 탐지 모델(Frud Detection Model)을 만들었다고 가정하시죠. 이미 고객센터에서 사기로 의심되는 경우 고객에게 전화하거나 데이터 검토를 통해 사기 여부를 검토하는 업무를 하고 있습니다. 그리고 평균 사기 금액이 크기 때문에 회사는 사기로 인한 잘못된 보험금 지출을 최대한 막기 위해 핵심 사업/과제로 추진하는 상황입니다. 이러한 경우 만들어진 모델을 어떤 성능 지표로 평가하는 것이 좋을 까요? 그 이유는 무엇인가요?
3. X-ray, CT 등 이미지 데이터를 분석해서 암 발생(보유) 유무를 판단하는 모델을 만들었다고 가정하시죠. 이 모델을 평가하는데 적합한 성능 지표는 무엇일까요? 선택하신 성능지표가 적합한 이유가 무엇인가요?
힌트: 활용과 해석이 중요합니다.
각 질문에 대한 답과 이유를 이메일이나 댓글로 남겨주시면 제가 생각한 답을 알려드리겠습니다.
theyellowlionking@gmail.com

마지막으로 AUC/Roc Curve에 대해서 알아보겠습니다.

위키 이미지

위의 그림에서 처럼 True Positive rate 와 False Positive rate를 가지고 그려진 그래프를 Roc Curve(Receiver operating characteristic curve)라고 합니다.
Roc Curve 를 그리게 되면 오른쪽아래 지역과 왼쪽 위 지역으로 나누어지는대 이때 오른쪽 아래 지역을 AUC(Area under the curve)라고 합니다. 이 지역이 넓으면 넓을 수록 모델의 성능이 좋은 것을 알 수 있습니다.

https://en.wikipedia.org/wiki/Receiver_operating_characteristic#/media/File:Roc_curve.svg



감사합니다.

1. 높은 품질 수준을 원하기 때문에 모두 찾아내야 하는 Recall이 중요하고요, 잘못 찾아낸 경우 막대한 손해가 있으니 Precision 도 중요합니다. 따라서 F1 Score를 쓰는 게 좋겠네요.
2. 이미 고객센터에서 고객에게 전화를 걸어 확인하는 단계가 있으므로 모델에서 잘못 찾아내도(정상 고객을 사기라고 찾아내도) 고객센터에서 거를 수 있어서 현재는 Precision 이 낮아도 문제가 되지는 않을 것 같습니다. 그리고 사기 보험금 지출을 최대한 막는 것이 핵심 사업이라고 했으니 모든 사기를 탐지해내는 것이 중요합니다. 따라서 Recall을 사용하는 것이 좋겠네요.
3. 이유만 잘 맞으면 모두 정답입니다.

반응형

+ Recent posts