인공지능 공부

2021-04-27 머신러닝 완벽가이드 정확도 Accuracy

from sklearn.base import BaseEstimator

class MyDummyClassifier(BaseEstimator):
    def fit(self, X, y=None):
#fit메서드는 아무것도 학습하지 않음
        pass
#predict() 메서드는 단순히 SEX 피쳐가 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
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

#원본데이터를 재로딩, 데이터가공, 학습데이터 테스트 데이터 분할 


titanic_df = pd.read_csv('./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)))
Dummy Classifier의 정확도는 :0.787709
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()

#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())

#Dummy Classsifier로 학습 예측 정확도 평가
fakecldf = MyFakeClassifier()
fakecldf.fit(X_train, y_train)
fakepred = fakecldf.predict(X_test)
print('모든 예측을 0으로 하여도 정확도는 :{:.3f}'.format(accuracy_score(y_test, fakepred)))
레이블 테스트 세트 크기 :  (450,)
테스트 세트 레이블 0과 1의 분포도
0    405
1     45
dtype: int64
모든 예측을 0으로 하여도 정확도는 :0.900
#이러한 상황을 없애기 위해 오차행렬을 구함
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, fakepred)
array([[405,   0],
       [ 45,   0]], dtype=int64)
#재현율이 중요 지표인 경우는 실제 Positive 양성 데이터를 Negative로 잘 못 판단하게 되면 업무상 큰 영향이 발생하는 경우
#암환자


#보험사기와 같은 금융사기 적발 모델도 재현율이 중요합니다. 실제 금융거래 사기인 Positive를 Negative로 잘못 판단하게 되면 회사에 미치는
#손해가 크기 떄문이다. 

#정밀도는 스팸메일 분류 만약 스팸메일을 네가티브로 분류해도 불편함을 느끼는 정도지만 네가티브를 파지티브로 할경우는 아예 메일을 받지 
#못하게 됌

#재현율이 상대적으로 더 중요한 지표인 경우는 실제 Positive양성인 데이터를 Negative로 잘못 판단 할 경우
#정밀도가 중요한 업무는 Negative음성인 데이터를 Positive로 예측 할 경우


#재현율 TP/(FN + TP) - recall_score()
#정밀도 TP/(FP + TP) - precision_score()
from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix

def get_clf_eval(y_test,pred):
    confusion = confusion_matrix(y_test, pred)
    accuracy = accuracy_score(y_test, pred)
    precision = precision_score(y_test, pred)
    recall = recall_score(y_test, pred)
    print('오차행렬')
    print(confusion)
    print('정확도:{0:4f}, 정밀도:{1:4f}, 재현율: {2:4f}'.format(accuracy, precision, recall))
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

#원본 데이터를 재로딩, 데이터가공, 학습 데이터/테스트 데이터 분할
titanic_df = pd.read_csv("./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=11)

lr_clf = LogisticRegression()

lr_clf.fit(X_train, y_train)
pred= lr_clf.predict(X_test)
get_clf_eval(y_test, pred)
오차행렬
[[104  14]
 [ 13  48]]
정확도:0.849162, 정밀도:0.774194, 재현율: 0.786885
C:\Users\SM2130\anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py:762: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(

'인공지능 공부' 카테고리의 다른 글

2021-04-27 머신러닝 완벽가이드 titanic 예측  (0) 2021.04.27