👩‍💻LEARN : ML&Data/Book Study

[모두의 딥러닝] #4-11. 데이터 다루기 : 피마 인디언 데이터 예측하기

쟈니유 2023. 2. 16. 14:40
728x90

자 이제 실전이다


#4-10. 데이터 다루기 

 

피마 인디언 데이터를 바탕으로 diabetes 를 예측하는 모델을 만들어보자 

 

먼저 데이터가 어떤 상황인지 확인해보자

 

1. 데이터 조사  

#라이브러리 불러오기

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

#데이터 불러오기


df = pd.read_csv('./data/pima-indians-diabetes3.csv')

df.head(5)
Cloning into 'data'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 21 (delta 3), reused 20 (delta 2), pack-reused 0
Unpacking objects: 100% (21/21), 460.93 KiB | 2.44 MiB/s, done.
pregnantplasmapressurethicknessinsulinbmipedigreeagediabetes01234
6 148 72 35 0 33.6 0.627 50 1
1 85 66 29 0 26.6 0.351 31 0
8 183 64 0 0 23.3 0.672 32 1
1 89 66 23 94 28.1 0.167 21 0
0 137 40 35 168 43.1 2.288 33 1
#데이터 정보 확인해보기

df["diabetes"].value_counts()

0 500 1 268 Name: diabetes, dtype: int64

#상관관계 그래프로 그려보기

colormap = plt.cm.gist_heat
plt.figure(figsize=(12,12))

sns.heatmap(df.corr(), linewidths=0.1, vmax=0.5, cmap=colormap, linecolor='white', annot=True)
plt.show
<function matplotlib.pyplot.show(*args, **kw)>

 

#상관관계 바탕 중요 데이터 간 관계 확인하기
##plasma-diabetes
plt.hist(x=[df.plasma[df.diabetes==0], df.plasma[df.diabetes==1]], bins=30, histtype='barstacked', label=['normal','diabetes'])
plt.legend()

 

##bmi-diabetes

plt.hist(x=[df.bmi[df.diabetes==0], df.bmi[df.diabetes==1]], bins=30, histtype='barstacked', label=['normal','diabetes'])
plt.legend()

 

여기에서 기억해야할 내용들은 아래와 같다. 

 

[히스토그램 작성 시]

하나의 x를 가져올 때, 위의 그래프처럼 binary y에 따라 색을 구분하고 싶을 경우 다음과 같이 진행하면 된다.

x = [df.x1[df.y==0]] , [df.x2[df.y==1]]

histtype='barstacked' 

 

 

 

2. 데이터 예측하기 

#당뇨병 예측 실행

#데이터 지정

X = df.iloc[:,0:8] #- iloc[행인덱스, 열인덱스]
y = df.iloc[:,8]
#y_dum = pd.get_dummies(y)

#모델 구조 설정

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()

model.add(Dense(12,input_dim=8, activation='relu', name='Dense_1')) #입력값 8, 출력값 12
model.add(Dense(8,activation='relu', name='Dense_2')) #입력값 12, 출력값 : 8
model.add(Dense(1, activation='sigmoid', name='Dense_3')) #입력값 8, 출력값 1
model.summary()

Model: "sequential_4"

_________________________________________________________________

Layer (type) Output Shape Param # =================================================================

Dense_1 (Dense) (None, 12) 108

Dense_2 (Dense) (None, 8) 104

Dense_3 (Dense) (None, 1) 9

=================================================================

Total params: 221 Trainable params: 221 Non-trainable params: 0 _________________________________________________________________

 

# 모델 컴파일

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X, y, epochs = 100, batch_size=5)

 

기억해야할 내용 22 

 

 

[데이터 지정 시]

여러개의 컬럼 중 몇개를 x로 하나를 y로 지정하게 될 때 Iloc을 사용하게 된다. iloc은 인덱스 기반으로 열을 가져오는 역할을 하며 아래와 같이 사용할 수 있다.

df.iloc[행 범위, 열 범위] 

 

주의해야 할 것은 열범위는 결국 y 변수 하나이므로(아직까지는) [:,8] 같이 y에 해당하는 index만 똑 가져와야 한다. 

 

[은닉층 추가 관련]

앞의 층의 output이 input으로 들어오므로 첫번째 층을 제외하곤 input_dim을 추가하지 않아도 됨 

해당 층에 이름을 붙여주고 싶으면 Dense( ~~ , name='층이름') 작성해주면 됨 

 

Output shape은 각 층에서의 출력을 의미함 (행의 수, 열의 수) 

이 때 행의 수는 batch_size에 정한 만큼 입력되며, 딥러닝 모델에선 별도로 없어서 None으로 나타남 

 

Param은 파라미터수로 해당 층의 가중치와 바이어스 수의 합을 나타냄 

e.g. 2번째 층에서는 입력값이 12개 출력값이 8개 이므로 12*8 = 96, 각 노드에 더해지는 바이어스 수가 8개로 총 104개의 파라미터.