파이썬 머신러닝 (Python Machine Learning)
딥러닝(Deep Learning) 인공신경망(Artificial Neural Network)을 이용한 심장병 예측
삐멜
2019. 4. 28. 15:43
이번 포스트에서는 캐글(Kaggle)의 심장병 데이터와 인공신경망을 이용해 심장병을 예측하는 머신러닝 코드를 짜보도록 한다. 편의를 위해 주피터 노트북의 형식으로 포스트를 제작했다. 데이터셋은 캐글의 Heart Disease UCI를 이용했다. 이 데이터의 장점은 모든 데이터가 숫자형으로 되어있고 None형의 데이터가 없어 데이터 정제화(Sanitization/Cleaning)이 필요 없었다는 점이다. 하지만 단점은 데이터의 양이 너무 적어 예측 모델에 큰 의미를 부여하기 힘들다는 점이다. 그래도 인공 신경망 연습하기에는 좋은 데이터셋이라 여겨 연습해 보았다.
Heart Disease UCI
데이터 확인
In [1]:
# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory
import os
print(os.listdir("../input"))
# Any results you write to the current directory are saved as output.
pandas 라이브러리를 이용해 'heart.csv'를 메모리로 불러오기
In [2]:
dataset_path = '../input/heart.csv'
dataset = pd.read_csv(dataset_path)
print(dataset.head())
X와 y나누기
모든 값이 바이너리이거나 숫자형이므로 Cateogorization을 할 필요가 없다. X와 y로 데이터셋와 타겟을 나눈다.
In [3]:
X_len = len(dataset.columns) - 1
y_len = len(dataset.columns) - 1
X = dataset.iloc[:, 0:X_len]
y = dataset.iloc[:, y_len]
데이터셋을 트레이닝셋과 테스트셋으로 나눈다. 비율은 8 : 2로 한다.
In [4]:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
Feature Scaling
In [5]:
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
인공 신경망 만들기
3개의 레이어를 두었다. 유닛과 배치사이즈, 에폭은 실험을 걸쳐 가장 잘 나오는 것으로 했다.
In [6]:
# Importing the Keras libraries and packages
import keras
from keras.models import Sequential
from keras.layers import Dense
# Initialising the ANN
classifier = Sequential()
# Adding the input layer and the first hidden layer
classifier.add(Dense(units = 25, kernel_initializer = 'uniform', activation = 'relu', input_dim = 13))
# Adding the second hidden layer
classifier.add(Dense(units = 15, kernel_initializer = 'uniform', activation = 'relu'))
# Adding the output layer
classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
# Compiling the ANN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# Fitting the ANN to the Training set
classifier.fit(X_train, y_train, batch_size = 40, epochs = 200)
Out[6]:
모델로 y를 예측
In [7]:
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)
Confusion Matrix
예측된 실제 y에 얼마나 차이가 있는지 확인해 본다.
In [8]:
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
loss, accuracy = classifier.evaluate(X_test, y_test)
Confusion Matrix, loss and accuracy 확인하기
In [9]:
print('Loss : ', loss)
print('Accuracy : ', accuracy)
print('Confusion Matrix : \n', cm)
정확도가 90%로 꽤 높고 Confusion Matrix도 괜찮은 결과를 보였다. 오른쪽 위가 True Positive, 오른쪽 아래가 False Negative로 이 두개의 값이 많을수록 예측이 정확한 것이다.