간단하게 폐암환자 수술 예측을 해보려 합니다.
앞서서 포스팅한 피마 인디언셋과 다 동일하고
데이터 셋만 바꾸어서 실행했어요.
# 라이브러리 임포트
import tensorflow
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import tensorflow as tf
먼저 라이브러리를 임포트해줍니다.
seed =0 #seed 고정
np.random.seed(seed)
tf.set_random_seed(seed) # 텐서플로우 1.15
# 2.0이상이면 tf.random.set_seed
씨드를 정해주고 난수를 생성하구요.
Data_set = np.loadtxt('/ThoraricSurgery.csv', delimiter = ',')
Data_set
array([[293. , 1. , 3.8 , ..., 0. , 62. , 0. ],
[ 1. , 2. , 2.88, ..., 0. , 60. , 0. ],
[ 8. , 2. , 3.19, ..., 0. , 66. , 1. ],
...,
[406. , 6. , 5.36, ..., 0. , 62. , 0. ],
[ 25. , 8. , 4.32, ..., 0. , 58. , 1. ],
[447. , 8. , 5.2 , ..., 0. , 49. , 0. ]])
데이터를 읽어옵니다.
구조파악을 위해서 shape
Data_set.shape
(470, 18)
아 470개의 행에 18열로 되어있구나.
17개의 속성과 1개의 class 결과값으로
구성되어있음을 알 수 있습니다.
속성(정보)은 종양의 유형, 폐활량, 호흡곤란 여부,
기침, 흡연, 천식여부 등의 17가지 환자 상태이구요.
마지막 18번째는 수술 후 생존 결과로 1이면 생존,
0이면 사망입니다.
딥러닝을 구동시키려면 '속성'만을 뽑아
데이터셋을 만들고, '클래스'를 담는 데이터셋을
또 따로 만들어줘야 합니다.
X = Data_set[:, 0:17] ; X
# 모든행, 0부터 16번까지의 열
array([[293. , 1. , 3.8 , ..., 1. , 0. , 62. ],
[ 1. , 2. , 2.88, ..., 1. , 0. , 60. ],
[ 8. , 2. , 3.19, ..., 1. , 0. , 66. ],
...,
[406. , 6. , 5.36, ..., 0. , 0. , 62. ],
[ 25. , 8. , 4.32, ..., 0. , 0. , 58. ],
[447. , 8. , 5.2 , ..., 0. , 0. , 49. ]])
속성 데이터셋인 X는 17가지의 속성들을 포함합니다.
Y = Data_set[:, 17] ; Y[:20]
# 모든행, 18번째 컬럼(파이썬은 0부터 센다)
array([0., 0., 1., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0.,
0., 0., 0.])
클래스 데이터셋 Y는 18번째 컬럼(수술 후 결과 값)을 담아줍니다.
simple 딥러닝 짜기: Dense 층으로만
# 딥러닝 기본구조 완성
model = Sequential() #바구니
model.add(Dense(30, input_dim=17, activation = 'relu')) #바구니에 덴스를 쌓는다
model.add(Dense(1, activation = 'sigmoid')) #이진분류 출력 시그모이드
#딥러닝 컴파일 (학습과정 설정: loss 함수, optimizer 지정)
model.compile(loss = 'mean_squared_error', optimizer = 'adam', metrics =['accuracy'])
층을 몇 개 쌓을지는 데이터에 따라 결정합니다.
- activation: 다음 층으로 어떻게 값을 넘길지 결정하는 부분입니다.
- loss: 한 번 신경망이 실행될 때마다 오차 값을 추적하는 함수입니다.
- optimizer: 오차를 어떻게 줄여나갈지 정하는 함수입니다.
- metrics: 여러 개의 평가 기준을 지정할 수 있습니다. 모델의 학습에는 영향을 미치지 않으나, 학습 과정 중에 제대로 학습되고 있는지 확인해 볼 수 있습니다. 일반적으로 정확도인 'accuracy'를 사용하지만 사용자가 직접 정의한metrics도 사용 가능하다고 하네요! 근데 전 아직은 정의 못하겠습니다..ㅎ
model.fit(X, Y, epochs=30, batch_size = 10)
Epoch 1/30
470/470 [==============================] - 0s 633us/step - loss: 0.6656 - acc: 0.3064
.
.
.
Epoch 22/30
470/470 [==============================] - 0s 250us/step - loss: 0.1469 - acc: 0.8489
Epoch 23/30
470/470 [==============================] - 0s 254us/step - loss: 0.1467 - acc: 0.8511
Epoch 24/30
470/470 [==============================] - 0s 265us/step - loss: 0.1476 - acc: 0.8489
Epoch 25/30
470/470 [==============================] - 0s 236us/step - loss: 0.1471 - acc: 0.8511
Epoch 26/30
470/470 [==============================] - 0s 249us/step - loss: 0.1466 - acc: 0.8511
Epoch 27/30
470/470 [==============================] - 0s 263us/step - loss: 0.1473 - acc: 0.8511
Epoch 28/30
470/470 [==============================] - 0s 244us/step - loss: 0.1472 - acc: 0.8489
Epoch 29/30
470/470 [==============================] - 0s 240us/step - loss: 0.1471 - acc: 0.8489
Epoch 30/30
470/470 [==============================] - 0s 236us/step - loss: 0.1462 - acc: 0.8532
<keras.callbacks.History at 0x7f87cdb33710>
모델을 적용하여 학습시킨다.
print('\n Accuracy: %.4f' % (model.evaluate(X,Y)[1]))
470/470 [==============================] - 0s 114us/step
Accuracy: 0.8511
정확도는 85.11% 정도로 각종 특성에 따른
수술결과 생존결과를 살펴보았습니다.
여러가지 기술적인 부분을 통한 분석이
포함된다면 더 높은 예측률이 나올 것이라고
생각하지만 아직 제가 구현하는 것은..
이른것 같습니다.. 오늘은 이만 마치겠습니다.
감사합니다~~
참고한 곳들 출처: 모두의 딥러닝, 블로그, 강의
https://tykimos.github.io/2017/09/24/Custom_Metric/
😁
'Data Scientist' 카테고리의 다른 글
기초통계 - 척도 (0) | 2020.02.07 |
---|---|
챗봇솔루션 closer를 이용한 나만의 챗봇 만들기! (0) | 2020.02.06 |
와인 종류 예측하기(체크포인트_모델저장, 그래프, Early stopping) (0) | 2020.01.25 |
피마 인디언 당뇨병 예측하기 - 2편: 딥러닝 구조 짜기 (0) | 2020.01.24 |
피마 인디언 당뇨병 예측하기 - 1편: 데이터 불러오기 (0) | 2020.01.23 |