콘텐츠로 이동

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
[[226  30]
 [ 77  31]]
재현율 0.287
정밀도 0.508

결정트리의 정확도는 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건보다 크므로, 이 모델은 정확도가 기준선보다 높아도 목적에 적합하지 않다. 분류 모델은 정확도와 함께 혼동행렬과 재현율·정밀도를 확인해야 실제 성능을 판정할 수 있다.

확인 문제

  1. 기준선 모델(항상 0 출력)의 재현율을 계산하시오.
  2. 7장의 소음 경고 프로그램에서 오경보와 미검출 중 어느 쪽을 더 줄여야 하는지, 작업장 상황을 가정해 설명하시오.