import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,precision_score,recall_score,roc_auc_score
from sklearn.metrics import f1_score,confusion_matrix,precision_recall_curve,roc_curve
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline
from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score,precision_score,recall_score,roc_auc_score from sklearn.metrics import f1_score,confusion_matrix,precision_recall_curve,roc_curve from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression
def get_clf_eval(y_test,pred=None,pred_proba=None): confusion=confusion_matrix(y_test,pred) accuracy=accuracy_score(y_test,pred) precision=precision_score(y_test,pred) recall=recall_score(y_test,pred) f1=f1_score(y_test,pred)
ROC-AUC 추가
def precision_recall_curve_plot(y_test,pred_proba_c1):
threshold ndarray와 이 threshold에 따른 정밀도, 재현율 ndarray 추출.
diabetes_data=pd.read_csv('diabetes.csv')
print(diabetes_data['Outcome'].value_counts())
diabetes_data.head(3)
diabetes_data.info()
피처 데이터 세트 X, 레이블 데이터 세트 y를 추출
맨 끝이 Outcome 칼럼으로 레이블 값임. 칼럼 위치 -1을 이용해 추출
X=diabetes_data.iloc[:,:-1] y=diabetes_data.iloc[:,-1]
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=156,stratify=y)
로지스틱 회귀로 학습, 예측 및 평가 수행
lr_clf=LogisticRegression()
lr_clf.fit(X_train,y_train)
pred=lr_clf.predict(X_test)
pred_proba=lr_clf.predict_proba(X_test)[:,-1]
get_clf_eval(y_test,pred,pred_proba)
pred_proba_c1=lr_clf.predict_proba(X_test)[:,1] precision_recall_curve_plot(y_test,pred_proba_c1)
diabetes_data.describe() plt.hist(diabetes_data['Glucose'],bins=10)
0값을 검사할 피처 명 리스트
zero_features=['Glucose','BloodPressure','SkinThickness','Insulin','BMI']
전체 데이터 건수
total_count=diabetes_data['Glucose'].count()
피처별로 반복하면서 데이터 값이 0인 데이터 건수를 추출하고, 퍼센트 계산
for feature in zero_features: zero_count=diabetes_data[diabetes_data[feature]==0][feature].count() print('{0} 0 건수는 {1}, 퍼센트는 {2:.2f} %'.format(feature,zero_count,100*zero_count/total_count))
zero_features 리스트 내부에 저장된 개별 피처들에 대해서 0값을 평균 값으로 대체
mean_zero_features=diabetes_data[zero_features].mean() diabetes_data[zero_features]=diabetes_data[zero_features].replace(0,mean_zero_features)
X=diabetes_data.iloc[:,:-1] y=diabetes_data.iloc[:,-1]
StandardScaler 클래스를 이용해 피처 데이터 세트에 일괄적으로 스케일링 적용
scaler=StandardScaler() X_scaled=scaler.fit_transform(X)
X_train,X_test,y_train,y_test=train_test_split(X_scaled,y,test_size=0.2,random_state=156,stratify=y)
로지스틱 회귀로 학습, 예측 및 평가 수행
lr_clf=LogisticRegression() lr_clf.fit(X_train,y_train) pred=lr_clf.predict(X_test) pred_proba=lr_clf.predict_proba(X_test)[:,1]
get_clf_eval(y_test,pred,pred_proba)
thresholds=[0.3,0.33,0.36,0.39,0.42,0.45,0.48,0.5] pred_proba=lr_clf.predict_proba(X_test)