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(