<!doctype html>
2026년 7월 6일 | 개발 공부
Micro F1는 클래스별 점수를 먼저 평균내지 않고, 모든 예측 결과를 한 바구니에 넣은 뒤 precision과 recall을 다시 계산하는 방식이다. 나는 처음 이 지표를 볼 때 “전체 accuracy와 뭐가 다르지?”에서 한참 멈췄다. 둘 다 모델이 얼마나 맞혔는지 말하는 것처럼 보이고, 단일 라벨 다중 클래스 문제에서는 실제로 숫자가 똑같이 나오는 경우도 많다. 그래서 더 헷갈린다. 다른 지표인데 결과가 같으니, 둘 중 하나는 괜히 적은 값처럼 보인다.
왜 헷갈렸나
헷갈림의 출발점은 이름이다. F1이라고 하면 보통 precision, recall, 불균형 데이터, 양성 클래스 같은 단어가 같이 따라온다. 그런데 macro F1처럼 클래스별 F1을 따로 계산하는 방식과 달리, micro F1는 먼저 전체 true positive, false positive, false negative를 모두 합친다. 이 순간 “클래스별로 작은 클래스도 한 표씩 봐주겠다”는 감각이 사라진다. 오히려 샘플 수가 많은 클래스가 합계에 더 많이 들어온다. 그래서 micro라는 말이 “작은 클래스를 챙긴다”가 아니라 “개별 샘플 수준의 결정을 모두 합친다”에 가깝다는 점을 먼저 잡아야 했다.
내가 평가표를 읽을 때 제일 조심하는 부분도 여기다. macro F1가 내려갔는데 micro F1와 accuracy가 멀쩡하면, 모델이 전체 샘플 대부분은 맞혔지만 어떤 작은 클래스는 거의 놓쳤을 수 있다. 반대로 micro F1만 보고 “성능이 괜찮다”고 쓰면, 불균형 문제에서 가장 아픈 부분을 지나칠 수 있다. 이름이 비슷하다고 같은 질문에 답하는 지표가 아니다.
샘플을 한 줄로 펴면 보이는 것
단일 라벨 다중 클래스 분류에서는 샘플마다 정답 클래스가 하나이고, 모델도 예측 클래스를 하나만 낸다. 맞힌 샘플은 해당 클래스의 true positive 하나가 된다. 틀린 샘플은 정답 클래스 입장에서는 false negative 하나, 예측 클래스 입장에서는 false positive 하나가 된다. 중요한 점은 오답 하나가 전체 합계에서 FP와 FN을 한 개씩 동시에 만든다는 것이다.
그래서 모든 클래스를 합쳐 보면 전체 true positive는 맞힌 샘플 수와 같고, 전체 false positive와 false negative는 각각 틀린 샘플 수와 같다. Micro precision은 맞힌 샘플 수를 전체 예측 수로 나눈 값이 되고, Micro recall은 맞힌 샘플 수를 전체 정답 수로 나눈 값이 된다. 단일 라벨 문제에서는 전체 예측 수도 전체 정답 수도 샘플 수와 같으니, 둘 다 accuracy와 같은 값으로 떨어진다. 그 결과 Micro F1도 같은 숫자가 된다.
다중 클래스 단일 라벨에서는 왜 같아지나
예를 들어 100개 샘플 중 82개를 맞혔다면 accuracy는 82%다. 같은 결과를 클래스별 confusion matrix로 펼친 뒤 micro 방식으로 다시 접어도 전체 TP는 82개다. 나머지 18개 오답은 FP 18개와 FN 18개로 동시에 잡힌다. 따라서 micro precision은 82 / 100, micro recall도 82 / 100이 된다. F1 공식에 같은 값 두 개가 들어가면 결과도 82%다.
이 사실을 알고 나면 평가표에서 micro F1를 보는 태도가 조금 바뀐다. 단일 라벨 다중 클래스 문제에서 micro F1가 accuracy와 똑같다면, 그 자체가 이상한 게 아니다. 오히려 예상 가능한 결과다. 문제는 그 숫자가 너무 깔끔해서 모델이 어떤 클래스를 놓쳤는지 가리는 데 있다. 그래서 나는 이런 표에서는 micro F1를 핵심 주장으로 세우기보다, 전체 샘플 기준의 큰 온도계 정도로만 본다.
그래도 따로 적어야 하는 경우
그렇다고 Micro F1가 항상 쓸모없다는 뜻은 아니다. multi-label 문제에서는 샘플 하나가 여러 label을 동시에 가질 수 있고, 모델도 여러 label을 켜거나 끈다. 이때는 예측 label 수와 정답 label 수가 샘플 수와 같지 않다. threshold를 어디에 두느냐에 따라 FP와 FN도 다르게 움직인다. 이 경우 micro F1는 전체 label decision의 precision-recall 균형을 보여 주는 값이 된다.
또 하나는 데이터셋 여러 개나 subset 여러 개를 합쳐 볼 때다. 각 subset의 support가 다르면 단순 평균과 전체 합산의 의미가 달라진다. Micro F1는 큰 subset의 실패를 더 크게 반영한다. 이게 장점일 수도 있고 단점일 수도 있다. 운영 로그처럼 “전체 트래픽에서 틀린 비율”이 중요하면 micro가 자연스럽고, 작은 고객군이나 희귀 클래스 실패를 놓치면 안 되면 macro나 balanced accuracy를 같이 봐야 한다.
내가 표에 남기는 기준
요즘 평가표를 만들 때는 Micro F1를 적기 전에 먼저 문제 형태를 확인한다. 단일 라벨 다중 클래스라면 accuracy와 같은 값을 반복해서 보여 줄 가능성이 높다고 메모한다. 그다음 macro F1, balanced accuracy, class별 recall을 옆에 둔다. 특히 class support가 기울어진 표에서는 전체 성능과 작은 클래스의 손실을 분리해서 읽어야 한다.
보고서 문장도 이 기준에 맞춰 조금 바꾼다. “micro F1도 높았다”라고만 쓰면 좋아 보이는 숫자를 하나 더 얹은 느낌이 된다. 대신 “단일 라벨 설정이라 micro F1는 accuracy와 동일하게 해석된다”처럼 붙여 두면, 평가표를 읽는 사람이 괜한 차이를 찾느라 시간을 쓰지 않는다. 작은 주석이지만 나중에 실험을 다시 볼 때 꽤 큰 차이를 만든다. 특히 협업 문서에서는 이 주석 하나가 재현 질문을 줄인다. 같은 값이 나온 이유를 적어 두면, 누군가가 나중에 계산 오류라고 오해할 가능성도 줄어든다. 꽤 유용하다.
내 기준은 단순하다. Micro F1는 “모든 결정을 한꺼번에 접었을 때 얼마나 맞았나”를 보는 값이다. Accuracy와 겹치는 순간에는 그 겹침 자체를 설명하고, 겹치지 않는 설정에서는 왜 갈라졌는지 threshold, multi-label 구조, subset support를 확인한다. 숫자를 하나 더 추가하는 것보다, 그 숫자가 이미 있는 지표와 같은 질문을 반복하는지 먼저 보는 편이 평가표를 덜 어수선하게 만든다.
'[개발 공부]' 카테고리의 다른 글
| F-beta score: Precision과 Recall의 무게를 바꾸는 지표 (0) | 2026.07.13 |
|---|---|
| G-mean: 한쪽 Recall이 무너지면 함께 내려가는 분류 점수 (0) | 2026.07.10 |
| Macro F1: 클래스별 성능을 따로 평균낸 값 (0) | 2026.07.05 |
| Cohen's Kappa: 우연 일치가 만든 정확도 착시 (0) | 2026.07.03 |
| Balanced Accuracy: 다수 클래스 뒤의 실패율 (0) | 2026.07.03 |