일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 텐서플로2와 머신러닝으로 시작하는 자연어처리
- 감성분석
- 다층 퍼셉트론
- 기술통계학
- 최소자승법
- 밑바닥부터 시작하는 딥러닝
- word2vec
- 차원축소
- 자연어 처리
- 구글 BERT의 정석
- 오래간만에 글쓰네
- 머신러닝
- 회귀분석
- 코사인 유사도
- 모두의 딥러닝
- 군집화
- numpy
- Pandas
- 가설검정
- 밑바닥부터 시작하는 딥러닝2
- 파이썬 pandas
- student t분포
- Django
- 기초통계
- rnn
- 은준아 화이팅
- 히스토그램
- 텍스트 분류
- F분포
- 결정계수
- Today
- Total
데이터 한 그릇
피마 인디언 당뇨병 예측(모델 평가) 본문
피마 인디언 당뇨병 예측¶
Column information¶
1)Pregnancies (임신횟수) =>Number of times pregnant
2)Glucose (포도당) =>Plasma glucose concentration a 2 hours in an oral glucose tolerance test
3)BloodPressure (혈압) =>Diastolic blood pressure (mm Hg)
4)SkinThickness (삼두근 피부 두께) =>Triceps skin fold thickness (mm)
5)Insulin (2시간 혈청 인슐린) =>2-Hour serum insulin (mu U/ml)
6)BMI (체질량지수) =>Body mass index (weight in kg/(height in m)^2)
7)DiabetesPedigreeFunction (당뇨병 혈통 기능) =>Diabetes pedigree function
8)Age =>Age (years)
9)Outcome =>Class variable (0 or 1) 268 of 768 are 1, the others are 0
EDA¶
import pandas as pd
pima_df = pd.read_csv('C:\ca_da\DataHandling/diabetes.csv')
pima_df
pima_df.head()
pima_df.tail(10)
#768 x 9 dataFrame
#ALL DATATYPE -> int or float
#null 값 0개
pima_df.info()
pima_df.describe()
pima_df['Pregnancies'].hist()
'평균값 : {:.2f}'.format(pima_df['Pregnancies'].mean())
pima_df['Glucose'].hist()
'평균값 : {:.2f}'.format(pima_df['Pregnancies'].mean())
pima_df['BloodPressure'].hist()
pima_df['SkinThickness'].hist()
pima_df['Insulin'].hist()
pima_df['BMI'].hist()
pima_df['DiabetesPedigreeFunction'].hist()
pima_df['Age'].hist()
pima_df['Outcome'].hist()
pima_df['Outcome'].value_counts().plot(kind = 'bar')
pima_df.corr(method = 'pearson')
sns.heatmap(pima_df.corr(method = 'pearson'), annot = True)
Modeling¶
Logistic linear regression
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score,f1_score,confusion_matrix
X = pima_df.iloc[:,:-1]
Y = pima_df.iloc[:,-1]
X_train,X_test,Y_train,Y_test = train_test_split(X,Y, test_size = 0.2, random_state = 156, stratify = Y)
Logistic = LogisticRegression()
Logistic.fit(X_train,Y_train)
pred = Logistic.predict(X_test)
pred
pred_proba = Logistic.predict_proba(X_test)[:,1]
Logistic.score(X_train,Y_train)
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 = roc_auc_score(Y_test, pred_proba)
print('오차 행렬')
print(confusion)
print('\n 정확도 : {:.2f} \n 정밀도 : {:.2f} \n 재현율 {:.2f} \n f1 : {:.2f} \n AUC : {:.2f}'.format(accuracy, precision, recall, f1, roc_auc))
get_clf_eval(Y_test, pred, pred_proba)
from sklearn.metrics import roc_curve
from sklearn.metrics import precision_recall_curve
pred_proba_c1 = Logistic.predict_proba(X_test)[:,1]
precision_recall_curve(Y_test,pred_proba_c1)
import matplotlib.pyplot as plt
def precision_recall_curve_plot(Y_test, pred_proba_c1):
# threshold ndarray 와 이 threshold에 따른 정밀도, 재현율 ndarray 추출.
precisions,recalls, thresholds = precision_recall_curve(Y_test,pred_proba_c1)
# X축을 threshold값으로, Y축은 정밀도, 재현율 값으로 각각 PLOT 수행, 정밀도는 점선으로 표시
plt.figure(figsize =(8,6))
threshold_boundary = thresholds.shape[0]
plt.plot(thresholds, precisions[0:threshold_boundary], linestyle = '--',label='precision')
plt.plot(thresholds, recalls[0:threshold_boundary],label='recall')
# Threshold 값 X축의 Scale을 0.1 단위로 변경
start, end = plt.xlim()
plt.xticks(np.round(np.arange(start, end, 0.1),2))
#X축, Y축 label과 legend, 그리고 grid 설정
plt.xlabel('Thredshold value');plt.ylabel('Precision and Recall value')
plt.legend();plt.grid()
plt.show()
np.round(np.arange(start,end,0.1),2)
precision_recall_curve_plot(Y_test,pred_proba_c1)
pima_df.head(2)
pima_df.describe()
#precnancies, gucose, bloodpressure, skonthickness,lnsulin
pima_df[pima_df['Pregnancies']==0]['Pregnancies'].count()
zero_mean_column = ['Pregnancies','Glucose','BloodPressure','SkinThickness','Insulin','BMI']
total_data_count = pima_df['Pregnancies'].count()
for i in zero_mean_column:
zero_count = pima_df[pima_df[i]==0][i].count()
print('{} 전체 데이터 건수 : {}, 0의 비율 : {:.2f}%'.format(i, total_data_count, 100*zero_count/total_data_count))
#SkinThickness and Insulin 0의 비중이 너무 높음
zero_mean_column_mean = pima_df[zero_mean_column].mean()
zero_mean_column_mean
pima_df[zero_mean_column] = pima_df[zero_mean_column].replace(0,zero_mean_column_mean)
from sklearn.preprocessing import StandardScaler
X = pima_df.iloc[:,:-1]
Y = pima_df.iloc[:,-1]
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)
Logistic = LogisticRegression()
Logistic.fit(X_train,Y_train)
pred = Logistic.predict(X_test)
pred_proba = Logistic.predict_proba(X_test)[:,1]
get_clf_eval(Y_test,pred,pred_proba)
배운점¶
1)from sklearn.metrics 에서 accuracy_score, precision_score, recall_score, f1_score, roc_auc_score,confusion_matrix 를 이용하여 정확도, 정밀도, 재현율, f1스코어, roc_auc점수, 오차 행렬 등을 이용하여 모델을 평가하였는데, 이를 해석하는 법을 배운 것 같다.
2)sklearn의 precision_recall_curve 에 y테스트 데이터와 xtest를 통해서 도출된 각 관측치의 0과 1의 확률을 집어 넣어서 정밀도, 정확도, 임계값 데이터를 얻은 후(임계값에 따른 정밀도, 정확도의 모습) 유틸리티 함수를 하나 만들어서 '시각화'하여 정밀도, 재현율의 가장 이상적인 임계값을 유추할 수 있다.
3)StandardScaler의 fit_transform 함수를 통해서 feature들을 머신러닝 하기 좋게 바꿈
4)아쉬운점
sklearn.preprocessing import Binarizer은 임계값을 조정할 수 있다. inarizer(threshold = ?) 를 하여 임계값 조정한 것을 표로 만들어서 위의 precision_recall_curve 그래프에서 눈대중으로 확인한 것을 정확히 파악
그런데 이거 만들기가 코드 오류가 걸린다...
'머신러닝' 카테고리의 다른 글
캐글 입문, 타이타닉 생존자 예측 모델 만들기! (0) | 2021.03.24 |
---|