안녕하세요 이번글에서는 CNN 모델을 평가하는 또 다른 지표인 F1 score에 대해서 알아보도록 할거에요.


앞서 "5.CNN 성능은 어떻게 평가하게 되나요?"라는 글에서 봤듯이 CNN은 accuracy 기반을 하여 CNN 성능을 평가한다고 말씀드렸어요.


하지만 어떠한 상황에서는 accuracy를 기반으로 하는 것 보다는 다른 성능지표를 사용하는것이 더 좋을 수 있어요. 그래서 이번글에서는 accuracy를 사용하면 좋지 않은 상황과 이런 상황에서 대안이되는 성과지표(measurement)를 알아보도록 할게요.


 


이번 글의 이미지와 모든 내용은 아래 유튜브 영상에서 참고하였으니 아래영상을 보시는걸 추천드립니다.






<1.Confusion Matrix>


로봇에게 A라는 글을 보여주고(input) 로봇이 A라고 답(answers)했을 때 아래 테이블 처럼 1이라는 표시를 해줍니다. 만약 B라는 글을 보여줬는데 D라고 답한다면 (B,D) 구역에 1이라고 표시를 해볼게요.

       


이러한 과정을 반복해서 최종적으로 아래와 같은 테이블을 얻었다고 해봅시다. 로봇A, 로봇B는 각기 다른 결과들을 보여주었어요 (아래와 같은 결과(Matrix)를 Confusion Matrix라고 합니다). 그렇다면 우리는 두 로봇의 Confusion Matrix를 봤을때 어떤 로봇모델을 쓰는것이 좋을까요? 



위에서 질문한 답을 하기 위해서 "Accuracy, Recall, Precision, F1 score"라는 성능평가 지표를 보고 어떤 로봇(모델)을 사용할지 결정하게 되는데, 이러한 개념을 이해하기 위해서는 먼저 TP, TN, FP, FN이라는 개념에 대해서 알아봐야해요. 





<2. TP(True Positive), TN(True Negative), FP(False Positive), FN(False Negative)>


특정 클래스를 잘 구분하는지 알아본다고 해볼게요.

만약 A라는 클래스를 잘 구분하는지 알아본다고 했을 때, 아래 두 가지 개념이 유용하게 사용돼요


Positive and Negative: 정답과 관계없이 A 클래스 입장에서 모델이 A라고 분류하면(+) A기준에서는 Positive하게 분류한것이고, A라고 분류하지 않으면(-) Negative 하게 분류한거에요.


True and False: 정답과 관련하여, 예측과 정답이 일치하면 True, 예측과 정답이 일치하지 않으면 False로 분류해요.



1-1) TP (True Positive)


로봇이 A 클래스를 얼마나 잘 분류하는지 알아본다고 해볼게요 (A관점에서 positive, negative를 나눈다고 가정하겠습니다.)

예를들어, A클래스를 보여주고 A라고 (positive) 올바르게 (True) 예측하면 A에 대해서 True Positive하다고 할 수 있어요 (True Positive for A).





1-2) FP (False Positive for A)


로봇이 A 클래스를 얼마나 잘 분류하는지 알아본다고 해볼게요 (A관점에서 positive, negative를 나눈다고 가정하겠습니다.)

예를들어, B,C,D 클래스를 보여줬을 때 A라고 (positive) 잘 못 판단(False) 한다면 A에 대해서 False Positive하다고 할 수 있어요 (False Positive for A).



1-3) FN (False Negative for A)


로봇이 A 클래스를 얼마나 잘 분류하는지 알아본다고 해볼게요 (A관점에서 positive, negative를 나눈다고 가정하겠습니다.)

예를들어, A 클래스를 보여줬을 때, A가 아니(Negative)라고 잘 못 (False) 판단하는 경우를 A에 대해서 False Negative 하다고 해요 (False Negative for A).




1-4) TN (True Negative for A)


로봇이 A 클래스를 얼마나 잘 분류하는지 알아본다고 해볼게요 (A관점에서 positive, negative를 나눈다고 가정하겠습니다.)

예를들어, B,C,D 클래스를 보여줬을 때, A가 아니(Negative)라고 올바르게 판단(True) 하는 경우를 A에 대해서 True Negative 하다고 합니다 (True Negative for A).



<사진5>





<3. Accuracy>


위에서 언급한 개념들을 토대로 우리가 사용할 수 있는 첫 번째 성능지표는 Accuracy에요. Accuracy는 아래와 같은 수식을 통해 계산이되요



(아래영상은 TP로만 계산이 되었네요. 개념만 이해하시면 될 것 같습니다.)


이런 경우에는 Accuracy 지표를 이용하여 Model1, Model2를 평가하고 Model1을 사용하게되면 실제로 어떤 class(A,B,C,D)를 보여줘도 Model2보다 높은 확률로 정답을 도출해낼거에요.


하지만, 위와 같은 경우는 Model1, Model2 모두 실제 테스트 클래스(actual values)가 A=10, B=10, C=10, D=10 으로 각각 동일할 거에요. 이럴때 머신러닝이 학습하기 위한 데이터셋의 class가 balance하게 구성되어 있다고 이야기해요. 그렇다면 class가 imbalance한 구조에서도 accuracy라는 지표가 효율적일까요?


예를들어, 의학 이미지 데이터들을 보면 정상인(normal)에 해당하는 데이터셋은 굉장히 많이 있는 반면에, 병(변)이 있는 사람들의 데이터셋은 굉장히 적어요. 만약 정상인의 MRI 이미지가 1000개가 있고, 암환자의 MRI 이미지가 100개가 있는 경우에 accuracy 지표를 쓰면 어떤 문제가 일어날까요?





1) Accuracy 문제점


위에서 언급한 Accuracy measurement는 imbalanced dataset을 갖고 있는 상황에 따라서 그닥 효율적이지 않은 성능지표가 될 수 있어요. 만약 위의 예시처럼 모든 클래스의 데이터가 10개씩 balance하게 있지 않고 아래와 같이 A클래스에만 집중적으로 데이터가 몰려있다면 어떻게 될까요? A기준에서 봤을때는 아래 성능지표가 좋을 수 있지만, B,C,D 관점에서 보면 해당 모델을 평가하는데 accuracy가 좋은 measurement가 될 수 있을까요?


한 눈에 보더라도 모든 데이터가 A에 쏠려있기 때문에 accuracy가 B,C,D에도 적용이 되기에는 B,C,D에 대한 모집단이 부족한걸 보실 수 있으실 거에요.


아래 예시를 통해 살펴볼게요.

 



먼저 Model1을 오로지 A관점에서 보면 모델이 그닥 좋지 않을 수 있어요. 왜냐하면 100/(200=100+80+10+10) = 50%의 정확성을 보이기 때문이에요. 하지만, B,C,D 관점에서 보면 모두 80% 이상의 정확성을 보이기 때문에 Model1은 B,C,D 관점에서는 좋은 모델이고, A모델 관점에서는 좋지 않은 모델이되요.


Model2의 경우 A관점에서 보면 198/200 = 99%의 정확성을 보여 좋겠지만, B,C,D의 관점에서 보면 모두 10%의 정확성을 보이기 때문에 Model2가 좋은 모델이라 할 수 없어요.


이런 경우 Accuracy를 적용해 Model을 평가하게 되면 어떻게 될까요? 이런 상황에서는 특정 class의 샘플수와 해당 class의 정확성에 많이 의존해서 accuracy가 도출될 수 밖에 없게되요. 위에 있는 예시를 보더라도, Model1,2에 입력된 A클래스가 앞도적으로 많고, A클래스에 대한 accuracy에 따라서 전체 클래스(A,B,C,D)에 대한 accuracy 가 결정이돼요. 


우리가 의학적인 목적으로 머신러닝을 이용한다고 해볼게요. 1000명이 진료를 보러 왔는데 실제 990명이 정상인이고 나머지 10명이 병(변)이 있다고 해보겠습니다. 이 머신러닝 모델은 정상인들에 대해서는 100%의 정확성을 보였고, 실제 병(변)이 있는 분들에 대해서는 50%의 확률을 보였다고 할게요. 전체적으로 볼때 1000명의 환자중 995명을 제대로 판별했으니 99.5%의 정확성을 보인다고 할 수 있겠죠. 그럼, 이 병원을 신뢰하고 가야하는건가요? 실제로 병(변)이 있는 분들께서 이 병원을 찾았다가는 큰 낭패를 보시게 될 거에요. 


위와같이 데이터셋의 class가 imbalance하게 되어있다면 어떤 성능지표를 사용해야 하는걸까요? 이럴때 상용될 수 있는 기법이 F1 score를 계산하는거에요. 그럼 지금부터 F1 score 개념을 이해하기 위해 Precision, Recall 개념을 차례대로 살펴볼게요.





<4. Precision>


Given a class prediction from the classifier, how likely is it to be correct? 


각각의 클래스에 대해서 정확하게 분류됐는지를 알고 싶을 때, Precision이라는 개념을 사용해요. 아래 예시를 기준으로 A 상황에 대한 Precision을 보고자 한다면, 9/(9+1+5+0=15) 가 되겠네요.


일반화해서 보자면, 머신러닝 모델이 특정 클래스를 prediction할 때, 해당 클래스에 대한 prediction(예측) 얼마나 잘 맞을지를 보여주는 지표라고보시면돼요. 즉, 특정 클래스에 대해 prediction 했다는 것만 고려한다는 것에대한 숨어 있는 의미는 Negative 요소를 고려하지 않는다는 점이에요. 




<TP 예시>


<FP 예시>



Model1의 Average precision 결과를 보면 Accuracy와 비교해서 비교적 class A에 덜 의존적인 결과를 볼 수 있다는 것을 알 수 있어요.



Model2도 마찬가지네요.



결과적으로 보면 Accuracy는 imbalance한 dataset 상황에 있을 때, 특정 class의 accuracy에 지나치게 의존적일 수 있지만, Precision은 평균을 취함으로써 그 의존성을 줄여주게 됩니다. 즉, 다시말해 precision은 머신러닝 모델이 A or B or C or D를 prediction할 때, 평균적으로 얼마나 정확하게 prediction하는지 알려주는 성과지표라고 할 수 있겠어요.






<5. Recall>

Given a class, will the classifier detect it?

어떤 클래스가 주어졌을 때, 주어진 클래스를 다른 클래스들 중에서 잘 검출(detect)하는지 알고싶을 때 사용하는 개념이 recall이라는 개념입니다. 예를들어, 실제 A 클래스가 머신러닝 모델에 들어 왔을 때, 9번 정도 A라고 예측(prediction)했다면, "A,B,C,D 클래스"들 중에서 A 클래스를 90% 잘 검출해냈다고 할 수 있어요.



그래서 아래같와 같이 A에 대한 recall은 9/(9+1+0+0) 이 됩니다.



<TP 예시>


<FN 예시>



Recall 또한 각각의 클래스에 대한 recall의 평균을 취하기 때문에 한 class의 accuracy에 지나치게 의존하지 않게 됩니다.




Recall 또한 마찬가지로 imbalance한 dataset 상황에 있을 때, 각 클래스에 대한 평균을 취함으로써 특정 class의 의존성을 줄여주게 됩니다. 즉, 다시말해 recall은 머신러닝 모델이 특정 class에 대해 (특정 class가 test 입력으로 들어올때), 평균적으로 (전체 (A,B,C,D) 클래스들 중에서 정답이 되는 특정 클래스를) 얼마나 잘 detect(검출)하는지 알려주는 성과지표라고 할 수 있겠어요.





<6. F1-score>


앞선 글에서 봤듯이 클래스가 imbalance한 문제에서는 precision과 recall이 유용하게 사용될 수 있어요. 그렇다면 precision과 recall 지표를 동시에 잘 이용한다면 imbalance dataset이 주어진 상황에서 좀 더 좋은 모델을 선택할 수 있지 않을까요?


다시말해, 특정 class의 accuracy에 덜 의존하면서, precision(Given a class prediction from the classifier, how likely is it to be correct? )과 recall(Given a class, will the classifier detect it?)이 내재하고 있는 두 가지 상황(어떤 관점에서 모델을 판단할지)을 모두 고려하면, 좀 더 객관적이고 다양한 상황을 고려할 수 있는 평가지표가 될거에요.


일반적으로 어떤 두 개념을 동시에 고려할 때 도입되는 개념은 평균입니다. 그래서 Precision과 Recall 두 개념(속에 녹아있는 상황들)을 적절하게 고려해주기(나타내주기) 위해 Precision과 Recall의 평균을 취하게 되는거죠. 


<사진1>



평균을 내는 방식에도 종류가 여러가지인데, 일반적으로 산술평균을 내게 되면 precision과 recall 두 개념(상황)을 모두 고려할 때 문제가 발생할 수 있어요. 앞서 Precision과 Recall에서 얻었던 장점이 특정 클래스의 accuracy에 의존적이지 않다는 점이라면, Precision과 Recall을 개념을 혼합할 때도 조심해야하는 부분이 두 값의 평균(precision과 recall을 혼합했을 때)값이 precision 또는 recall 두 개념을 적절하게 고려할 수 있는 값을 의미하는가에요.


precision = (p(A)+p(B)+p(C)+p(D))/4 = p

recall = (r(A)+r(B)+r(C)+r(D))/4) = r

산술 평균값 = (p+r)/2


예를들어, 어떤 A라는 모델에서 precision 값이 0.9이고, recall 값이 0.1이라고 해볼게요. 이 결과 산술평균값은 0.5일거에요. B라는 다른 모델에서는 precision 값이 0.5이고, recall 값도 0.5라고 해볼게요. 이 결과 산술평균값도 0.5에요. 그런데, A라는 모델에서 얻은 0.5라는 값이 precision, recall을 동시에 잘표현해주나요? precision의 의미를 내포한다고 하기에는 너무 결과값(평균값)이 작은것 같고, recall을 표현하기에는 결과값이 너무 큰 것 같지 않나요? 


우리가 알고 싶은건 precision과 recall 이라는 두 개념을 동시에 잘 아울러서 보여줄 수 있는 결과값이 존재하는가에요. 즉, precision과 recall 값들의 차이가 나지 않아야 precision과 recall 모두 성능이 좋은지 아닌지를 이야기 할 수 있게 되는거에요. precision과 recall 두 값이 차이가 많이난다면 두 개념 중에 특정 값(precision or recall)에 의존적이게 됩니다. 


precision, recall 값이 차이가 많이 난다면 당연히 두 개념이 머신러닝 모델 성능에도 문제가 있다고 보는것이 합리적인 판단이에요. 그래서 precision과 recall 이라는 상황을 고려할 때, 두 상황을 "모두" 적절하게 고려했는지를 판단하려면 precision과 recall 값의 차이가 심하게 나면 안됩니다. 


그래서 precision과 recall 간에 차이가 급격하게 나는 것 보다, precision과 recall을 혼합한 결과가 두 값의 차이가 적을 때 높아야 두 상황(precision, recalll)을 적절하게 고려했다고 할 수 있을거에요. 


이러한 철학을 기반으로 도입된 개념이 '조화평균'이라는 개념이에요.



1) 조화평균(harmonic mean)


말을 그대로 풀어 쓰면, 어떤 두 값에 대한 평균을 낼때 두 값이 조화롭다면(두 값의 차이가 많이 나지 않는다면) 높은 값을, 두 값이 조화롭지 않다면 (두 값의 차이가 많이 난다면) 낮은 값을 도출해준다는 철학을 갖고 있어요.



예를들어, 어떤 모델이 precision = a = 0.9 라고 하고, recall = b = 0.1을 기록했다고 하고, 다른 모델이 precision = a = 0.5, recall = b = 0.5라고 했을 때의 조화평균을 구하면 아래와 같아요.


 


첫 번째 케이스는 precision과 recall의 차이가 너무 크기 때문에 결과값이 낮게 나왔어요. 이 경우에는 precision과 recall 값들 간의 차이가 크기때문에 두 값을 동시에 잘 보여줄수 (상징할수) 없기 때문에 그러한 의미로 낮은 값이 도출됩니다. 두 번째 케이스는 precision과 recall을 모두 잘 대변해주고 있네요.


이렇게 precision과 recall에 대한 조화평균의 철학을 도입한 성과지표를 F1 score라고 할 수 있겠어요.




###요약하자면###


위와 같이 precision, recall에 대한 조화평균 값이 낮다고 한다면 두 가지 경우를 생각해 볼 수 있어요.

첫 번째는 precision, recall 값이 서로 차이가 많이 나는 경우입니다. 이러한 경우에는 두 값을 "동시에" 고려할만한 지표로 사용하기에 적절치 않기 때문에 조화평균값이 낮게 나옵니다. 즉, imbalance dataset 상황상에서 사용하기 힘든모델이라는 결론을 내릴 수 있어요.

두 번째는 precision, recall 값이 서로 차이가 많이 나지는 않은 경우입니다. 이러한 경우에는 precision, recall 값 모두가 낮기 때문에 이 역시 imbalance dataset 상황에서 사용하기 힘든모델이라는 결론을 내릴 수 있어요.


Precision만 너무 높아도 안되고, Recall만 너무 높아도 안되고, 이 둘 간의 평균값이 높아야 모델에 대한 전반적인 성능이 좋다고 할 수 있습니다. 그런데, 일반적인 산술평균을 적용하면 Precision or Recall 둘 중에 엄청 높은 값에 해당하는 쪽으로 평균이 치우쳐질 수 있기 때문에 조화평균을 사용하게됩니다.


일반적으로 두 값(precision, recall)이 어느정도 비례해야 좋은건데, 어느 한 값이 너무 낮아버리면 성능에도 당연히 문제가 있다고 보는게 맞기 때문에 산술평균을 쓰는것보다 조화평균을 쓰는 F1 score라는 성과지표를 사용하는것이 더 좋습니다.



[사진 래퍼런스]

사진1

http://blog.naver.com/PostView.nhn?blogId=dalsapcho&logNo=20167498252

'Deep Learning for Computer Vision > Convolution Neural Network (CNN)' 카테고리의 다른 글

11. Transferlearning (Feat. fine-tuning)  (0) 2020.01.17
10. DensNet  (0) 2020.01.17
9. ResNet  (12) 2020.01.17
8.GoogLeNet (inception v1)  (2) 2020.01.17
7. VGGNet  (5) 2020.01.17

+ Recent posts