-
[인프런 - 파이썬 머신러닝 완벽 가이드] 머신러닝 classification(분류) 성능 지표 - 정확도 Accuracy , 오차 행렬 (Confusion Matrix)Data Science 2020. 6. 9. 06:05반응형
1. Accuracy
정확도 Accuracy는 직관적으로 모델의 예측 성능을 나타내는 평가지표다.
하지만 class가 불균일한 데이터셋에서의 이진 분류 정확도는 양날의 검이 될 수 있다.
DummyClassifier를 만들어서 테스트를 해보자
다음 테스트는 케글에 있는 타이타닉 데이터를 활용한다.
https://www.kaggle.com/c/titanic/data
우리는 통상적으로 위험한 상황에서 어린이나 여성 노약자를 먼저 구한다.
이는 위 타이타닉 데이터를 통해서도 확인할 수 있다. (실제 데이터를 확인해보면 여성의 생존율이 놉다.)
이를 바탕으로 Dummyclassifier는 여성이면 생존 아니면 사망을 예측하도록 만들었다.
import numpy as np from sklearn.base import BaseEstimator class MyDummyClassifier(BaseEstimator): # fit( ) 메소드는 아무것도 학습하지 않음. def fit(self, X , y=None): pass # predict( ) 메소드는 단순히 Sex feature가 1 이면 0 , 그렇지 않으면 1 로 예측함. def predict(self, X): pred = np.zeros( ( X.shape[0], 1 )) for i in range (X.shape[0]) : if X['Sex'].iloc[i] == 1: pred[i] = 0 else : pred[i] = 1 return pred
이 DummyClassifier는 단순하게 성별이 1이면 0을
성별이 0이면 1을 예측한다.
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 원본 데이터를 재로딩, 데이터 가공, 학습데이터/테스트 데이터 분할. titanic_df = pd.read_csv('../1장/titanic/train.csv') y_titanic_df = titanic_df['Survived'] X_titanic_df= titanic_df.drop('Survived', axis=1) #전처리를 위한 함수 X_titanic_df = transform_features(X_titanic_df) X_train, X_test, y_train, y_test=train_test_split(X_titanic_df, y_titanic_df, \ test_size=0.2, random_state=0) # 위에서 생성한 Dummy Classifier를 이용하여 학습/예측/평가 수행. myclf = MyDummyClassifier() myclf.fit(X_train ,y_train) mypredictions = myclf.predict(X_test) print('Dummy Classifier의 정확도는: {0:.4f}'.format(accuracy_score(y_test , mypredictions)))
위에서 만든 Dummyclassifier의 정확도는 단순하게 성별로만 판단을 했음에도
0.7877 이이라는 수치 나왔다.
또 다른 경우를 테스트해보자.
이번에는 무조건 0을 반환하는 FakeClassifier를 만들어보자.
이번에는 사이킷런의 내장 데이터셋인 load_digits()를 이용해 MNIST데이터를 사용한다.
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 # 입력값으로 들어오는 X 데이터 셋의 크기만큼 모두 0값으로 만들어서 반환 def predict(self,X): return np.zeros( (len(X), 1) , dtype=bool) # 사이킷런의 내장 데이터 셋인 load_digits( )를 이용하여 MNIST 데이터 로딩 digits = load_digits() print(digits.data[1]) print("### digits.data.shape:", digits.data.shape) print(digits.target) print("### digits.target.shape:", digits.target.shape)
위 데이터를 바탕으로 digits이 7 맞는지 아닌지만 맞추면 된다고 하자!
# digits번호가 7번이면 True이고 이를 astype(int)로 1로 변환, 7번이 아니면 False이고 0으로 변환. y = (digits.target == 7).astype(int) X_train, X_test, y_train, y_test = train_test_split( digits.data, y, random_state=11) # 불균형한 레이블 데이터 분포도 확인. print('레이블 테스트 세트 크기 :', y_test.shape) print('테스트 세트 레이블 0 과 1의 분포도') print(pd.Series(y_test).value_counts()) #MyFakeClassifier 학습/예측/정확도 평가 fakeclf = MyFakeClassifier() fakeclf.fit(X_train , y_train) fakepred = fakeclf.predict(X_test) print('모든 예측을 0으로 하여도 정확도는:{:.3f}'.format(accuracy_score(y_test , fakepred)))
FakeClassifier()에서 무조건 0을 predict 하도록 했는데
예측 정확도가 90%가 나왔다.
이유인즉 테스트 데이터셋의 class의 분포가 0이 90% 1이 10%이기 때문에
무조건 0으로 예측해도 90%의 높은 정확도가 나올 수 있다.
2. Confusion Matrix
Confusion Matrix는 이진 분류의 예측 오류가 얼마인지,
또 어떠한 유형의 예측 오류가 발생하고 있는지를 함께 나타낸 지표이다.
from sklearn.metrics import confusion_matrix # 앞절의 예측 결과인 fakepred와 실제 결과인 y_test의 Confusion Matrix출력 confusion_matrix(y_test , fakepred)
confusion_matrix()를 통해 출력된 결과를 살펴보면
FP와 TP가 모두 0이다.
TP = 0 은 Positive로 예측이 한 것도 성공하지 못했다는 의미
이와 더불어 FP = 0 이므로 Positive로 예측 자체를 수행하지 않았다는 것을 알 수 있다.
* 정확도는 = (TN+TP)/(TN+FP+FN+TP)
반응형'Data Science' 카테고리의 다른 글
[인프런 - 파이썬 머신러닝 완벽 가이드]머신러닝 classification(분류) 성능 지표 F1 Score , ROC 곡선과 AUC (0) 2020.06.09 [인프런 - 파이썬 머신러닝 완벽 가이드]머신러닝 classification(분류) 성능 지표 - 정밀도(Precision)과 재현율(Recall) (0) 2020.06.09 [인프런 - 파이썬 머신러닝 완벽 가이드] 데이터 전처리 (데이터 인코딩과 스케일링) (0) 2020.06.08 [인프런 - 파이썬 머신러닝 완벽 가이드] 교차 검증 (0) 2020.06.08 [인프런 - 파이썬 머신러닝 완벽 가이드] iris 품종 예측하기 (0) 2020.06.07