로지스틱 회귀 분류(Logistic Regression Classification) 연습
로지스틱 회귀 분류 모델
가설식(Hypothesis)
cost(loss) 함수
경사 하강법(Gradient Descent Algorithm)
로지스틱 회귀 분류 모델을 사용한 기계 학습 연습
학습에 사용할 데이터는 다음과 같다.
값은 항상 0과 1을 갖는다는 것이 중요하다
- 데이터 사용 시 중요한 것은 모양(shape)이다.
x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]] y_data = [[0], [0], [0], [1], [1], [1]] X = tf.placeholder(tf.float32, shape=[None, 2]) Y = tf.placeholder(tf.float32, shape=[None, 1])
전체 코드는 다음과 같다.
import tensorflow as tf x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]] y_data = [[0], [0], [0], [1], [1], [1]] X = tf.placeholder(tf.float32, shape=[None, 2]) Y = tf.placeholder(tf.float32, shape=[None, 1]) # weight의 shape은 X의 변수가 2개이기 때문에 [2, 1](2행 1열)이다. W = tf.Variable(tf.random_normal([2, 1]), name='weight') b = tf.Variable(tf.random_normal([1]), name='bias') # 가설식 hypothesis = tf.sigmoid(tf.matmul(X, W) + b) # cost(loss) 함수 cost = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis)) # 경사 하강법 train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost) ## 여기까지가 학습을 위한 그래프를 만들었다. ## 예측한 값을 가지고 성공했는지 실피했는지 bianry 출력해야한다. ## hypothesis를 계산하면 0과 1사이의 값이기 때문에 분류의 기준을 0.5로 설정 ## 0.5보다 크면 성공, 작으면 실패 # cast() 메서드를 사용하면 결과값은 0.0 또는 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 tf.Session() as sess: # 변수 초기화 sess.run(tf.global_variables_initializer()) for step in range(10001): cost_val, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data}) if step % 2000 == 0: print(f"STEP = {step:06}, cost 함수값= {cost_val:1.14}") h, c, a = sess.run([hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data}) print(f"\n가설식의 값 = {h},\n실제의 값 = {c},\n정확도 = {a}")
결과값
STEP = 000000, cost 함수값= 0.53687995672226 STEP = 002000, cost 함수값= 0.3408930003643 STEP = 004000, cost 함수값= 0.25828701257706 STEP = 006000, cost 함수값= 0.20591051876545 STEP = 008000, cost 함수값= 0.17069421708584 STEP = 010000, cost 함수값= 0.14567981660366 가설식의 값 = [[ 0.0291514 ] [ 0.15663536] [ 0.29717436] [ 0.78491896] [ 0.94178247] [ 0.98091239]], 실제의 값 = [[ 0.] [ 0.] [ 0.] [ 1.] [ 1.] [ 1.]], 정확도 = 1.0
로지스틱 회귀 분류 모델을 실제 데이터에 적용하기
학습에 사용할 데이터는 파일로 불러온다.
- 당뇨병(diabete) 자료를 토대로 학습시켜 예측해보자.
import numpy as np xy = np.loadtxt('data-03-diabetes.csv', delimiter=',', dtype=np.float32) x_data = xy[:, 0:-1] y_data = xy[:, [-1]]
나머지 학습을 위한 코드는 이전과 동일!!!
- 데이터를 불러오는 부분만 우리가 잘 설계하면 된다!!!!
데이터의 변수 갯수가 몇 개인지 확인한 후에 모양(shape)을 정확하게 입력해야 한다.
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]] X = tf.placeholder(tf.float32, shape=[None, 8]) Y = tf.placeholder(tf.float32, shape=[None, 1]) W = tf.Variable(tf.random_normal([8, 1]), name='weight') b = tf.Variable(tf.random_normal([1]), name='bias') hypothesis = tf.sigmoid(tf.matmul(X, W) + b) cost = -tf.reduce_mean(Y*tf.log(hypothesis) + (1-Y)*tf.log(1-hypothesis)) train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost) predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32) accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32)) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) feed = {X: x_data, Y: y_data} for step in range(10001): sess.run(train, feed_dict=feed) if step % 2000 == 0: print(f"STEP = {step:06}, cost 합수값 = {sess.run(cost, feed_dict=feed)}") h, c, a = sess.run([hypothesis, predicted, accuracy], feed_dict=feed) print(f"\n가설식의 값 = {h},\n\n실제의 값 = {c},\n\n정확도 = {a}")
STEP = 000000, cost 합수값 = 1.585148811340332 STEP = 002000, cost 합수값 = 0.5984190106391907 STEP = 004000, cost 합수값 = 0.5360344648361206 STEP = 006000, cost 합수값 = 0.5096880793571472 STEP = 008000, cost 합수값 = 0.4965749979019165 STEP = 010000, cost 합수값 = 0.48917973041534424 가설식의 값 = [[ 0.43279484] [ 0.92194134] [ 0.15470713] [ 0.93848407] ... [ 0.72711807] [ 0.75625086] [ 0.78592217] [ 0.69465518] [ 0.8947171 ]], 실제의 값 = [[ 0.] [ 1.] [ 0.] [ 1.] [ 0.] ... [ 1.] [ 1.] [ 1.] [ 1.] [ 1.] [ 1.]], 정확도 = 0.7628458738327026
'모두를 위한 머신러닝' 카테고리의 다른 글
Lesson 5 연습 : Multinomial Classification: Softmax classification (0) | 2017.05.22 |
---|---|
Lesson 5 : Multinomial Classification: Softmax classification (0) | 2017.05.19 |
Lesson 4 : Logistic (regression) classification (0) | 2017.04.19 |
Lesson 3 연습 : Multi-variable Linear Regression (1) | 2017.04.16 |
Lesson 3 : Multi-variable Linear Regression (0) | 2017.04.16 |