머신러닝/sklearn

평가(Evaluation) -accuracy

study ticket 2022. 2. 8. 00:53

정확도(Accuracy)

정확도는 실제 데이터에서 예측 데이터가 얼마나 같은지를 판단하는 지표입니다.

정확도(Accuracy) = 예측 결과가 동일한 데이터 건수 / 전체 예측 데이터 건수

import sklearn
accuracy_score(y_test,mypredictions)

accuracy_score(정답값, 예측값) 함수로 정확도를 쉽게 구할수 있다.

하지만 데이터의 구성에 따라 왜곡될수 있기때문에 정확도만으로 평가하는것은 적합하지 않다..

(EX : 희귀병환자의 경우 병이 걸린 환자보다 병이 걸리지 않은 사람이 데이터가 훨씬 많기 때문에 컴퓨터가 어떤 과정을 거치지 않고, 단순하게 모든 경우를 정상적인 환자라 결과를 내놔도 정확도는 꽤 높게 형성될수 있는 경우가 있다.)

 

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)

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)))
#output
레이블 테스트 세트 크기: (450,)
테스트 세트 레이블 0과 1의 분포도
0    405
1     45
dtype: int64
모든 예측을 0으로 하여도 정확도는:0.900

mnist 데이터세트에서 임의로 7을 제외한 숫자의 레이블을 False(==0)으로 만든 후 0을 예측하는 코드를 짜보았는데 1이든0이든 상관없이 모든 예측을 0이라 하여도 정확도가 90%가 나오는것을 볼수 있다. 

728x90