[케라스] 다층 퍼셉트론 모델 만들기
14 Feb 2020
Reading time ~3 minutes
김태영님의 블록과 함께 하는 파이썬 딥러닝 케라스
를 학습하며 정리하는 내용입니다.
피마 인디언 당뇨병(https://www.kaggle.com/uciml/pima-indians-diabetes-database/download) 데이터셋를 이용하여 당뇨병 여부를 판단하는 다층 퍼셉트론 모델을 만들어보겠습니다.
데이터셋 설명:
-
Pregnancies : 임신횟수
-
Glucose :y포도당 부하 검사 수치
-
BloodPressure : 혈압
-
SkinThickness : 팔 삼두근 뒤쪽의 피하지방 측정값
-
Insulin : 혈청 인슐린
-
BMI : 체질량 지수
-
DiabetesPedigreeFunction : 당뇨 내력 가중치 값
-
Age : 나이
-
Outcome : 당뇨여부(0 또는 1)
→ 양성이 268개(34.9%), 음성이 500개(65.1%)로 구성되어 있습니다.
모두 음성으로 판정하더라도 65.1%의 정확도이므로 이것이 모델의 성능을 가늠하는데 기준이 될 것입니다.
데이터셋 생성하기
# 총 768행의 중 700행은 학습셋으로, 나머지는 테스트셋으로 설정
x_train = dataset[:700].drop(['Outcome'], axis = 1)
y_train = dataset[:700]['Outcome']
x_test = dataset[700:].drop(['Outcome'], axis = 1)
y_test = dataset[700:]['Outcome']
모델 구성하기
- 첫 번째 Dense 레이어는 은닉층으로 8개 뉴런을 입력받아 12개 뉴런을 출력합니다.
- 두 번째 Dense 레이어는 은닉층으로 12개 뉴런을 입력받아 6개 뉴런을 출력합니다.
- 마지막 Dense 레이어는 출력층으로 6개 뉴런을 입력받아 1개 뉴런을 출력합니다.
model = Sequential()
model.add(Dense(12, input_dim = 8, activation = 'relu'))
model.add(Dense(6, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
은닉층의 활성화함수는 모두 relu를 사용하고, 마지막 출력값은 0과 1 사이의 값을 나타내도록 sigmoid를 활성화함수로 사용했습니다. 0과 1의 실수 값이기 때문에 양성 클래스 확률로 쉽게 매칭할 수 있습니다.
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
%matplotlib inline
SVG(model_to_dot(model, show_shapes=True).create(prog='dot', format='svg'))
모델 학습과정 설정하기
모델을 정의했으니 모델을 손실함수와 최적화 알고리즘으로 학습과정을 설정해보겠습ㄴ니다.
- loss : 현재 가중치 세트를 평가하는데 사용하는 손실함수입니다. 이진분류 문제이므로
binary_crossentropy
로 지정합니다. - optimizer : 최적의 가중치를 검색하는데 사용되는 최적화 알고리즘으로 경사하강법 알고리즘 중 하나인
adam
을 사용합니다. - metrics : 평가 척도를 나타내며 분류문제에서는 일반적으로
accuracy
를 사용합니다.
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
모델 학습시키기
fit()
함수를 사용하여 모델을 학습시킵니다.
- 첫 번째 인자 : 입력 변수입니다. 8개 피처를 가지고 있는 x_train을 입력합니다.
- 두 번째 인자 : 출력 변수인 라벨 값입니다. 결과 값을 가지고 있는 y_train을 입력합니다.
epochs
: 전체 학습데이터 셋에 대한 반복학습수를 지정합니다.batch_size
: 가중치를 업데이트하는 배치 크기를 지정합니다.
model.fit(x_train, y_train, epochs = 1500, batch_size = 64)
# 출력:
Epoch 1/1500
700/700 [==============================] - 0s 208us/step - loss: 13.8133 - accuracy: 0.6543
Epoch 2/1500
700/700 [==============================] - 0s 17us/step - loss: 10.7853 - accuracy: 0.6557
Epoch 3/1500
700/700 [==============================] - 0s 25us/step - loss: 7.0893 - accuracy: 0.6471
...
...
Epoch 1498/1500
700/700 [==============================] - 0s 14us/step - loss: 0.4073 - accuracy: 0.8143
Epoch 1499/1500
700/700 [==============================] - 0s 14us/step - loss: 0.4025 - accuracy: 0.8114
Epoch 1500/1500
700/700 [==============================] - 0s 14us/step - loss: 0.4112 - accuracy: 0.8071
모델의 결과 정확도가 80.71%가 나옵니다. 전체를 음수로 판정하는 것(정확도 65.1%)에 비교해 성능이 더 나은 것으로 보입니다.
전체코드 모아보기
# 0. 사용할 패키지 불러오기
import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
# 1. 데이터셋 준비하기
dataset = pd.read_csv('diabetes/diabetes.csv')
# 2. 데이터셋 생성하기
x_train = dataset[:700].drop(['Outcome'], axis = 1)
y_train = dataset[:700]['Outcome']
x_test = dataset[700:].drop(['Outcome'], axis = 1)
y_test = dataset[700:]['Outcome']
# 3. 모델 구성하기
model = Sequential()
model.add(Dense(12, input_dim = 8, activation = 'relu'))
model.add(Dense(6, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))
# 4. 모델 학습과정 설정하기
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
# 5. 모델 학습시키기
model.fit(x_train, y_train, epochs = 1500, batch_size = 64)
# 6. 모델 평가하기
scores = model.evaluate(x_test, y_test)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))
# 출력:
Epoch 1/1500
700/700 [==============================] - 0s 221us/step - loss: 3.5302 - accuracy: 0.5914
Epoch 2/1500
700/700 [==============================] - 0s 19us/step - loss: 1.8825 - accuracy: 0.5629
Epoch 3/1500
700/700 [==============================] - 0s 19us/step - loss: 1.2651 - accuracy: 0.5314
...
...
Epoch 1498/1500
700/700 [==============================] - 0s 15us/step - loss: 0.4381 - accuracy: 0.7886
Epoch 1499/1500
700/700 [==============================] - 0s 15us/step - loss: 0.4342 - accuracy: 0.7857
Epoch 1500/1500
700/700 [==============================] - 0s 15us/step - loss: 0.4289 - accuracy: 0.8014
68/68 [==============================] - 0s 381us/step
accuracy: 79.41%
Reference
- 블록과 함께 하는 파이썬 딥러닝 케라스 (김태영 저)