2026년 7월 3일 | 개발 공부
Balanced Accuracy는 class 비율이 기울어진 분류 문제에서 각 class의 recall을 먼저 계산한 뒤 평균으로 접는 평가 지표다. 나는 불균형 데이터의 baseline을 볼 때 accuracy 숫자가 너무 멀쩡하면 오히려 한 번 멈춘다. 전체 표본의 90%가 음성인 데이터에서는 모델이 전부 음성이라고만 말해도 accuracy 90%가 나온다. 숫자만 보면 꽤 괜찮아 보이지만, 양성 class를 찾는 일은 완전히 실패한 상태다.
accuracy가 높아도 실패가 숨는 장면
불균형 분류에서는 전체 accuracy가 다수 class를 얼마나 잘 따라갔는지에 끌려가기 쉽다. 예를 들어 장애 탐지, 사기 거래 탐지, 희귀 질환 후보 선별처럼 양성이 드문 문제를 생각하면, 음성을 많이 맞힌 사실만으로 평가표가 반짝일 수 있다. 하지만 실제 운영 질문은 보통 “양성을 얼마나 찾았나”와 “정상 케이스를 얼마나 덜 괴롭혔나”를 동시에 묻는다.
Balanced Accuracy는 이때 accuracy를 class 비율에서 잠깐 떼어 놓는다. 이진 분류라면 sensitivity, 즉 양성 recall과 specificity, 즉 음성 recall을 각각 계산한 뒤 평균한다. 전부 음성으로 찍은 모델은 음성 recall 100%를 얻지만 양성 recall 0%가 되므로 balanced accuracy는 50% 근처로 내려앉는다. 무릎을 칠 만큼 복잡한 지표는 아니지만, 그래서 더 자주 도움이 된다.
공식은 macro recall에 가깝다
이진 분류에서 balanced accuracy는 보통 (TPR + TNR) / 2로 적는다. TPR은 true positive rate, TNR은 true negative rate다. 다중 class 문제로 가면 class마다 recall을 구한 뒤 평균하는 macro recall과 거의 같은 감각으로 읽을 수 있다. class별 표본 수가 달라도 각 class에게 같은 한 표를 주는 셈이다.
이 방식의 장점은 해석이 빠르다는 데 있다. class A가 10만 건이고 class B가 500건이어도, B의 recall이 20%라면 평균에 그대로 반영된다. 반대로 단점도 분명하다. class별 중요도가 실제로 같지 않은 문제에서는 단순 평균이 비즈니스 비용을 그대로 대변하지 않는다. 그래서 balanced accuracy는 최종 의사결정 점수라기보다, accuracy가 너무 낙관적으로 보이는지 확인하는 첫 번째 경고등에 가깝다.
MCC와 F1 옆에서 다르게 보이는 것
지난번에 정리한 Matthews Correlation Coefficient(MCC)는 confusion matrix 네 칸을 모두 써서 예측 label과 실제 label의 상관을 본다. F1 score는 precision과 recall을 묶어 양성 class 중심의 검색 품질을 본다. Balanced Accuracy는 이 둘 사이에서 “class별 회수율이 한쪽으로 무너지지 않았나”를 간단히 확인한다.
나는 세 지표를 한 줄에 같이 둘 때가 많다. F1이 높은데 balanced accuracy가 낮으면 양성 후보 상위권은 괜찮지만 특정 class recall이 무너졌을 가능성을 본다. Balanced accuracy는 괜찮은데 MCC가 낮으면 false positive와 false negative 조합이 전체 상관을 흔드는지 본다. 한 숫자가 다른 숫자를 대체한다기보다, 각 지표가 묻는 질문을 분리해 놓으면 디버깅이 덜 감정적이 된다.
threshold를 고르면 다시 흔들린다
확률이나 score를 내는 모델에서 balanced accuracy는 threshold에 민감하다. threshold를 낮추면 양성 recall은 올라가지만 음성 recall은 내려갈 수 있다. threshold를 높이면 반대가 된다. 그래서 최고 balanced accuracy가 나온 threshold를 그대로 운영 기준으로 가져오는 것은 조심스럽다. 그 threshold가 validation set에서 고른 값인지, test set에서 뒤늦게 찾은 값인지에 따라 의미가 완전히 달라진다.
운영에서는 threshold 선택 과정을 지표 옆에 꼭 붙여야 한다. validation에서 고른 threshold를 test에 그대로 적용했는지, class prior가 바뀐 데이터에도 같은 기준을 쓸 수 있는지, 특정 class의 false negative 비용이 더 큰지까지 같이 봐야 한다. Balanced accuracy는 class 비율 왜곡을 줄여 주지만, 비용 함수와 calibration 문제를 자동으로 해결해 주지는 않는다.
기록에 같이 남길 항목
실험 노트에는 balanced accuracy만 단독으로 쓰지 않는 편이 낫다. 최소한 class별 support, class별 recall, 전체 accuracy, confusion matrix 네 칸을 같이 적어야 한다. 다중 class라면 class별 recall 표를 함께 남겨야 평균 뒤에 어떤 class가 숨어 있는지 바로 보인다. 숫자 하나만 붙이면 다음날 다시 열었을 때 “왜 좋아졌지?”를 또 묻게 된다.
내 기준의 짧은 체크리스트는 이렇다. 첫째, class 비율을 먼저 쓴다. 둘째, balanced accuracy 옆에 minority class recall을 따로 쓴다. 셋째, threshold를 어떻게 골랐는지 남긴다. 넷째, MCC나 PR curve처럼 다른 지표와 충돌하는 지점을 표시한다. 이 정도만 남겨도 불균형 분류 결과표를 볼 때 accuracy 90%라는 편한 숫자에 덜 끌려간다.
하나 더 붙이면, 이 지표는 모델이 좋아졌다는 주장보다 데이터 구성이 바뀌었는지 확인할 때도 쓸 만하다. 새 배치에서 양성 비율이 줄었는데 accuracy만 유지됐다면 좋은 소식처럼 보일 수 있다. 하지만 balanced accuracy가 같이 내려가면, class prior 변화 뒤에 minority class recall 손실이 숨어 있는지 먼저 의심해야 한다.
Balanced Accuracy는 화려한 지표는 아니다. 대신 baseline 표에서 다수 class가 만든 착시를 빠르게 걷어 내 준다. 특히 모델을 개선했다는 주장보다 실패 class를 먼저 찾아야 하는 작업에서는, 이 단순한 평균 하나가 다음 실험을 어디서 시작할지 꽤 분명하게 만들어 준다.
'[개발 공부]' 카테고리의 다른 글
| Macro F1: 클래스별 성능을 따로 평균낸 값 (0) | 2026.07.05 |
|---|---|
| Cohen's Kappa: 우연 일치가 만든 정확도 착시 (0) | 2026.07.03 |
| Matthews Correlation Coefficient: 불균형 분류의 네 칸 점수 (0) | 2026.07.02 |
| Precision-Recall Curve: 희소 양성 데이터의 점수표 (0) | 2026.07.02 |
| Log loss: 틀린 확신의 비용 (0) | 2026.07.01 |