ML

오차행렬 (Confusion Matrix)

마로그래머 2023. 7. 27. 00:00
반응형

Confusion Matrix (오차행렬)

Classification 모델의 퍼포먼스를 설명할 수 있는 테이블이다.
간단한 설명을 해보자.


Actual\Predict POSITIVE NEGATIVE
POSITIVE True Positive False Positive
NEGATIVE False Negative True Negative

  • 은 Actual Values로 실제 값을 말한다.
  • 은 Predictive Values로 예측값을 말한다.
  • True Positive (TP): 모델의 예측도 YES, 실제값도 YES일 때
  • True Negative (TN) : 모델의 예측이 NO, 실제값도 NO일 때
  • False Positive (FP) : 모델의 예측이 YES, 하지만 실제값은 NO일 때 (Type 1 에러라고도 부른다.)
  • False Negative (FN): 모델의 예측이 NO, 하지만 실제값은 YES일 때 (Type 2 에러라고도 부른다.)

자, 이제 이것을 가지고 어떻게 분석하는지 살펴보자.


Accuracy

모델이 예측을 얼마나 잘 예측했는지를 확인

TP + TN / total
  • 이것만 가지고 정확도를 예측할 수 없다.
    • 만약 모델에게 990개의 오렌지와 10개의 사과의 데이터를 주고 사과와 오렌지를 분류하라고 했을 때, 모든 것을 오렌지로만 보는 모델은 정확도가 높을 수밖에 없다.
    • 즉, 데이터가 편향되어있으면 이 정확도를 신뢰할 수 없게된다.

Misclassification Rate (Error Rate)

모델이 얼마나 틀렸는지를 확인

FP + FN /total

Recall (Sensitivity, True Positive Rate, 재현율)

실제 True인 것중에서 모델이 True라고 예측한 확률

TP / TP + FN
  • 모델에게 사과와 오렌지를 분류하라고 시킨 뒤, 사과클래스에 분류되어있는 사과전체 사과 값들로 나눈다고 생각하자.
  • 실제로 Positive 한 것을 놓치는지 아닌지 확인할 때 씀.
  • 잘못된 양성반응은 괜찮지만 양성반응 자체를 놓치는 것은 안되는 의료계에서 중요하게 생각할 확률.
  • Precision 과는 trade-off 관계이다.

Specificity(True Negative Rate)

실제값이 True일 때, 모델의 예측값이 False를 한 확률.

TN / TN + FN

Precision (정밀도)

모델이 True라고 예측한 것 중에서 실제 True인 것의 확률

TP / TP + FP
  • 모델에게 사과와 오렌지를 분류하라고 시킨 뒤, 모델이 분류한 사과 클래스 안에 있는 실제 사과 값들을 사과 클래스 안에 있는 모든 값들로 나눈다고 생각하자.
  • Positive 하다고 말한 것이 실제로 Positive 한 것인지를 확인할 때 씀.
  • 잘못된 긍정으로 고객에게 안좋은 영향을 끼칠 수 있는 음악, 영상 추천 시스템이나 e-커머스 사이트에서 중요하게 생각할 확률
  • Recall 과는 trade-off 관계이다

Prevalence

주어진 데이터 샘플에서 모델이 True를 얼마나 많이 했는지를 확인

TP + FP / total

F1 Score

PrecisionRecall(True Positive Rate)trade-off 관계이기 때문에 이를 조화평균해놓은 것.

2 * (Precision * Recall / Precision + Recall)
  • 데이터가 어느 한 쪽으로 치우쳐서 불균형할 때 정확도 대신 쓰인다.



Example

  • sklearn 으로 counfusion matrix를 만든 뒤, pandas로 직접 볼 수 있다.
import pandas as pd
from sklearn.metrics import classification_report, confusion_matrix

# printing confision matrix
pd.DataFrame(confusion_matrix(y_test,y_pred),\
            columns=["Predicted NO", "Predicted YES"],\
            index=["NO","YES"] )



  • sklearn 으로 바로 예측해볼 수 있다.
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score
from sklearn.metrics import precision_score

accuracy_score(y_test, y_pred)
recall_score(y_test, y_pred)
precision_score(y_test, y_pred)




반응형