10.3 정확도와 혼동행렬¶
정확도와 기준선¶
정확도(accuracy)는 전체 예측 중 맞힌 예측의 비율이다. 10.1절에서 확인한 대로 이 자료는 무강수가 약 70%이므로, 항상 0을 출력하는 기준선 모델과 함께 비교한다.
from sklearn.metrics import accuracy_score, confusion_matrix, recall_score, precision_score
p = clf.predict(test[feats])
print("정확도", round(accuracy_score(test["target_rain"], p), 3))
print("기준선", round((test["target_rain"] == 0).mean(), 3))
print(confusion_matrix(test["target_rain"], p))
print("재현율", round(recall_score(test["target_rain"], p), 3))
print("정밀도", round(precision_score(test["target_rain"], p), 3))
실행 결과
결정트리의 정확도는 0.706, 항상 "비 안 옴"으로 예측하는 기준선은 0.703이다. 정확도만 비교하면 결정트리의 개선은 0.003에 불과하다.
혼동행렬¶
혼동행렬(confusion matrix)은 실제 범주와 예측 범주의 조합별 건수를 표로 정리한 것이다. scikit-learn의 출력은 행이 실제값, 열이 예측값이다.
| 예측 0(무강수) | 예측 1(강수) | |
|---|---|---|
| 실제 0(무강수) | 226 (참음성, TN) | 30 (거짓양성, FP: 오경보) |
| 실제 1(강수) | 77 (거짓음성, FN: 미검출) | 31 (참양성, TP) |
2025년의 실제 강수일 108일(77 + 31) 중 모델이 강수로 예측한 날은 31일뿐이다. 나머지 77일은 비가 왔는데도 "비 안 옴"으로 예측한 미검출이다.
재현율과 정밀도¶
| 지표 | 공식 | 값 | 의미 |
|---|---|---|---|
| 재현율(recall) | TP ÷ (TP + FN) | 31 ÷ 108 = 0.287 | 실제 강수일 중 모델이 검출한 비율 |
| 정밀도(precision) | TP ÷ (TP + FP) | 31 ÷ 61 = 0.508 | 모델이 강수로 예측한 날 중 실제 강수일의 비율 |
재현율 0.287은 실제 강수일 10일 중 약 3일만 검출한다는 의미다. 우산을 챙기라는 알림이 목적이라면 미검출 1건의 손실이 오경보 1건보다 크므로, 이 모델은 정확도가 기준선보다 높아도 목적에 적합하지 않다. 분류 모델은 정확도와 함께 혼동행렬과 재현율·정밀도를 확인해야 실제 성능을 판정할 수 있다.
확인 문제¶
- 기준선 모델(항상 0 출력)의 재현율을 계산하시오.
- 7장의 소음 경고 프로그램에서 오경보와 미검출 중 어느 쪽을 더 줄여야 하는지, 작업장 상황을 가정해 설명하시오.