Cancer 코드 Tensorflow ver

2021. 9. 6. 22:16ai/Machine Learning

728x90

# 이번에는 위스콘신 유방암 데이터를 이용해서 Logistic Regression을 Tensorflow를
# 이용해서 구현해 보아요!

import numpy as np
from sklearn.datasets import load_breast_cancer   # 데이터셋 로딩하기 위한 함수
from sklearn.model_selection import train_test_split  # train, validation data를 분리하기 위해서 사용
import tensorflow as tf


# Raw data loading
cancer = load_breast_cancer()

x_data = cancer.data
t_data = cancer.target

# Training Data와 Validation Data를 준비!
train_x_data, valid_x_data, train_t_data, valid_t_data = \
train_test_split(x_data,
                 t_data,
                 test_size=0.2,
                 stratify=t_data,
                 random_state=2)

 


# Tensorflow 구현(v1.15)

# placeholder
X = tf.placeholder(shape=[None,30], dtype=tf.float32)
T = tf.placeholder(shape=[None,1], dtype=tf.float32)

 

#tf.placeholder 의 shape이 2차원이상이면 항상표시하며 ()이 아닌 [] 주의

# Weight & bias
W = tf.Variable(tf.random.normal([30,1]))
b = tf.Variable(tf.random.normal([1]))

# Hypothesis(Logistic Model)
logit = tf.matmul(X,W) + b
H = tf.sigmoid(logit)

# loss function
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit,
                                                              labels=T))

#reduce : 줄이다

# train
train = tf.train.GradientDescentOptimizer(learning_rate=1e-4).minimize(loss)

# session & 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())


# 반복학습
for step in range(300000):
    
    tmp, loss_val = sess.run([train, loss], 
                             feed_dict={X:train_x_data, 
                                        T:train_t_data.reshape(-1,1)})
    
    if step % 30000 == 0:
        print('loss : {}'.format(loss_val))


# 학습이 종료되면
# 우리 모델이 잘 만들어진 모델인지 확인을해야해요! => 

# Metric (Accuracy - 정확도)

predict = tf.cast(H > 0.5, dtype=tf.float32)   # 만약 H > 0.5의 결과가 True이면 1.0

# tf.cast() : casting = data형변환 ( ex)문자 → 숫자 )
correct = tf.equal(predict, T)

# tf.equal() : 맞는지 아닌지 확인하는 함수
acc = tf.reduce_mean(tf.cast(correct, tf.float32))

# correct가 숫자이기 때문에 다시 cast를 이용해 숫자로 변경 해서 평균낸다


acc_val = sess.run(acc, feed_dict={X:valid_x_data, 
                                   T:valid_t_data.reshape(-1,1)})

print('accuracy : {}'.format(acc_val))

accuracy : 0.9210526347160339


# 예를들면 predict =>    [0, 0, 1, 1, 1, 0, 1]
#                T =           [0, 0, 1, 0, 1, 0, 0]
#             correct =>    [T, T, T, F, T, T, F]   T : True, F : False
#             correct_val = [1, 1, 1, 0, 1, 1, 0]
#             correct_val의 평균 => 5 / 7 = 0.71 (71%)

 

 

'ai > Machine Learning' 카테고리의 다른 글

titanic code  (0) 2021.09.07
결측치처리  (0) 2021.09.06
2차 정리  (0) 2021.09.05
1차 정리  (0) 2021.09.05
Cancer 코드 sklearn ver(k-fold)  (0) 2021.09.04