• Home
  • About
    • SevillaBK's Blog photo

      SevillaBK's Blog

      Data Science Blog

    • Learn More
    • Github
  • Posts
    • All Posts
    • Python
    • ML & DL
    • All Tags

[케라스] 다층 퍼셉트론 모델 만들기

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
  • 블록과 함께 하는 파이썬 딥러닝 케라스 (김태영 저)


딥러닝케라스MLP Share Tweet +1