brunch

You can make anything
by writing

C.S.Lewis

by Chris송호연 Sep 13. 2017

Classification 모델 평가 기준 1편

Precision and Recall

안녕하세요- 크리스입니다. 여름이 다 끝나버렸네요..

이젠 매일 따뜻한 옷을 챙겨야 겠군요.

다시 봄하고 여름이 오기를 기다려야죠.


이번 포스팅에서는 Classification Model을 평가하는 법에 대해서 설명드리겠습니다. 

저는 Classification 하면, 사무라이가 떠오르더라구요- 

Classification Model이 하는 일을 보면 데이터를 정확하게 잘라내는 칼질을 하는 느낌이 들어서요!

그래서 히무라 켄신을 표지모델로 잡았습니다 ㅋㅋ


아주 기초적인 내용이지만, 아직 모르시는 분들을 위해 이야기하듯 쉽게 설명해드리도록 하겠습니다.


분류 모델을 만들 때, 우리는 Tensorboard에서 
트레이닝이 잘 되고 있는지 확인하기 위해 주로 두가지 값을 확인합니다.


- 정확도(accuracy)

- loss 값


그리고 여러 예제들을 돌리다보면, 눈에 자꾸 걸리는 단어들이 생기실 겁니다. 그 단어들은 바로


- Recall

- Precision

- Miss Rate

- Sensitivity

- Specificity

- Fall-out

- F1 Score


입니다. 


저 단어들은 바로 Classification 모델을 평가하는 여러 지표들입니다.


처음에는 저도 이런 생각을 했습니다.


정확도(Accuracy)만 잘 맞으면 되는 거 아닌가?
왜 저렇게 복잡한 표현들이 많지?


물론, Classification 모델을 만드시는 분이시라면

궁극적으로 100%에 최대한 가까운 정확도를 성취해내고 싶을 겁니다.


하지만 현실세계의 문제를 100%의 정확도로 분류해내기란 불가능합니다. 
어느 정도의 오차를 인정해야만 하죠.

그럼 다시 한 번 궁금한 점이 생겼습니다.


오차를 어떻게 인정할 것인가? 
어떻게 생긴 오차를 원하는가?


오차를 피할 수 없다면, 우리는 어떤 오차를 선택해야 할까요?

자연스러운 질문입니다! 


각 평가기준들을 이해하기 위해 예를 들어서 설명드리겠습니다.

우리에게는 두가지 모델이 있습니다.


- A 모델 : 스팸 메일을 검출해내는 Classification Model

- B 모델 : 암 환자를 진단하는 Classification Model


A 모델 : 스팸 메일 검출 모델

하나는 스팸 메일을 분류하는 A 모델입니다. 

광고성 메시지를 자동으로 차단하는 딥러닝 모델을 만들었죠. 


스팸 메일을 분류하는 A 모델은 종종 

1) 스팸 메일을 정상 메일함에 잘못 분류해 보내고, (예측 모델 : 거짓, 실제 : )

2) 정상 메일을 스팸 메일함에 잘못 분류해 보냅니다. (예측 모델 : , 실제 : 거짓)


여러분은 위 두가지 실수 중에 어떤 실수가 치명적이라고 생각하시나요?


저는, 2)번 정상 메일을 스팸 메일에 보낸 케이스가 치명적이라고 생각합니다.

예를 들어, 스팸메일로 잘못 분류된 메일이 연애 고백 편지라고 쳐볼게요.

그 소중한 편지를 1년 뒤에나 열어보게 되었다고 칩시다. 

그럼, 나를 짝사랑했던 이성의 고백을 받아두고도 

인연을 놓쳐버리는 안타깝고 가슴아픈 일이 생길 '가능성'은 분명히 있습니다.


B 모델 : 암 환자 진단 모델

또 다른 하나는 암 환자를 진단하는 B 모델입니다. 암 진단의 새로운 지평을 연 대단한 모델입니다.


암 환자를 분류하는 B 모델은 종종

1) 암 환자를 정상으로 잘못 분류하고 (예측 모델 : 거짓, 실제 : )

2) 정상 환자를 암 환자로 잘못 분류합니다. (예측 모델 : , 실제 : 거짓)


이번에는 어떻게 생각하세요? 어떤 실수가 치명적일까요?


당연히 1)번 실수가 치명적입니다. 

2)번 실수 : 정상 환자를 암환자로 잘못 분류한 경우
추가 검사를 받으면 분명 정상 환자라고 재 판정을 받겠지요.

1)번 실수 : 소중한 암 치료의 골든 타이밍을 놓치게 만들어
극단적으로는 환자를 사망에 이르게 할 수 있는 실수입니다.


자, 두 가지 모델에서 1) 2) 실수를 각각 부르는 이름이 있습니다. 


1)번 실수 False Negative : 예측 모델은 거짓이지만 실제 값은

2)번 실수 False Positive : 예측 모델은 이지만 실제 값은 거짓


간단하게 위에서 이야기를 나눠봤지만,

모델 A에서는 2)번 실수 False Positive를 최대한 줄이고 싶어합니다. 

모델 B에서는 1)번 실수 False Negative를 줄이고 싶어 합니다.


이렇게 모델마다 우리가 원하는 오차의 특성이 다릅니다.


예측 값  ,  거짓 과 실제 값 ,  거짓

각각 두가지 경우가 두 번 있으니, 총 경우의 수는 4가지가 나옵니다.


이 4개의 경우의 수를 도표로 그린 것이 바로 Confusion Matrix입니다.

출처 : https://uberpython.wordpress.com/2012/01/01/precision-recall-sensitivity-and-specificity/


우리가 알고 있는 정확도란, 

정확도(Accuracy) = (True Positive + True Negative) / Total Population

입니다.


여기서 True Positive와 True Negative는 각각 아래의 경우를 뜻합니다.

True Positive : (예측 모델 : , 실제 : )

True Negative : (예측 모델 : 거짓, 실제 : 거짓)


암 환자를 암 환자라고 분류하고, 스팸 메일을 스팸 메일이라고 분류한 것이 바로 True Positive 입니다.

정상 환자를 암 환자가 아니라고 분류하고, 일반 메일을 스팸 메일이 아니라고 분류한 것이 바로 True Negative입니다.


Precision and Recall

그럼, 이제 우리는 Precision과 Recall에 대해 알아보겠습니다. Precision과 Recall이라는 단어 역시 여기 저기에서 많이 보셨을 겁니다. 우선 Precision과 Recall이 아까 보여드린 Confusion Matrix에서 어떻게 표시되는지 보시겠습니다.


출처 : https://uberpython.wordpress.com/2012/01/01/precision-recall-sensitivity-and-specificity/


빨간 색이 Precision이고 노란 색이 Recall입니다.


Precision = True Positive / (True Positive + False Positive)

Recall = True Positive / (True Positive + False Negative)


또 하나, Precision과 Recall을 잘 설명하는 그림을 보겠습니다.


Precision and Recall (출처 : wiki)


Precision = True Positive / (True Positive + False Positive)

Precision을 암 환자의 예로 설명드려보겠습니다.

Precision = 암 환자인데 암 환자라 맞춘 수(TP) / (암 환자인데 암 환자라 맞춘 수(TP) + 암 환자 아닌데 암 환자라고 맞춘 수(FP))


Recall = True Positive / (True Positive + False Negative)

Recall = 암 환자인데 암 환자라 맞춘 수(TP) / (암 환자인데 암 환자라 맞춘 수(TP) + 암 환자인데 암 환자가 아니라고 맞춘 수(FN))


자, 우리가 암 진단을 하는 모델에서 원했던 건 뭐죠? 


암 환자인데 암 환자가 아니라고 맞추는 경우를 최대한 줄이는 게 더 중요했죠? 

그럼 우리는 암 환자 모델을 Recall이 중요한 모델이라고 설정할 수 있습니다.


Precision = True Positive / (True Positive + False Positive)

Precision을 스팸 메일의 예로 설명드려보겠습니다.

Precision = 스팸 메일인데 스팸 메일이라 맞춘 수(TP) / (스팸 메일인데 스팸 메일이라 맞춘 수(TP) + 스팸 메일이 아닌데 스팸 메일이라고 맞춘 수(FP))


Recall = True Positive / (True Positive + False Negative)

Recall = 스팸 메일인데 스팸 메일이라 맞춘 수(TP) / (스팸 메일인데 스팸 메일이라 맞춘 수(TP) + 스팸 메일인데 스팸 메일이 아니라고 맞춘 수(FN))


우리가 스팸 메일 분류를 하는 모델에서 원했던 건 뭐죠? 


스팸 메일이 아닌데 스팸 메일이라고 맞추는 경우를 최대한 줄이는 게 더 중요했죠? 

그럼 우리는 스팸 메일 분류 모델을 Precision이 중요한 모델이라고 설정할 수 있습니다.


이렇게 이번 포스팅에선 PrecisionRecall에 대해서 살펴보았습니다. 


많은 분들이 공부하느라 힘드실텐데, 힘내요 우리! 화이팅 :)


References

https://uberpython.wordpress.com/2012/01/01/precision-recall-sensitivity-and-specificity/

https://en.wikipedia.org/wiki/Confusion_matrix

https://en.wikipedia.org/wiki/Precision_and_recall

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari