본문 바로가기

Python

Confusion Matrix(혼동행렬) 생성 : MNIST로 생성한 모델 예측결과 판단

Confusion Matrix : 혼동행렬


모델의 정확도(accuracy)를 보는 것도 좋지만 어떤 것을 맞게 판단했고 틀리게 했는지 확인해 보는 것도 중요하다. MNIST 손글씨 이미지 분류 모델 생성에서 가장 accuracy가 높았던 5번째 모델을 사용하여 혼동행렬을 만들어 보자.

 


▷ MNIST 이미지 분류 모델 model05 만들기 참고

 

MNIST 손글씨 이미지 분류

MNIST 손글씨 이미지 분류 import tensorflow as tf from PIL import Image import matplotlib.pyplot as plt # mnist 손글씨 이미지 데이터 불러오기 (x_train, y_train), (x_test, y_test) = \ tf.keras.dataset..

codeworld.tistory.com



Confusion Matrix 생성


숫자 0과 1이 그려져 있는 이미지 검증데이터 (x_test2)를 model05에 넣고 예측확률값을 얻고 혼동행렬을 만들어 보기

from sklearn.metrics import *

prob = model05.predict(x_test2)
y_pred = np.where(prob > 0.5, 1, 0) # 확률이 50%를 넘으면 1, 아니면 0
confusion_matrix(y_test2, y_pred)
67/67 [==============================] - 0s 1ms/step
array([[ 978,    2],
       [   0, 1135]], dtype=int64)



[혼동행렬 구조]

① 잘 예측한 경우 = 음성인데 음성으로 맞춤(978) + 양성인데 양성으로 맞춤(1135)
② 틀린 예측의 경우 = 음성인데 양성으로 예측(2) + 양성인데 음성으로 예측(0)


☑️ 정확도 (Accuracy) : 전체 예측 중에 예측이 맞은 비율

 

☑️ 정밀도 (Precision) : 양성 예측 중 맞은 비율


• 양성 예측이 중요한 경우 (예 : 채용)
• 대체로 문턱값(threshold)을 높이면(보수적 예측) 정밀도가 높아짐

• 정밀도 = 1135 / (2 + 1135)

☑️ 재현도 or 민감도 (Recall) : 실제 양성 중 맞은 비율


• 양성을 찾아 내는 것이 중요한 경우 (예: 방역)
• 의학 등에서는 민감도(specificity)라고도 함
• 대체로 문턱값을 낮추면(적극적 예측) 재현도가 높아진다.

• 중국의 경우가 재현도를 문턱까지 낮추 경우로 너무 낮추면 정밀도가 떨어져서 음성인 사람도 잡히는 문제가 있음


☑️ 특이도 (Specificity) : 실제 음성 중 찾아낸 비율

 


• 음성을 찾아 내는 것이 중요한 경우 (예: 방역)
• 대체로 양성 예측을 보수적으로 하면 특이도가 높아진다



➡️ 신속항원검사의 특이도가 PCR법보다 낮은 96%이므로, 특이도는 실제로 음성을 잘 찾아낸 비율로 4% 틀릴 수 있음을 말하고 있음

☑️ F1 : 정밀도(p)와 재현도(r)의 조화 평균


• 조화평균 : 역수의 평균의 역수
• 비율, 속도 등을 평균낼 때는 산술평균 대신 조화평균을 사용

• 양성을 양성으로 맞추는 것이 중요하기 때문에 이것을 합해서 F1이라는 지수로 표현해서 사용



[재정리 설명]

 


* Accuracy : (TN + TP) / N → 많이 맞추면 OK
* Precision : TP / (TP + FP) → 1로 예측시 action을 취함
* Recall : TP / (FN + TP) → 1인 경우를 잘 찾는 지표로 사용

경보기가 작은 신호에도 잘 반응하는 것은 Recall(재현도 or 민감도, 양성을 실제로 잘 찾아내는 확률)가 높다는 의미이다. 그런데 실제로 불이 나지 않았는데도 경보기가 계속 울린다면 Precision이 낮은 경우가 된다. 사람들이 액션을 취하는 데는 Precision(정밀도, 불이 났다고 예측한 알람을 보내는 신호들이 맞을 확률)이 높아야 하는데, 정밀도가 낮으면 사람들이 알람 신호를 믿지 않게 된다. 경보기가 가짜로 자주 울리면 사람들이 해제하는 것이 귀찮아서 경보기를 끄게되는 일까지 발생하게 된다. 이런 경우에 큰 손실을 입게 될 수도 있는 것이다. Recall 민감도가 높다고 확인 안하고 그대로 두면 안전문제에 큰 영향이 된다. 안전 관련 사항은 항상 초기 기준은 Recall값으로 놓고, Precision을 지속적으로 높여가야 신뢰성을 얻을 수가 있게 된다. 만약 Recall과 Precision의 최적값을 찾지 못하게 된다면 모델의 예측 정확도를 더 올려서 recall과 precision의 최적값을 찾아 나가야 한다.

 

print('모델평가 : ', model.evaluate(x_test2, y_test2))
print('정확도   : ', accuracy_score(y_test2, y_pred))
print('정밀도   : ', precision_score(y_test2, y_pred))
print('재현도   : ', recall_score(y_test2, y_pred))
67/67 [==============================] - 0s 2ms/step - loss: 0.0359 - accuracy: 0.9991
모델평가 :  [0.03586210682988167, 0.9990543723106384]
정확도   :  0.9990543735224586
정밀도   :  0.9982409850483729
재현도   :  1.0

 

 






#혼동행렬 #confusionmatrix #모델평가
#accuracy #precision #recall #specificity
#F1 #정확도 #정밀도 #재현도 #민감도 #특이도