빅데이터분석기사 혼동행렬: 정밀도·재현율·F1 계산과 분모 구분
양성 클래스와 실제·예측 축을 먼저 정하고 TP·FP·FN·TN으로 정밀도, 재현율, F1, 정확도를 계산합니다.
정밀도는 양성으로 예측한 것 중 실제 양성의 비율 이고, 재현율은 실제 양성 중 찾아낸 비율 입니다. F1은 두 값의 조화평균 이에요. 계산에 앞서 무엇을 양성으로 보는지, 표의 행·열 중 어느 쪽이 실제값인지 정해야 해요.
양성은 ‘좋은 결과’라는 뜻이 아니에요
스팸 탐지에서 스팸을 양성(1), 정상 메일을 음성(0)으로 정할게요. ‘양성’은 탐지 대상으로 정한 클래스라는 뜻이며 좋은 상태라는 뜻은 아니에요. 이 글의 표는 행이 실제값, 열이 예측값이에요.
| 실제값 ↓ / 예측값 → | 스팸으로 예측: 양성 | 정상으로 예측: 음성 |
|---|---|---|
| 실제 스팸: 양성 | TP: 스팸을 스팸으로 맞힘 | FN: 스팸을 정상으로 놓침 |
| 실제 정상: 음성 | FP: 정상을 스팸으로 잘못 분류 | TN: 정상을 정상으로 맞힘 |
T·F는 예측이 맞았는지, P·N은 예측을 양성·음성 중 무엇으로 했는지를 나타내요. 따라서 FP는 실제 양성이 아니라 양성으로 잘못 예측한 것이에요.
교재나 도구에 따라 축과 클래스 순서를 바꿔 그리기도 해요. scikit-learn의 혼동행렬은 행이 실제값, 열이 예측값이지만, 클래스 순서를 [0, 1]로 놓으면 왼쪽 위가 TN이에요. 이 글은 설명을 위해 양성 행·열을 먼저 놓았어요. 왼쪽 위는 항상 TP라는 식으로 위치를 외우지 마세요.
같은 TP라도 분모가 달라요
| 지표 | 식 | 분모의 의미 | 주로 보는 오류 |
|---|---|---|---|
| 정밀도 Precision | 양성으로 예측한 전체 | 잘못 울린 경보 FP | |
| 재현율 Recall | 실제 양성 전체 | 놓친 양성 FN | |
| F1 | TP·FP·FN을 함께 반영 | 정밀도·재현율의 균형 | |
| 정확도 Accuracy | 평가한 전체 | 전체 예측의 맞고 틀림 |
정밀도는 ‘스팸함에 들어간 메일을 믿을 수 있나?’, 재현율은 ‘실제 스팸을 얼마나 찾아냈나?’라는 질문이에요. 정상 메일이 스팸함에 들어가는 비용과 스팸을 놓치는 비용은 다를 수 있으므로, 지표의 크기만 보고 목적을 정하지 않아요.
F1은 산술평균이 아니에요. 정밀도를 , 재현율을 라고 하면 두 값의 조화평균으로 계산해요.
계산 예제: 메일 100개의 분류 결과
아래 수치와 상황은 새로 만든 학습용 예제이며 실제 기출문제가 아닙니다. 스팸을 양성으로 두고 메일 100개를 평가한 결과가 다음과 같다고 할게요.
| 실제값 ↓ / 예측값 → | 스팸으로 예측 | 정상으로 예측 | 실제값 합계 |
|---|---|---|---|
| 실제 스팸 | TP = 30 | FN = 20 | 50 |
| 실제 정상 | FP = 10 | TN = 40 | 50 |
| 예측값 합계 | 40 | 60 | 100 |
- 정밀도: 스팸으로 예측한 40개 중 30개가 실제 스팸이므로 예요.
- 재현율: 실제 스팸 50개 중 30개를 찾았으므로 이에요.
- F1: 이에요.
- 정확도: 전체 100개 중 TP 30개와 TN 40개를 맞혀 이에요.
정밀도와 재현율을 더해 2로 나눈 0.675는 이 예제의 F1이 아니에요. F1을 백분율로 표현한다면 약 66.67%이며, 0.6667과 66.67을 같은 단위로 비교하지 않도록 표시해요.
양성 클래스를 바꾸면 같은 표의 지표도 바뀌어요
위 예제에서 정상을 양성으로 다시 정의하면 새 TP는 40, FP는 20, FN은 10, TN은 30이에요. 따라서 정상 클래스의 정밀도는 , 재현율은 , F1은 이 돼요. 전체 정확도는 여전히 0.70이에요.
어느 결과가 계산 오류인 것이 아니라 평가한 클래스가 달라진 것이에요. scikit-learn에서 이진 분류의 양성 클래스 지표를 구할 때는 pos_label과 average 설정을 함께 확인해야 해요.
F1 하나만으로 판단하기 어려운 경우
- TN도 중요한 경우: 양성 클래스 F1 식에는 TN이 직접 들어가지 않아요. 혼동행렬 전체와 업무상 오류 비용을 함께 봐요.
- 클래스가 불균형한 경우: 정상 메일이 압도적으로 많다면 모두 정상이라고 예측해도 정확도는 높을 수 있어요. 실제 스팸을 찾는 능력과 구분해야 해요.
- 분모가 0인 경우: 양성 예측이 하나도 없으면 정밀도, 실제 양성이 하나도 없으면 재현율이 정의되지 않아요. 무조건 0이나 1로 정하지 말고 문제의 지시나 도구의 zero_division 설정을 확인해요.
- 여러 클래스의 결과를 합치는 경우: macro F1은 클래스별 F1의 단순평균, weighted F1은 실제 클래스별 표본 수로 가중한 평균이에요. micro는 클래스별 TP·FP·FN을 먼저 합산해 계산해요. 평균 정밀도와 평균 재현율을 다시 조화평균한 값이 macro F1이라고 가정하지 않아요.
예측 점수의 임계값을 바꾸면 같은 데이터에서도 TP·FP·FN·TN이 달라질 수 있어요. 모형을 비교할 때는 양성 클래스, 평가 데이터, 임계값과 평균 방식을 함께 적어야 숫자의 의미를 비교할 수 있어요.
다음 문제에서는 분모를 말로 읽어요
기사GG 빅데이터분석기사 수록 기출에서 평가 지표를 묻는 문항을 만나면 양성 클래스와 행·열을 먼저 표시하세요. 그런 다음 정밀도의 분모를 ‘예측 양성 전체’, 재현율의 분모를 ‘실제 양성 전체’라고 읽어보세요. 이 글의 예제는 특정 회차·문항을 인용한 것이 아니에요.
정의·축 방향·평균 방식·분모가 0일 때의 처리는 scikit-learn 공식 문서를 2026년 10월 31일에 확인해 정리했어요.