오차행렬 confustion matrix
¶
- 오차행렬: 학습된 분류 모델이 예측을 수행하면서 얼마나 헷갈리고 있는지도 함께 보여주는 지표. 이진 분류의 예측 오류가 얼마인지와 더불어 어떤 유형의 예측 오류가 발생하는지 나타냄
- 예측 클래스와 실제 클래스의 값 유형에 따라 결정되는 TN, FP, FN, TP 형태로 오차 행렬의 4분면을 채움
- TN, FP, FN, TP는 Positive 결정값(1)과 Negative 결정값(0)의 결합에 따라 결정됨
- sklearn은 confusion_matrix()를 제공
앞에서 사용한 MyFakeClassifier의 예측 성능 지표를 오차행렬로 표현하기¶
In [1]:
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.base import BaseEstimator
from sklearn.metrics import accuracy_score
import numpy as np
import pandas as pd
class MyFakeClassifier(BaseEstimator):
def fit(self, X, y):
pass
def predict(self, X):
return np.zeros( (len(X), 1), dtype=bool)
digits = load_digits()
y = (digits.target == 7).astype(int)
X_train, X_test, y_train, y_test = train_test_split( digits.data, y, random_state=11)
In [2]:
print('레이블 세트 크기:', y_test.shape)
print('테스트 세트 레이블 0과 1의 분포도')
print(pd.Series(y_test).value_counts())
fakeclf = MyFakeClassifier()
fakeclf.fit(X_train, y_train)
fakepred = fakeclf.predict(X_test)
print('모든 예측을 0으로 하여도 정확도는: {0:.3f}',format(accuracy_score(y_test, fakepred)))
레이블 세트 크기: (450,)
테스트 세트 레이블 0과 1의 분포도
0 405
1 45
dtype: int64
모든 예측을 0으로 하여도 정확도는: {0:.3f} 0.9
In [4]:
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, fakepred)
Out[4]:
array([[405, 0],
[ 45, 0]], dtype=int64)
- 오차 행렬은 ndarray 형태임(TN은 [0,0]으로 405, FP는 [0,1]로 0, FN는 [1,0]으로 45, TP는 [1,1]로 0)
- TN은 전체 450건 데이터 중 무조건 Negative 0으로 예측해서 True가 된 결과, 405건
- FP는 Positive 1으로 예측한 건수가 없어서 0건
- FN은 Positive 1인 건수 45건을 Negative로 예측해서 False가 된 결과 45건
- TP는 Positive 1로 예측한 건수가 없어서 0건
- 이 값들을 조합해 Classifier의 성능을 예측할 수 있는 주요 지표인 정확도, 정밀도, 재현율 값을 알 수 있음
정확도 = 예측 결과와 실제 값이 동일한 건수/전체 데이터 수 = (TN + TP)/(TN + FP + FN + TP)
¶
- ex) 사기 예측 모델에서는 사기 행위가 Positive(양성)으로 1, 정상 행위가 Negative(음성)으로 0이 결정값으로 할당
- 불균형한 이진 분류 데이터셋에서는 Positive 데이터 건수가 매우 작기 때문에 데이터에 기반한 ML 알고리즘은 Negative로 예측 정확도가 높아지는 경향이 발생
'Data Science > 파이썬 머신러닝 완벽 가이드' 카테고리의 다른 글
[sklearn] (13) 분류 성능 평가 지표: F1 스코어 - f1_score() (0) | 2023.05.16 |
---|---|
[sklearn] (12) - 정밀도와 재현율 Precision and Recall (trade-off, predict_proba(), Binarizer, threshold...) (2) | 2023.05.10 |
[sklearn] (10) - 정확도 accuracy_score (0) | 2023.05.09 |
[sklearn] (9) - 데이터 스케일링 Data Scaling (0) | 2023.05.05 |
[kaggle] 타이타닉 생존률 예측하기 (2) - 모델링 (0) | 2023.05.04 |