정구리의 우주정복

인공지능(4) - 피마 인디언 당뇨병 예측 본문

PYTHON/A.I

인공지능(4) - 피마 인디언 당뇨병 예측

Jungry_ 2020. 11. 15. 23:07
반응형

데이터 다운로드

www.kaggle.com/kumargh/pimaindiansdiabetescsv?select=pima-indians-diabetes.csv

 

pima-indians-diabetes.csv

 

www.kaggle.com

 

768명의 인디언으로부터 8개의 속성과1 개의 클래스로 되어있는 csv 파일

 

1) 데이터 살펴보기


import pandas as pd

#names 를 사용해 속성의 키워드를 지정해준다.
df = pd.read_csv('파일 경로',
                 names=['pregnant','plasma','pressure','thickness','insulin','BMI','pedigree','age','class'])
print(df.head(5))
print(df.info())
#일의 칼럼만 보고싶을때
print(df[['pregnant','class']])

pandas 를 사용해 csv 파일을 불러오고 names 를 사용해서 각 속성의 키워드를 지정해준다.

이후 칼럼의 정보를 확인해보고싶으면 소스코드를 입력해보며 결과값을 확인해보장

 

2) 데이터 가공하기


임신 횟수에 따른 당뇨병의 발병 예측

#임신횟수에 따른 당뇨병의 발병 예측
print(df[['pregnant','class']].groupby(['pregnant'],as_index=False).mean().sort_values(by='pregnant',ascending=True))

groupby() 를 사용해 pregnant 정보를 기준으로 하는 새 그룹을 만듬

as_index = False 는 pregnant 정보 옆에 새로운 인덱스를 만들어준다

mean() 을 사용해 평균을 구하고 sort_values() 함수를 써서 pragnant 컬럼을 오름차순(ascending) 정렬

결과값

정보간 상관관계 그래프 그리기

import matplotlib.pyplot as plt
import seaborn as sns

#그래프의 크기 결정
plt.figure(figsize=(12,12))
#각 항목 간의 상관관계를 나타내주는 heatmap() 함수를 통해 그래프 표시
#두 항목을 짝지은 뒤 어떤 패턴으로 변화하는지 관찰하는 함수 다르면 0 같으면 1에 수렴
sns.heatmap(df.corr(),linewidths=0.1,vmax=0.5,cmap=plt.cm.gist_heat,linecolor='white',annot=True)
#vmax 는 색상의 밝기를 조절하는 cmap 은 미리 정해진 matpliolib 색상의 설정값 불러오기
plt.show()

plasma 가 0.47로 가장 높기 때문에 class와 밀접한 관련이 있다고 생각할 수 있다. 

 

grid = sns.FacetGrid(df,col='class')
grid.map(plt.hist,'plasma',bins=10)
plt.show()

당뇨병인 환자인 경우 plasma 값이 150 이상이 많은것을 확인할 수 있다.

 

3) 최종 소스

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy
import tensorflow as tf

#seed값 설정 (항상 같은 결과를 출력하기위해 (seed가 같으면 같은 결과 출력))
numpy.random.seed(3)
tf.random.set_seed(3)

dataset = numpy.loadtxt('파일 경로',delimiter=',')
X = dataset[:,0:8]
Y = dataset[:,8]

#set model
model = Sequential()
model.add(Dense(12,input_dim=8,activation='relu'))
model.add(Dense(8,activation='relu'))
model.add(Dense(1,activation='sigmoid'))

#model compile
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])

#work
model.fit(X,Y,epochs=200,batch_size=10)

print('Accuracy',model.evaluate(X,Y)[1])
반응형
Comments