2026년 7월 2일 | 개발 공부
Matthews Correlation Coefficient, 줄여서 MCC는 이진 분류의 confusion matrix 네 칸을 한꺼번에 읽는 평가 지표다. 정확도는 맞힌 샘플 비율을 빠르게 보여 주지만, 양성이 드문 데이터에서는 음성을 많이 맞힌 힘만으로 점수가 좋아 보일 수 있다. MCC는 true positive, true negative, false positive, false negative를 모두 식 안에 넣어서 한쪽 class만 잘 맞힌 모델을 쉽게 칭찬하지 않는 쪽에 가깝다.
정확도가 먼저 속이는 자리
불균형 분류에서 가장 흔한 착각은 accuracy가 너무 빨리 그럴듯해진다는 점이다. 양성이 5개, 음성이 95개인 데이터에서 모델이 양성을 거의 못 잡아도 음성만 많이 맞히면 90% 근처 숫자가 나온다. 보고서 표에서는 나쁘지 않아 보이지만, 실제로 필요한 양성 후보는 거의 빠져 있을 수 있다. 이럴 때 accuracy는 “틀린 양성 몇 개”를 전체 100개 속에 묻어 버린다.
MCC는 이 묻힘을 줄이려고 네 칸의 균형을 본다. 식으로 쓰면 분자는 TP×TN − FP×FN이고, 분모는 네 방향의 주변합을 곱한 뒤 제곱근을 취한다. 식 자체를 외우는 것보다 중요한 느낌은 단순하다. true positive와 true negative가 함께 좋아져야 점수가 올라가고, false positive와 false negative가 같이 늘면 점수가 내려간다. 그래서 한쪽 class에만 기대는 모델은 MCC에서 금방 힘이 빠진다.
네 칸을 모두 쓰는 상관계수
MCC는 이름처럼 예측 label과 실제 label 사이의 상관계수처럼 읽을 수 있다. 값은 보통 -1에서 1 사이에 놓인다. 1에 가까우면 두 label이 잘 맞고, 0 근처면 무작위와 크게 다르지 않으며, -1에 가까우면 거의 반대로 예측한다는 뜻이다. 이 범위 덕분에 accuracy, precision, recall처럼 0에서 1 사이로만 움직이는 지표와는 다른 경고를 준다.
예를 들어 음성 95개, 양성 5개인 작은 평가셋을 떠올려 보자. 어떤 모델은 TN 90, FP 5, FN 4, TP 1을 만들었다. accuracy는 0.91이지만 MCC는 대략 0.14에 그친다. 반대로 TN 82, FP 13, FN 1, TP 4인 모델은 accuracy가 0.86으로 낮아졌는데 MCC는 약 0.39로 더 낫다. 첫 모델은 대부분을 음성으로 밀어 accuracy를 얻었고, 두 번째 모델은 false positive 비용을 내면서도 양성을 훨씬 더 건졌다. MCC는 이 차이를 accuracy보다 덜 숨긴다.
이 예시에서 내가 일부러 보는 것은 “정확도가 내려갔는데도 더 나은 모델일 수 있다”는 불편한 장면이다. 운영 비용이 양성 누락 쪽에 더 크게 붙어 있다면 두 번째 모델이 더 현실적인 선택일 수 있다. 그래서 MCC를 볼 때는 숫자만 따로 떼지 않고, 그 숫자를 만든 네 칸의 count를 바로 옆에 둔다.
F1 score와 다르게 보는 부분
F1 score도 양성 class에 집중할 때 유용하다. precision과 recall의 조화평균이라서 “양성이라고 꺼낸 것의 품질”과 “실제 양성을 얼마나 건졌는지”를 한 숫자로 묶는다. 문제는 F1이 true negative를 직접 보지 않는다는 점이다. 양성 후보를 많이 다루는 검색, 결함 탐지, 의료 스크리닝에서는 이 선택이 오히려 장점일 때도 있지만, 전체 분류 균형까지 같이 말해야 하는 자리에서는 빠진 칸이 생긴다.
나는 그래서 F1과 MCC를 경쟁 지표처럼 놓지 않는다. 양성 후보를 실제로 사람이 열어 보는 작업이면 F1, precision-recall curve, average precision이 먼저 설명력이 좋다. 하지만 “이 모델이 전체 이진 결정을 균형 있게 하고 있나”를 묻는다면 MCC를 같이 붙인다. 특히 negative class도 의미가 있고 false positive 비용이 분명한 문제에서는 F1 하나로 좋은 모델이라고 말하기 전에 MCC를 한 번 더 본다.
운영 threshold를 고를 때의 메모
MCC는 threshold 하나를 정한 뒤 계산된다. score를 내는 모델이라면 threshold를 어디에 두느냐에 따라 TP, FP, FN, TN이 모두 바뀌고, MCC도 같이 움직인다. 그래서 threshold 탐색을 할 때 MCC curve를 같이 그려 보면 도움이 된다. 단순히 최고 MCC 지점을 고르는 것보다, precision-recall curve에서 acceptable한 구간 안에 그 지점이 들어오는지 같이 봐야 한다.
운영에서는 최고점 하나가 늘 답은 아니다. false negative가 훨씬 비싼 의료 스크리닝과 false positive가 사용자 경험을 망치는 알림 시스템은 같은 MCC 값이라도 선택이 달라질 수 있다. MCC는 네 칸의 균형을 잘 요약하지만, 비용 함수까지 대신 정해 주지는 않는다. 나는 실험표에 MCC를 넣을 때 threshold, positive rate, confusion matrix 네 숫자를 같이 적는다. 그래야 나중에 숫자 하나만 남아 “왜 이 모델을 골랐더라”가 되지 않는다.
내가 같이 남기는 지표들
불균형 데이터에서는 지표를 하나만 세우면 해석이 너무 빨라진다. MCC는 전체 균형을 보기에 좋고, precision-recall curve는 양성 후보의 ranking 품질을 보기에 좋다. Log loss나 reliability diagram은 score를 확률처럼 믿어도 되는지를 따로 묻는다. 같은 모델이 MCC는 좋아졌는데 calibration은 나빠질 수 있고, PR AUC는 좋아졌는데 특정 threshold의 MCC는 내려갈 수도 있다.
그래서 내 평가표의 최소 묶음은 조금 길어진다. Confusion matrix 네 칸, MCC, precision, recall, PR AUC, 그리고 score를 행동 기준으로 쓸 때는 calibration 지표까지 붙인다. 귀찮아 보여도 이 조합이 나중에 디버깅 시간을 줄여 줬다. 불균형 분류에서 좋은 점수는 “대체로 맞았다”가 아니라, 어떤 class를 희생했고 어떤 오류를 감수했는지까지 같이 말해야 한다. MCC는 그 질문을 시작하기 좋은 네 칸짜리 압축표다. 다음 실험을 고를 때도 이 네 칸을 먼저 열어 보면 판단이 조금 덜 흔들린다.
'[개발 공부]' 카테고리의 다른 글
| Cohen's Kappa: 우연 일치가 만든 정확도 착시 (0) | 2026.07.03 |
|---|---|
| Balanced Accuracy: 다수 클래스 뒤의 실패율 (0) | 2026.07.03 |
| Precision-Recall Curve: 희소 양성 데이터의 점수표 (0) | 2026.07.02 |
| Log loss: 틀린 확신의 비용 (0) | 2026.07.01 |
| Reliability diagram: 과신 구간을 눈으로 보는 표 (0) | 2026.06.30 |