위키북스의 파이썬 머신러닝 완벽 가이드 책을 토대로 공부한 내용입니다.
오차 행렬은 학습된 분류 모델이 예측을 수행하면서 얼마나 헷갈리고(confused) 있는지도 함께 보여주는 지표이다. 즉, 이진 분류의 예측 오류가 얼마인지와 더불어 어떠한 유형의 예측 오류가 발생하고 있는지를 함께 나타내는 지표이다.
오차 행렬은 위와 같이 4분면 행렬에서 실제 label class과 예측 label class가 어떠한 유형을 가지고 mapping 되는지 나타낸다. 4분면의 왼쪽과 오른쪽은 에측된 class를 기준으로 Negative와 Positive로 분류하고, 위와 아래는 실제 class를 기준으로 Negative와 Positive로 분류한다. 따라서 예측 class와 실제 class에 따라 TN, FP, FN, TP 형태로 오차 행렬의 4분면을 채울 수 있다.
1. TN은 예측값을 Negative 값인 0으로 예측했고 실제값 또한 Negative 값인 0일 때
2. FP은 예측값을 Positive 값인 1으로 예측했는데 실제값은 Negative 값인 0일 때
3. FN은 예측값을 Negative 값인 0으로 예측했는데 실제값은 Positive 값인 1일 때
4. TP은 예측값을 Positive 값인 1으로 예측했고 실제값 또한 Positive 값인 1일 때사이키런은 오차 행렬을 구하기 위해 confusion_matrix() API를 제공한다. 정확도 예제에서 다룬 MyFakeClassifier의 예측 성능 지표를 오차 행렬로 표현해보았다.
from sklearn.metrics import confusion_matrix # 앞절의 예측 결과인 fakepred와 실제 결과인 y_test의 Confusion Matrix출력 confusion_matrix(y_test , fakepred)
[output] 출력된 결과는 위의 오차 행렬 이미지의 TN, FP, FN, TP와 동일한 위치를 가지고 있다. 따라서 전체 450개의 data가 모두 Negative인 0으로 예측하도록 고정되어 있고, 그 중 True가 405건, False가 45건인 것을 알 수 있다. TP, TN, FP, FN 값은 Classifier 성능의 여러 면모를 판단할 수 있는 기반 정보를 제공한다. 즉, 이 값들을 조합하여 정확도(Accuracy), 정밀도(Precision), 재현율(Recall) 값을 알 수 있다.
정확도는 예측값과 실제값이 얼마나 동일한지에 대한 비율로 결정된다. 즉, 오차 행렬에서는 True에 해당하는 TN, TP에 의해 결정되므로 다음과 같이 나타낼 수 있다.
정확도 = =
일반적으로 이러한 불균형 label class를 가지는 이진 분류 모델에서는 많은 데이터 중에서 중점적으로 찾고자 하는 매우 적은 양의 결과값에 Positive를 설정하고, 그렇지 않은 경우는 Negative로 부여하는 경우가 많다. 그리고 Positive 데이터 수가 매우 작은 불균형한 이진 분류 dataset이기 때문에 데이터에 기반하는 ML 알고리즘은 Positive보다는 Negative로 예측 정확도를 높아지게 하는 경향이 있다. 따라서 TN은 매우 커지고 TP는 매우 작아지게 될 것이다. 또한 Negative로 예측할 때 정확도가 높기 때문에 FN이 매우 작고, Positive로 예측하는 경우가 애초에 매우 작아서 FP 또한 매우 작아진다. 결과적으로 비대칭한 dataset에서는 정확한 판단이 아님에도 불구하고 정확도가 매우 높게 나타나는 수치적인 판단 오류를 발생시킨다. 다음 포스트에선 불균형 dataset에서 정확도보다 더 선호되는 평가 지표인 정밀도(Precision)와 재현율(Recall)에 대해 설명할 것이다.