본문 바로가기

Data Scientist

폐암수술 환자 생존율 예측

반응형

출처: Medscape

 

간단하게 폐암환자 수술 예측을 해보려 합니다.

앞서서 포스팅한 피마 인디언셋과 다 동일하고

데이터 셋만 바꾸어서 실행했어요.

# 라이브러리 임포트
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://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/api_docs/python/constant_op.html#set_random_seed

 

상수, 시퀀스, 난수 생성 · 텐서플로우 문서 한글 번역본

No results matching ""

tensorflowkorea.gitbooks.io

https://tykimos.github.io/2017/09/24/Custom_Metric/

 

클래스별로 학습과정 살펴보기

fit() 함수 로그에는 기본적으로 손실값과 정확도가 표시됩니다. 이진분류 모델에서는 정확도값 하나만 보더라도 학습이 제대로 되고 있는 지 알 수 있지만, 다중클래스분류 문제에서는 클래스별로 학습이 제대로 되고 있는 지 확인하기 위해서는 정확도값 하나로는 부족함이 많습니다. 이진분류 문제에서 클래스간 불균형이 있을 경우에도 정확도값 하나로는 판단할 수가 없습니다. 본 장에서는 학습 중에 클래스별로 정밀도(precision)와 재현율(recall)을 살펴볼

tykimos.github.io

😁

반응형