Machine Learning/Metrics

머신러닝 모델의 평가 (1. 이진 분류)

Xylene 2020. 8. 3. 22:18

 어떠한 결과값을 예측하는 머신러닝 모델을 만들게 된다면 어떤 모델이 더 좋은지 평가를 할 수 있어야 한다. 이러한 평가는 모델을 다 만든 후에만 하는 것이 아니라 모델을 선택하고 만드는 과정에서도 계속해서 사용하게 된다. 이러한 모델을 평가하는 방법 중 처음으로 분류 모델 중 가장 간단한 이진 분류 모델의 성능을 평가할 수 있는 몇 개의 지표들을 알아보자. 회귀와 다중 분류에 대한 평가 지표는 추후에 포스팅할 것이다.

 

1. 정확도 Accuracy

 정확도는 우리가 가장 이해하기 쉽고 가장 널리 쓰이는 평가 지표이다. 아마 머신러닝을 처음 접하는 사람들도 어떤 지표인지 알 수 있을 것이라 생각한다. 전체 예측한 data의 개수에 대한 옳게 예측한 data의 개수의 비율로 나타내며 0에서 1 사이의 값을 가진다. 당연히 1에 가까울수록 좋은 성능을 나타내는 모델이다.

 

 그렇다면 직관적으로 이해하기도 편하고 계산하기도 편리한 ‘정확도’라는 지표가 있는데 다른 지표들이 왜 필요할지 의문이 들 수 있을 것이다. 정확도로만은 성능을 잘 평가하지 못하는 경우가 있다는 것인데 그 상황으로 다음 2가지 상황을 들 수 있다.

 

정확도만을 사용할 수 없는 경우

  가. class의 비율이 다를 때

 이 경우는 예측해야 하는 값 0과 1의 개수가 다를 때를 말하는 것이다. 예를 들어 설명한다면 우리가 불량품을 1000개 중 1개 꼴로 만들어내는 기계가 만들어낸 물품의 불량품인지 검사를 하는 모델을 만든다고 생각해보자. 우리가 어떤 모델을 만들었는데 이 모델이 모든 물건에 대해 불량이 아니라고 예측하는 모델이라고 해보자. 정확도를 계산해본다면 우리는 1000개 중 1개를 불량품이지만 불량품이 아니라고 예측하게 되므로 무려 99.9%의 정확도를 가지게 된다. 이 모델은 정확도는 매우 높지만 우리가 만들고자 하는 모델은 아닐 것이다.

 

나. 각 class의 misclassification cost가 다를 때

 간단히 설명하면 1을 0으로 예측했을 때와 0을 1로 예측했을 때 손해가 다른 것이다. 예를 들어 질병 예측과 같은 상황을 들 수 있다. 어떤 위험한 병에 걸렸을지를 예측하는 경우를 생각해보자. 모델이 병에 걸리지 않았지만 병에 걸렸다고 예측한 경우에는 다른 검사를 해보는 등 조금 귀찮을 수는 있지만 아주 큰 일이 일어나지는 않는다. 하지만 반대로 모델이 병에 걸린 사람에게 병에 걸리지 않았다고 예측을 한다면 상황이 달라진다. 겨우 귀찮은 정도가 아니라 병이 더 악화될 수도 있고 만약 병에 전염력이 있다면 질병이 확산되거나 하는 등의 훨씬 위험한 상황이 펼쳐진다. 하지만 정확도만을 사용하게 된다면 이 두 경우를 동일하게 취급하게 되어 적합한 평가 지표가 아닐 것이다.

 

 먼저 설명의 편의성을 위해 오차 행렬(혼동 행렬, confusion matrix)을 먼저 설명하겠다. 오차 행렬은 모델이 예측한 값과 실제 값에 따라 각각 4개의 종류로 나누어 개수를 행렬(표)로 정리한 것이다. 두 개의 축에 각각 예측값(일반적으로 열), 실제값(일반적으로 행)을 나타내며 행과 열이라는 단어는 처음에 매우 헷갈리므로 표에 익숙해지는 것이 낫다고 생각한다. 바뀌어 나타나 있는 경우도 종종 있으므로 확인하는 습관을 가지는 것도 좋다.

 

 

예측값

Positive(1)

Negative(0)

실제 값

Positive(1)

True Positive(TP)

False Negative(FN)

Negative(0)

False Positive(FP)

True Negative(TN)

 

 positive에는 일반적으로 우리가 모델을 통해 찾고 싶어하는 class가 오며 0과 1 중에 1이 오는 경우가 많다. TP, FN, FP, TN에서 뒷글자를 결정하는 기준은 예측값이 기준이며 예측이 맞았는가를 기준으로 앞글자에 True와 False를 붙인다.

 이 방법으로 정확도를 나타내어 본다면 $\frac{\text{TP}+\text{TN}}{\text{TP}+\text{TN}+\text{FP}+\text{FN}}$으로 나타낼 수 있을 것이다.

 

2. 민감도 Sensitivity / Recall / Hit rate / True Positive rate

 민감도는 얼마나 우리가 예측하는 값을 빠뜨리지 않고 예측했는지를 나타내며 실제로 Positive인 것들 중 얼마나 많이 맞추었는가를 나타낸다. 식으로 나타내 본다면 $\frac{\text{TP}}{\text{TP}+\text{FN}}$으로 나타낼 수 있다. 민감도도 정확도와 같이 0에서 1 사이의 값을 가지며 1에 가까울수록 좋은 모델이다. 이러한 이야기는 다른 조건이 같을 때를 이야기하는 것으로 지표 하나만을 가지고 모델을 완벽하게 평가하기는 어렵다. 민감도가 크다는 것은 찾고자하는 것에 민감하다는 것으로 1을 빠뜨리지 않고 찾아내기 위해 FP가 커질 수 있다.

 

3. 특이도 Specificity / Selectivity / True Negative rate

 특이도는 0중에 얼마나 0을 예측했는지를 나타내며 식으로 나타내 본다면 $\frac{\text{TN}}{\text{TN}+\text{FP}}$로 나타낼 수 있다. 이 경우도 0과 1 사이의 값을 가지며 1에 가까울수록 좋은 모델이다.

 

4. 오경보율 False Alarm rate / False Positive rate

 오경보율은 우리가 찾고자 하는 것이 아닌 0에 대해 얼마나 1이라고 잘못 예측했는지를 나타내는 지표로 $1-\text{Specificity}$로도 표현할 수 있다. $\frac{\text{FP}}{\text{FP}+\text{TN}}$으로 표현 가능하다. 0과 1 사이의 값을 가지며 이 경우는 0에 가까울수록 좋은 모델이다. 민감도에서 설명했듯이 민감도가 커지면 FP가 커질 수 있으며 오경보율은 커지게 된다. 이 관계를 곡선으로 나타낸 것이 아래 서술할 ROC curve이다.

 

5. 정밀도 Precision

 정밀도는 모델이 찾은 1중에 실제로 얼마나 1이 존재하는지에 대한 지표이다. 식으로 나타내면 $\frac{\text{TP}}{\text{TP}+\text{FP}}$로 0에서 1 사이의 값을 가지고 1에 가까울수록 좋은 모델이다. 민감도가 커지면 정밀도가 작아질 수 있고 따라서 이 두 지표는 서로 보완적으로 작용할 수 있다.

 

6. F1 score

 F1 score는 서로 보완적으로 민감도와 정밀도 하나로 치우치지 않도록 한다. 따라서 F1 score는 민감도와 정밀도의 역수의 평균의 역수(조화평균)으로 나타내며 $2\times\frac{\text{Sensitivity}\times \text{Precision}}{\text{Sensitivity}+\text{Precision}}$로 표현할 수 있다. 이는 F score의 특수한 경우로 F score는 민감도에 대해 정밀도에 β만큼의 가중치를 주어 계산하게 된다. 식으로 나타내면 $(1+\beta^{2})\times\frac{\text{Sensitivity}\times \text{Precision}}{\beta^{2}\times \text{Sensitivity}+\text{Precision}}$로 계산한다.

 

 이 외에도 다양한 평가 지표들이 있겠지만 많이 사용하는 지표들을 알아보았다. 아래의 ROC curve와 AUC는 위의 내용과 약간 다른 지표로 따로 구분해놓았다.

 


 

7. ROC curve, AUC

 ROC curve는 간단하게 분류에 대한 성능 평가라기보다는 회귀처럼 어떤 값을 표현한 후 문턱값(threshold)를 기준으로 0과 1을 나누는 경우에 그 값이 얼마나 0과 1에 대해 잘 나눌 수 있는 값인지를 측정할 수 있다. 문턱값을 바꾸어 가면 각각의 지표들의 값이 변하게 되고 위에 나타낸 민감도와 오경보율도 바뀌게 된다. 문턱값을 바꿔가며 x축에 오경보율, y축에 민감도를 점으로 나타내 이어주면 곡선이 그려지게 된다. 민감도를 높이기 위해서는 1을 0으로 예측하지 않기 위해 문턱값을 낮추어야(문턱값 이상이 1으로 예측되는 경우) 하며 낮아진 문턱값에 의해 0이지만 1로 예측되는 경우(FP)가 늘어나고 오경보율도 늘어난다. 따라서 곡선은 오른쪽 위를 향하는 곡선을 나타내게 된다.

 

 설명의 편리성을 위해 0과 1 class 모두 정규분포를 따른다고 생각하자. 첫 번째 경우는 값에 따라 분리가 잘 된 경우로 민감도를 높이더라도 FP가 더 적게 늘어난다. 두 번째 경우는 분리가 잘 되지 않아 민감도를 높이기 위해 문턱값을 낮추게 되면 FP가 크게 늘어나 오경보율이 크게 늘어나게 된다.

분리가 잘 일어난 경우
분리가 잘 일어나지 않은 경우

 값에 의해 각 class가 잘 분류되었다면 문턱값을 낮추어도 FP가 덜 늘어나기 때문에 ROC curve가 왼쪽 위에 가까워지게 되고 무작위적으로 분류한 경우(잘 분류되지 못한 경우)에 민감도와 오경보율은 확률적으로 같은 양 늘어날 것이므로 오른쪽 위를 향하는 대각선에 ROC curve가 나타날 것이다.

출처 : https://newsight.tistory.com/53

 ROC curve를 정량적으로 비교하기 위한 방법으로 AUC라는 값을 사용할 수 있으며 ROC curve에 대한 AUC는 ROC curve 아래의 면적을 의미한다. 좋은 모델은 곡선이 왼쪽 위에 가까워지므로 큰 AUC 값을 가지게 되고 완벽히 분리해낼 수 있는 모델은 최대값인 1을 가질 수 있다. 위 그림에서 나타나있는 숫자는 AUC의 값이다.

 

Written by Xylene