본문 바로가기
머신러닝딥러닝/딥러닝

딥러닝(Deep learning) #9 데이터 분석 & 피마 인디언 당뇨병 예측

by orangecode 2022. 4. 13.
728x90
피마 인디언 데이터 가져오기&분석
# 라이브러리 설정
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 가져오기
# 데이터에 header가 없어 names로 각 속성별 이름 붙여줌
data = pd.read_csv('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/pima-indians-diabetes.csv', names = ["pregnant", "plasma", "pressure", "thickness", "insulin", "bmi", "pedigree", "age", "class"])

# 데이터 확인
print(data.head(5))
print(data.info())
print(data.describe())

 

 

 

 

# 데이터 전처리
# 속성별 정보의 당뇨병 발병 상관관계 계산
# as_type = pregnant정보 옆 새로운 index 생성
# sort_values(by='pregnant', ascending=True -> pregnant 기준 오름차순 정렬
print(data[['pregnant','class']].groupby(['pregnant'], as_index=False).mean().sort_values(by='pregnant', ascending=True))

# 데이터 시각화
# vmax = 색상의 밝기, cmap = matplotlib의 색상 설정값 부여
plt.figure(figsize=(10,10))
sns.heatmap(data.corr(), linewidths=0.1, vmax=0.5, cmap=plt.cm.gist_heat, linecolor='white', annot=True )
plt.show()

 

 

# 데이터 전처리
속성별 정보의 당뇨병 발병 상관관계를 계산한다.
 
pregnant 기준으로 그룹으로 묶고, 새로운 index(class)생성한 뒤, prednant 기준으로 오름차순 정렬한다
 
 
데이터 시각화
seaborn 라이브러리 heatmap 함수 : 각 항목간의 상관관계를 나타내 주는 그래프를 보여줌. 유사할 수록 1에 가까움
 
plt.figure(figsize=(10,10)) : 그래프 사이즈 10 x 10
sns.heatmap(data.corr(), linewidths=0.1, vmax=0.5, vmin=-0.5, cmap='RdYlBu_r', linecolor='white', annot=True )
- data.corr() : 상관관계 분석
- linewidths : 셀 사이 구분선
- linecolor : 셀 사이 구분선 색상
- vmax / vmin : 최대값 / 최소값
- cmap : 컬러값
- annot = 각 cell 값 표기 유무

plt.show() : 표 보여주기
 
 
 

class(생존여부)와 가장 상관관계가 높은 plasma(혈장) 속성과 class사이의 관계를 분석한 그래프

 

class = 0는 높은 혈장수치를 가지고

class = 1은 낮은 혈장수치를 가지고있음을 알 수 있다.

 

피마 인디언 당뇨병 예측 실행

 

 

# keras 함수 불러오기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 라이브러리 불러오기
import numpy
import tensorflow as tf
tf.__version__


# seed=0 설정 -> 실행할 때마다 같은 결과 출력
seed=0
numpy.random.seed(seed)
tf.set_random_seed(seed)

seed 값을 설정해주는 이유

: random() 함수로 임의값을 설정하는 것처럼 보여도 컴퓨터안에 내장된 '내장테이블' 중 하나를 부럴내어 순서대로 숫자를 보여주는 것이다. seed 설정은 랜덤테이블 중 몇 번째 테이블을 불러와 쓸 것인지를 결정하는 것이다.

 

numpy 라이브러리를 사용한 tensorflow 딥러닝 구현 시 numpy.seed와 tensorflow.seed 설정 2개 모두 설정해야한다.

 

# 수술 환자 데이터 불러오기
# 분리, delimiter=","
data_set = numpy.loadtxt('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/pima-indians-diabetes.csv', delimiter=",")

# 사람의 속성, 당뇨병여부(클래스) 저장
x = data_set[:,0:8] # 속성
y = data_set[:,8] # 클래스

numpy.loadtxt로 numpy라이브러리를 이용한 csv파일을 불러온다. ","로 구분한다.

 

x 는 속성값 = 환자정보

y 는 클래스 = 당뇨병 여부

# 딥러닝 모델 설정
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

Sequential() 함수로 입력층 만들어주기

 

model.add(Dense) 함수

- 노드 12개, 노드 8개의 은닉층 2개 만들어주기

-  input_dim = 입력값 12개

- 활성화 함수 relu 

 

model.add(Dense(1, activation='sigmoid'))

sigmoid 함수로 출력층 만들어주기

 

# 딥러닝 실행
# model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, epochs=100, batch_size=10)

# 출력
print("\n Accuracy: %.4f" % (model.evaluate(x, y)[1]))

 

model.compile로 오차, 최적화, 모델수행결과를 나타냄

 

loss 함수로 MSE(평균제곱오차)와 binary_crossentroy 2개 모두 사용해보았다.

 

epochs = 100으로 전체 샘플이 100번 반복해서 입력될 때까지 실험을 반복

batch_size = 한번에 입력되는 입력값 10개로 설정

 

MSE VS binary_crossentroy 성능 차이

오차함수 loss = mean_squared_error(평균제곱오차)로 돌릴 때,

오차함수 loss = binary_crossentropy(이항교차 앤트로피)로 돌릴 때,

 

 

전체코드
# 라이브러리 설정
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 가져오기
# 데이터에 header가 없어 names로 각 속성별 이름 붙여줌
data = pd.read_csv('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/pima-indians-diabetes.csv', names = ["pregnant", "plasma", "pressure", "thickness", "insulin", "bmi", "pedigree", "age", "class"])
print(data.head(5))
print(data.info())
print(data.describe())

# 데이터 전처리
# 속성별 정보의 당뇨병 발병 상관관계 계산
# as_type = pregnant정보 옆 새로운 index 생성
# sort_values(by='pregnant', ascending=True -> pregnant 기준 오름차순 정렬
print(data[['pregnant','class']].groupby(['pregnant'], as_index=False).mean().sort_values(by='pregnant', ascending=True))

# 데이터 시각화
# vmax = 색상의 밝기, cmap = matplotlib의 색상 설정값 부여
plt.figure(figsize=(10,10))
sns.heatmap(data.corr(), linewidths=0.1, vmax=0.5, vmin=-0.5, cmap='RdYlBu_r', linecolor='white', annot=True )
plt.show()

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

# 피마인디언 당뇨병 예측 실행
# keras 함수 불러오기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 라이브러리 불러오기
import numpy
import tensorflow as tf
tf.__version__

# seed=0 설정 -> 실행할 때마다 같은 결과 출력
seed=0
numpy.random.seed(seed)
tf.set_random_seed(seed)

# 수술 환자 데이터 불러오기
# 분리, delimiter=","
data_set = numpy.loadtxt('C:/Users/kwonk/juno1412-1/juno1412/DL/모두의 딥러닝/dataset/pima-indians-diabetes.csv', delimiter=",")

# 사람의 속성, 당뇨병여부(클래스) 저장
x = data_set[:,0:8] # 속성
y = data_set[:,8] # 클래스

# 딥러닝 모델 설정
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(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, epochs=100, batch_size=10)

# 출력
print("\n Accuracy: %.4f" % (model.evaluate(x, y)[1]))
반응형

댓글