f1-score 종류와 의미 (macro, weighted, micro)

2022. 10. 27. 23:37Statistics

scikit-learn 의 classification_report 는 분류 모델의 예측 성능을 평가하기 위해 널리 활용된다.

[그림1] classification_report 결과 예시

이진 분류일 때는 주로 소수의 클래스에 해당하는 precision, recall, f1-score 를 중요하게 본다. 
그래서 함께 표시되는 macro avg, weighted avg 값들에 크게 관심을 가지지 않았고, 특히 다중 분류의 경우 f1-score 가 정확히 어떻게 계산되는지 모르고 있었기에 이번 글에서 f1-score 의 종류와 의미에 대해 정리해보고자 한다. 
 
 


1. f1-score  종류와 의미

sklearn 공식 문서에 따르면, f1-score 의 종류에는 크게 3가지가 있으며 정의는 다음과 같다.

1. macro average: averaging the unweighted mean per label
2. weighted average: averaging the support-weighted mean per label
3. micro average: averaging the total true positives, false negatives and false positives

macro average 는 라벨별 f1-score를 산술평균한 것이고, weighted average 는 라벨별 f1-score를 샘플 수(support)의 비중에 따라 가중평균한 것이다. micro average는 전체 TP, FN, FP를 평균한 것이며 이것은 다중 분류에서 정확도와 같다고 기술되어 있다.
 
하지만 micro average 에 대한 설명은 쉽게 와닿지 않아서 관련 자료도 찾아보고, 직접 계산하면서 이해해보았다.
 

2. f1-score 의 계산 (다중 분류)

일단 3종류의 라벨을 가진 10개의 샘플 y_true (리스트)와 각 샘플에 대응하는 예측값 y_pred 가 있다고 가정한 뒤, 성능을 평가하기 위해 precision 과 recall 을 계산하고, 둘의 조화 평균인 f1-score 를 계산해보자.

y_true = ["A", "A", "B", "B", "B", "C", "C", "C", "C", "C"]
y_pred = ["A", "B", "A", "B", "C", "A", "B", "C", "C", "C"]

 
 
먼저, confusion matrix 를 그려보면 다음과 같다.
 

[그림2] confusion matrix (혼동행렬)

 
 
다음으로 confusion matrix 를 기반으로 각 라벨에 대한 precision, recall, f1-score 를 계산해보자.
 
A의 경우를 예로 들어보면, A를 A로 예측한 건수는 1개 (TP), A가 아닌 것을 A로 예측한 건수는 2개 (FP), A를 A가 아닌 것으로 예측한 경우는 1개 (FN) 이다. precision은 A로 예측한 건 중 실제 A인 건의 비율이므로 0.33, recall은 실제 A 중 A로 예측된 건의 비율이므로 0.5으로 계산된다. 이를 토대로 A에 대한 f1-score는 0.4임을 알 수 있다.
 

[그림3] 라벨별 분류 성능 (Precision, Recall, f1-score)

 [참고] precision = TP/(TP+FP), recall = TP/(TP+FN), f1-score = 2(precision x recall)/(precision+recall)
 
이제 macro, weighted, micro average f1-score 를 각각 계산해보자.
 
(1) macro average 는 단순히 A, B, C 라벨에 대한 f1-score 를 평균한 값이므로,
 
       f1-score (macro) = ( 0.4 + 0.33 + 0.67) / 3 = 0.47 이다.
 
 
(2) weighted average 는 A, B, C 라벨의 개수에 비례하게 가중치를 줘서 f1-score 를 평균한 값이므로,
 
      f1-score (weighted) = (0.4)*(0.2) + (0.33)*(0.3) + (0.67)*(0.5) = 0.51 이다. 
 
 
(3) micro average 는 전체 샘플에 대해 종합적으로 f1-score 를 계산한다.
 
      precision = 5 / (5+5) = 0.5
      recall = 5 / (5+5) = 0.5
      f1-score (micro) = 2*(0.5)*(0.5) / (0.5+0.5) = 0.5
 
 [그림1] 과 비교해보면 macro, weighted avg 와 값이 동일하고, accuracy 와 f1-score (micro) 의 값이 같음을 확인할 수 있다.
그 이유에 대해 아래에서 자세히 살펴보자.
 

3. micro average

 결론부터 말하면, 다중 분류에서 micro 평균을 적용한 recall, precision, accuracy 는 동일하다. (recall 과 precision 이 동일하므로 둘의 평균인 f1-score 도 동일한 값을 가진다.)
 
 해당 지표들이 동일한 값을 가지는 원인을 알아보기 위해 수식을 통해 확인해보자. 2.에서와 동일한 방식으로 계산하기 위해 표를 그려보면 아래와 같다.
 

[그림4] Confusion matrix 와 성능 지표 (TP, FP, FN)

 
Xij (i, j = 1, 2, 3) 는 실제 i를 j로 예측한 개수를 의미한다. 왼쪽의 혼동 행렬을 참고하여 각 라벨에 대한 TP, FP, FN 을 채우면 오른쪽과 같다. TP 는 해당 라벨을 옳게 예측한 개수로 X11, X22, X33 이다. FP 는 해당 라벨로 잘못 예측한 개수, FN 은 해당 라벨을 다른 라벨로 잘못 예측한 개수를 의미한다. 
 
micro average 성능 지표를 계산하기 위해 TP, FP, FN 각각의 총합을 계산해보면 TP 의 총합은 X11+X22+X33 이고, FP, FN 의 총합은 표의 나머지 값들을 다 더한 값(X21+X32+X13+X31+X12+X23) 으로 같다. FP 와 FN 의 총합이 같으므로 precision과 recall은 동일하다. 또한, TP+FP 및 TP+FN 이 전체 모수를 나타내므로 precision, recall 과 accuracy 가 동일한 값을 가지게 된다. 그러므로 classification report 를 출력했을 때 micro avg 가 아닌 accuracy 하나의 값만 표현되는 것이라고 한다.
 


 라벨의 중요도에 따라 어떤 지표를 선택할지가 달라진다. 모든 라벨이 유사한 중요도를 가진다면 macro average 값을 참고하고, 샘플이 많은 라벨에 중요도를 두고 싶다면 weighted average 값을 참고하면 된다. 그리고 라벨에 상관없이 전체적인 성능을 평가하고 싶을 때는 micro average, 즉 accuracy 를 활용하면 된다.
 

4. 참고

 
[1] https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html
[2] https://towardsdatascience.com/micro-macro-weighted-averages-of-f1-score-clearly-explained-b603420b292f