#4-10. 데이터 다루기
피마 인디언 데이터를 바탕으로 diabetes 를 예측하는 모델을 만들어보자
먼저 데이터가 어떤 상황인지 확인해보자
1. 데이터 조사
#라이브러리 불러오기
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#데이터 불러오기
!git clone https://github.com/taehojo/data.git
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.
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개의 파라미터.
'👩💻LEARN : ML&Data > Book Study' 카테고리의 다른 글
[모두의 딥러닝] #4-13. 모델 성능 검증하기 (0) | 2023.02.19 |
---|---|
[모두의 딥러닝] #4-12 다중분류 (0) | 2023.02.17 |
[모두의 딥러닝] #4-10. 딥러닝 모델 설계하기 (0) | 2023.02.15 |
[모두의 딥러닝] #3-8. 오차역전파 : 은닉층 오차 수정과 계산 (0) | 2023.02.14 |
[모두의 딥러닝] #3-8. 오차역전파 : 출력층 가중치 확인까지 (0) | 2023.02.13 |