분류 평가의 macro와 micro 평균, 클래스별 점수를 합치는 방법

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 31회 작성일 26-10-01 07:17

본문

분류 모델의 평가표에 F1 점수가 여러 줄로 나오면 어느 숫자를 비교해야 하는지 혼란스러울 수 있습니다. macro와 micro는 서로 다른 모델 종류가 아니라 여러 클래스의 평가 결과를 합치는 방식입니다.

같은 정답과 예측을 넣어도 합치는 순서가 다르면 숫자가 달라질 수 있습니다. 따라서 점수의 크기만 보기 전에 무엇을 동등하게 취급하고 무엇을 모아 계산하는지 이해해야 합니다.

이 글은 scikit-learn의 분류 평가 정의를 바탕으로 macro, micro, weighted 평균을 구분합니다. 예시는 표본 가중치를 사용하지 않는 단일 라벨 분류를 중심으로 설명하며 실제 데이터나 특정 모델의 성능을 보고한 결과는 아닙니다.

분류 평가의 macro와 micro 평균, 클래스별 점수를 합치는 방법 관련 설명용 삽화

AI 생성 삽화 · 개념 이해를 위한 AI 연출 이미지이며 실제 시스템 구성도나 측정 결과가 아닙니다.

핵심 정리
macro는 클래스별 점수를 같은 비중으로 평균내고, micro는 클래스들의 TP·FP·FN을 먼저 합쳐 점수를 계산합니다. weighted는 클래스별 점수를 정답 표본 수로 가중하므로 micro와 같은 연산이 아닙니다.


1. 먼저 클래스별 평가와 평균을 구분합니다

각 클래스를 평가할 때는 그 클래스를 맞힌 경우와 잘못 예측한 경우를 나누어 볼 수 있습니다. TP는 해당 클래스를 올바르게 예측한 수, FP는 다른 클래스를 해당 클래스로 예측한 수, FN은 해당 클래스인 것을 다른 것으로 예측한 수입니다.

F1은 이 수들을 사용해 2TP를 2TP+FP+FN으로 나눈 값으로 표현할 수 있습니다. 여러 클래스에서 각각 계산한 F1을 어떻게 하나로 만들지가 평균 방식의 질문입니다.

F1과 평균 종류를 분리해 생각하면 precision이나 recall에도 같은 평균 선택이 나타나는 이유를 이해하기 쉽습니다. 평가할 클래스 목록이 바뀌면 평균 대상도 달라질 수 있으므로 먼저 포함할 라벨을 정리합니다.

단순히 F1이라고만 적힌 보고서는 어느 평균인지 정보가 부족합니다. 점수 이름 옆에 average 설정과 평가 대상을 함께 기록하는 습관이 필요합니다.

관련 공식 문서


2. macro는 각 클래스를 한 표씩 반영합니다

macro 평균은 클래스마다 계산한 지표를 같은 비중으로 평균냅니다. 어떤 클래스의 정답 표본이 많더라도 그 클래스의 점수 자체에 더 큰 비중을 주지는 않습니다.

따라서 표본이 적은 클래스의 성능을 평균에서 살펴보려는 목적에 유용할 수 있지만, 표본 부족으로 점수가 불안정한 문제까지 해결하는 것은 아닙니다. 한두 건의 예측 변화가 작은 클래스의 점수에 크게 영향을 줄 수 있으므로 클래스별 표본 수도 함께 봅니다.

macro F1을 계산할 때는 각 클래스의 F1을 구한 뒤 평균내야 합니다. 평균 precision과 평균 recall을 먼저 구해 그 둘의 조화평균을 내는 것은 일반적으로 다른 계산입니다.

점수를 직접 구현하거나 스프레드시트로 검증할 때 합치는 순서를 적어 두면 이 차이를 놓치기 어렵습니다. 평균 한 줄을 보기 전에 어느 클래스에서 낮은 값이 나왔는지도 확인합니다.

관련 공식 문서


3. micro는 오류 수를 모은 뒤 계산합니다

micro는 클래스별 TP, FP, FN을 각각 합쳐 전체 집계값으로 지표를 계산합니다. 클래스별 점수의 단순평균을 구하는 방식이 아니므로 macro와 결과가 달라도 계산 오류라고 단정하지 않습니다.

모든 클래스를 포함하는 단일 라벨 다중 클래스 분류에서 표본 가중치를 쓰지 않는 경우 micro F1은 accuracy와 같아집니다. 하지만 일부 라벨만 평가하거나 다중 라벨 문제를 다루면 그 관계를 그대로 적용할 수 없습니다.

평가 대상을 줄이고도 이전 보고서와 같은 지표라고 표시하면 비교 조건이 달라졌다는 사실을 놓칠 수 있습니다. 전체 예측의 집계 관점과 각 클래스의 관점을 함께 확인하려면 micro와 클래스별 결과를 나란히 기록할 수 있습니다.

큰 숫자 하나가 서비스의 모든 오류를 충분히 설명하지는 않으므로 어떤 종류의 실수가 중요한지는 별도 업무 기준으로 정합니다.

관련 공식 문서


4. 간단한 가상 예시로 차이를 계산합니다

정답이 A인 표본 90개와 B인 표본 10개가 있고 모델이 100개를 모두 A로 예측했다고 가정합니다. A의 TP는 90, FP는 10, FN은 0이므로 A의 F1은 180/190으로 약 0.947입니다.

B는 TP가 0이고 FN이 10이므로 F1이 0입니다. 두 클래스의 macro F1은 이 두 값을 평균낸 약 0.474가 됩니다.

micro에서는 TP 합이 90, FP 합이 10, FN 합이 10이므로 F1은 180/200인 0.9입니다. 두 숫자는 같은 예측을 다른 방식으로 요약한 결과입니다.

0.9만 보면 높은 성능처럼 느낄 수 있지만 이 예시에서는 B를 한 건도 맞히지 못했습니다. 반대로 macro 값만으로 전체 오류 건수를 바로 알 수도 없습니다.

실제 보고에서는 계산 조건과 클래스별 결과를 함께 제시해야 숫자가 무엇을 의미하는지 독자가 판단할 수 있습니다.


5. weighted와 계산 불가능한 항목을 구분합니다

weighted 평균은 클래스별 점수를 정답 표본 수인 support에 따라 가중합니다. 앞 예시의 weighted F1은 A 점수에 0.9, B 점수에 0.1을 곱해 더한 약 0.853입니다.

micro F1인 0.9와 다른 것을 직접 확인할 수 있습니다. 어느 평균이 항상 더 높거나 더 적절하다고 정하기보다 평가 목적과 데이터 구성을 기준으로 선택합니다.

한편 어떤 클래스가 한 번도 예측되지 않으면 precision처럼 분모가 0이 되는 지표가 생길 수 있습니다. scikit-learn의 zero_division 설정은 이런 경우의 반환값과 경고 처리에 영향을 줍니다.

표시된 0이 일반적인 계산 결과인지 설정에 따른 처리인지도 확인해야 합니다. 앞 예시에서 B의 F1이 0인 것과 B의 precision 분모가 0인 것은 같은 설명이 아닙니다.

평가 코드와 함께 관련 옵션을 기록하면 결과를 재현할 때 해석 차이를 줄일 수 있습니다.

관련 공식 문서


6. 평가표에는 평균 외에 비교 조건을 남깁니다

classification_report는 클래스별 precision, recall, F1과 support를 살펴보는 데 사용할 수 있습니다. 평균 점수만 복사하기보다 라벨 이름과 순서가 맞는지, 비교하는 두 실행의 평가 데이터가 같은지 확인합니다.

혼동행렬을 함께 보면 실제 클래스가 어느 클래스로 예측됐는지 살펴볼 수 있습니다. 정규화된 비율인지 원래 건수인지도 구분해 적습니다.

작은 실습에서는 먼저 몇 개의 정답과 예측을 손으로 세고 함수 결과와 대조하는 방식이 도움이 됩니다. 운영 평가에서는 평가셋 버전, 라벨 목록, 평균 종류, zero_division과 표본 가중치 사용 여부를 기록할 수 있습니다.

점수가 좋아졌더라도 특정 중요 클래스가 악화됐는지 별도로 검토합니다. 평균 방식을 바꿔 높은 숫자를 얻는 것과 실제 모델 예측이 개선되는 것은 다른 일입니다.

비교 목적을 정한 뒤 같은 조건의 지표를 지속적으로 사용하는 것이 좋습니다.

관련 공식 문서


7. 자주 묻는 질문

Q1. macro F1은 precision 평균과 recall 평균으로 계산하나요?

클래스별 F1을 먼저 계산한 뒤 같은 비중으로 평균냅니다. 평균 precision과 평균 recall로 F1을 만드는 계산과는 일반적으로 다릅니다.

Q2. micro와 weighted는 같은 뜻인가요?

micro는 TP·FP·FN을 모아서 지표를 계산하고 weighted는 클래스별 지표를 support로 가중합니다. 같은 예측에서도 값이 다를 수 있습니다.

Q3. micro F1은 언제나 정확도와 같나요?

모든 클래스를 포함한 단일 라벨 분류라는 조건 등을 확인해야 합니다. 일부 라벨 평가나 다중 라벨 문제에는 같은 관계를 무조건 적용하지 않습니다.

Q4. 평균이 높으면 소수 클래스도 잘 맞히나요?

평균만으로는 특정 클래스의 성능을 확정할 수 없습니다. 클래스별 지표와 support, 혼동행렬을 함께 확인합니다.


참고 자료

댓글목록

등록된 댓글이 없습니다.