ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [인프런 - 파이썬 머신러닝 완벽 가이드] 머신러닝 classification(분류) 성능 지표 - 정확도 Accuracy , 오차 행렬 (Confusion Matrix)
    Data Science 2020. 6. 9. 06:05
    반응형

    1. Accuracy

    정확도 Accuracy는 직관적으로 모델의 예측 성능을 나타내는 평가지표다.

    하지만 class가 불균일한 데이터셋에서의 이진 분류 정확도는 양날의 검이 될 수 있다.

     

     

    DummyClassifier를 만들어서 테스트를 해보자

    다음 테스트는 케글에 있는 타이타닉 데이터를 활용한다.

    https://www.kaggle.com/c/titanic/data

     

    Titanic: Machine Learning from Disaster

    Start here! Predict survival on the Titanic and get familiar with ML basics

    www.kaggle.com

    우리는 통상적으로 위험한 상황에서 어린이나 여성 노약자를 먼저 구한다.

    이는 위 타이타닉 데이터를 통해서도 확인할 수 있다. (실제 데이터를 확인해보면 여성의 생존율이 놉다.)

    이를 바탕으로 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)

     

    반응형
Designed by Tistory.