본문 바로가기

Data Science/Pandas

Confusion Matrix - 혼동행렬

728x90

분류분석을 수행할 때 예측기가 얼마나 정확한지 알고리즘 성능을 평가하기 위한 지표로는 accuracy(정확도)가 있습니다. 하지만 정확도 수치 하나만으로 분류기를 평가하기에는 부족한 경우가 많은데요. 이 경우에 분류분석에서 Confusion Matrix라는 행렬을 이용하여 다양한 평가 지표를 사용합니다. 

 

그럼 Confusion Matrix에 대해서 알아보겠습니다.


Confusion Matrix

이진 분류의 예측오류가 얼마이고, 어떠한 유형의 예측 오류가 발생하고 있는지 나타내는 지표

 

Confusion Matrix

 

python 코드로는 아래와 같이 sklearn 라이브러리의 confusion_matrix 모듈을 활용합니다.

 


from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

 

위의 행렬을 이용하여 분류모델의 성능을 측정하는 주요 지표인 정확도(Accuracy), 정밀도(Precision), 재현율(Recall), F1 score, 그리고 ROC/AUC score을 구할 수 있습니다. 각각의 지표를 어떻게 구할 수 있는지 코드와 함께 알아보겠습니다.

 

Accuracy

실제 데이터에서 예측 데이터가 얼마나 같은지 판단하는 지표
(TN+TP)/(TF+FP+FN+TP)

 


from sklearn.metrics import accuracy_score
acc = accuracy_score(y_test, y_pred)

Precision

Positive로 예측한 것들 중 실제로도 Positive인 것들의 비율
TP/(FP+TP)

양성 예측도라고도 불리는 정밀도는 Positive 예측성능을 더욱 정밀하게 측정하기 위한 평가지표 입니다. 이 지표가 중요성을 가지는 경우는 실제 Negative인 데이터를 Positive으로 잘못 예측했을 때(FP 값이 커질 경우) 큰 영향이 발생할 때입니다.

 


from sklearn.metrics import precision_score
precision = precision_score(y_test, y_pred)

Recall

실제 Positive인 것들 중 Positive로 예측한 것들의 비율
TP/(FN+TP)

TPR/민감도라고도 불리는 재현율은 실제 Positive인 데이터를 Negative로 잘못 예측했을 때(FN 값이 커질 경우) 큰 영향이 발생할 때입니다.

 


from sklearn.metrics import recall_score
recall = recall_score(y_test, y_pred)

 

위에서 Precision과 Recall 지표는 매우 유사한 것 같습니다. 이 둘은 서로 Trade-off 관계라 한 지표를 강제로 높이면 다른 하나의 수치가 떨어지게 됩니다.

분류 결정 임계값(threshold)을 낮추면 Recall 값이 증가하고, Precision 값은 떨어지게 됩니다

반대로, 분류 결정 임계값을 높이면 Precision 값이 증가하고, Recall 값은 떨어지게 됩니다.  

따라서 분류 결정 임계값을 조정할 때 정밀도와 재현율 두 수치가 적절한 조화를 이루도록 하여 분류모델의 성능을 종합적으로 평가하는 것이 좋습니다.

 


F1 Score

실제 Positive인 것들 중 Positive로 예측한 것들의 비율
2*(precision*recall)/(precision+recall)

정밀도와 재현율이 어느 한쪽으로 치우치지 않고 적절한 조화를 이루 때 상대적으로 높은 수치를 가지게 됩니다.

 


from sklearn.metrics import f1_score
f1 = f1_score(y_test, y_pred)

ROC곡선과 AUC Score

ROC 곡선: FPR(False Positive Rate)이 변할 때 TPR(Trus Positive Rate)이 변하는 것을 나타내는 곡선
AUC Score: ROC 곡선의 아래 면적을 나타냅니다.

FPR = FP/(FP+TN)
TPR = TP/(FN+TP)

 

ROC 곡선은 TPR을 y축으로, FPR을 x축으로 하는 그래프로, 분류 결정 임계값을 조절하면서 FPR이 0부터 1까지 변할 때 TPR의 변화값을 그래프로 그립니다. ROC 곡선 자체는 FPR과 TPR의 변화 값을 보는 데 사용하면, AUC를 이용해 실제 ROC 곡선 아래의 면적 값을 분류 성능지표로서 사용할 수 있습니다. AUC는 1에 가까울수록 예측성능이 우수하다고 판단합니다. 즉, FPR이 작고 TPR이 커야 합니다.

 


from sklearn.metrics import roc_curve, auc
fpr, tpr, thr = roc_curve(y_test, y_pred, pos_label = 1)
auc = auc(fpr, tpr)

import matplotlib.pyplot as plt
# ROC 곡선 그리치
plt.plot(frp, tpr)

 

아래 그림은 실제로 데이터를 이용해서 roc curve, auc score을 측정한 결과입니다. 주의할 점은, roc_curve 함수를 사용할 때 y_pred 인자에 예측 확률을 넣어주어야 한다는 점입니다.

또한 roc_auc_score을 이용해서도 auc 점수를 구할 수 있습니다.

 


AUC Value = 0.5, 1인 case

 

 

출처

[데싸라면, 빨간색 물고기, 자투리코드] 파이썬 한권으로 끝내기: 데이터분석전문가(ADP) + 빅데이터분석기사 실기대비, 시대고시기획(2022)

728x90
반응형

'Data Science > Pandas' 카테고리의 다른 글

GridSearch를 이용한 model training  (0) 2023.09.01
결측치 처리 - KNNImputer  (0) 2023.09.01
PCA - 차원 축소  (0) 2023.08.31
날짜 데이터 핸들링 (datetime)  (0) 2023.08.30
데이터 재구조화 (pivot_table, melt)  (0) 2023.08.30