TensorFlow Python

(모두를 위한 딥러닝) 질병 예측하기 - sigmoid

kjun.kr 2017. 10. 31. 22:58
728x90
728x170

data-03-diabetes.csv

-0.29412 0.487437 0.180328 -0.29293 0 0.00149 -0.53117 -0.03333 0
-0.88235 -0.14573 0.081967 -0.41414 0 -0.20715 -0.76687 -0.66667 1
-0.05882 0.839196 0.04918 0 0 -0.30551 -0.49274 -0.63333 0
-0.88235 -0.10553 0.081967 -0.53535 -0.77778 -0.16244 -0.924 0 1
0 0.376884 -0.34426 -0.29293 -0.60284 0.28465 0.887276 -0.6 0
-0.41177 0.165829 0.213115 0 0 -0.23696 -0.89496 -0.7 1
-0.64706 -0.21608 -0.18033 -0.35354 -0.79196 -0.07601 -0.85483 -0.83333 0
0.176471 0.155779 0 0 0 0.052161 -0.95218 -0.73333 1
-0.76471 0.979899 0.147541 -0.09091 0.283688 -0.09091 -0.93168 0.066667 0
-0.05882 0.256281 0.57377 0 0 0 -0.86849 0.1 0
-0.52941 0.105528 0.508197 0 0 0.120715 -0.9035 -0.7 1
0.176471 0.688442 0.213115 0 0 0.132638 -0.60803 -0.56667 0
0.176471 0.396985 0.311475 0 0 -0.19225 0.163962 0.2 1
-0.88235 0.899497 -0.01639 -0.53535 1 -0.10283 -0.72673 0.266667 0
-0.17647 0.005025 0 0 0 -0.10581 -0.65329 -0.63333 0
0 0.18593 0.377049 -0.05051 -0.45627 0.365127 -0.59607 -0.66667 0
-0.17647 0.075377 0.213115 0 0 -0.11774 -0.8497 -0.66667 0
-0.88235 0.035176 -0.5082 -0.23232 -0.80378 0.290611 -0.91033 -0.6 1
-0.88235 0.155779 0.147541 -0.39394 -0.77305 0.031297 -0.61486 -0.63333 0
-0.64706 0.266332 0.442623 -0.17172 -0.44444 0.171386 -0.46541 -0.8 1
-0.05882 -0.00503 0.377049 0 0 0.055142 -0.73527 -0.03333 1
-0.17647 0.969849 0.47541 0 0 0.186289 -0.68147 -0.33333 0
0.058824 0.19598 0.311475 -0.29293 0 -0.13562 -0.84202 -0.73333 0
0.176471 0.256281 0.147541 -0.47475 -0.72813 -0.07303 -0.89155 -0.33333 0
-0.17647 0.477387 0.245902 0 0 0.174367 -0.84714 -0.26667 0
-0.88235 -0.02513 0.081967 -0.69697 -0.66903 -0.3085 -0.65073 -0.96667 1

위와 같은 여러 측정값이 있을때 어떤 질병이 걸렸는지 아닌지를 학습시키는 과정이다.

마지막에 0,1 이 0이면 질병이 아니고 1이면 질병에 걸린것이다.

import tensorflow as tf
import numpy as np
# 데이터를 파일에서 가져온다.
xy = np.loadtxt('data-03-diabetes.csv', delimiter=',', dtype=np.float32)
# 처음부터 마지막 컬럼 전까지 측정값이다.
x_data = xy[:, 0:-1]
# 마지막 컬럼이 결과값이다.
y_data = xy[:, [-1]]

# 구성이 어떻게 되어있는지 출력해 준다.
print(x_data.shape, y_data.shape)

# n개의 데이터가 8개의 측정값으로 구성된다.
X = tf.placeholder(tf.float32, shape=[None, 8])
# n개 의 하나의 결과치로 구성된다.
Y = tf.placeholder(tf.float32, shape=[None, 1])

# 8개의 측정값이 있고 1개의 결과가 나온다.
W = tf.Variable(tf.random_normal([8, 1]), name='weight')
# 1개의 결과가 도출된다.
b = tf.Variable(tf.random_normal([1]), name='bias')

# 시그모이드함수로 가설을 세운다. 결과를 0,1 로만 나오게 하기위함이다.
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)

# cost 를 계산한다.
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) *  tf.log(1 - hypothesis))

# cost 를 줄이도록 학습한다.
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)

# 결과가 0.5 이상이면 1 아니면 0 이다.
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
# 계산된 결과가 결과 값과 같은지 확률을 계산한다.
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

# 세션을 할당하고 초기화 한다. with 문은 묶인것? 이라고 보면됨.
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    # 10001 번의 루프를 돌면서 파일의 내용을 학습한다.
    for step in range(10001):
        cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})
        # 200 번 돌때마다 화면에 step 과 cost 를 출력한다.
        if step % 200 == 0:
            print(step, cost_val)

    # 실재로 학습된 결과로 다시 파일의 내용을 측정해보고 얼마나 정확한지 Accuracy 를 출력해본다.
    h, c, a = sess.run([hypothesis, predicted, accuracy],
                       feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ", h, "\nCorrect (Y): ", c, "\nAccuracy: ", a)

위 내용의 출력은 Hypothesis 는 학습한 결과 로직에 파일의 내용을 대입했을때 각각에 대한 결과 값이며
Correct 는 결과값에 대한 1,0 을 나타내고 이 값이 실제 값과 얼마나 맞는지 Accuracy 로 나타내는 것입니다.

결과에서보듯이 Accuracy: ', 0.76679844) 으로 76 프로의 확률로 질병인지 아닌지를 판별 가능합니다.

결과

728x90
그리드형