본문 바로가기
머신 러닝

09.Logistic Regression의 Cost 함수

by Jnamelight 2017. 12. 5.

가설이 Sigmoid 함수로 바뀌었다. 그러다 보니, H(x) 를 비롯한 cost function 역시 변화가 되었다.


원래의 cost 그래프는 이쁜 밥그릇 모양이었다, 하지만 sigmoid 함수를 통한 cost 그래프는 구불구불 밥그릇 모양이되었다.


따라서, 시작점에 따라 최솟점이 달라지는 문제가 발생!



이런 문제를 Logical minmum 문제라고 한다, ( 우리가 원하는것은 Golobal minimum )


즉 이방법으로는 더이상 cost 의 minimum을 구할 수 없다. 



그래서 나온 방법이.



이런식으로 로그를 이용하는 것이다.


로그의 장점은 1/e^n 을 상쇄시키는 역활을 하는 동시에 그래프 역시 이쁘게 만들어준다. 





김성훈교수님의 필기를 보면 쉽게 알수 있듯이 그래프 모양이 우리가 원하는 경사타고가기 좋은 그래프로 변화되는 것을 알수있다.


또한 y= 1 일떄 H(x) = 1 , cost  = 0 이 됨으로 우리가 원하는 답을 원했을때 cost 비용이 최소화가 되는 것을 확인할수있다.


반대도 마찬가지이다. 따라서 log 를 이용한다.  


결론적으로 cost 함수를 다시 정의 하자면.

이런식으로 깔끔하게(?) 정리가 된다.. 보기에는 어려워 보이지만 y에 따라서 앞과 뒤가 없어질수 있음으로.. 조금 쉽게 보일수있다.



그럼 실습 예제를 통해서 자세히 알아보자



실습( 당뇨병 걸릴 확률 첵크 하기 )


import tensorflow as tf

import numpy as np
tf.set_random_seed(777)  # for reproducibility

xy = np.loadtxt('data-03-diabetes.csv'
               , delimiter = ',', dtype = np.float32)

x_data = xy[:, 0:-1]  # 전체, 처음부터 ~ 마지막 한개를 제외한 부분을 가져옴
y_data = xy[:, [-1]]  # 전체에서 마지막 데이터만을 가져오곘다.


# X ,Y 행렬 정의
X = tf.placeholder(tf.float32, shape=[None,8])
Y = tf.placeholder(tf.float32, shape=[None,1])

# W , b 값 정의
W = tf.Variable(tf.random_normal([8,1]), name = 'weight')
b = tf.Variable(tf.random_normal([1]), name = 'bias')

# Hypothesis 정의
hypothesis = tf.sigmoid(tf.matmul(X,W)+ b)

# Cost 정의
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:
    # Initialize TensorFlow variables
    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 % 200 == 0:
            print(step, cost_val)

    # Accuracy report
    h, c, a = sess.run([hypothesis, predicted, accuracy],
                       feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ", h, "\nCorrect (Y): ", c, "\nAccuracy: ", a)


이런식의 코드이다. 결과를 보면

0 0.627097 200 0.612905 400 0.600593 600 0.589639 800 0.579837 1000 0.571044 1200 0.563138 1400 0.556015 1600 0.549585 ~~~~~ 생략 ~~~ 8600 0.481053 8800 0.480598 9000 0.480168 9200 0.479761 9400 0.479377 9600 0.479013 9800 0.478668 10000 0.478342 <- cost 가 점점 작아지는 것을 확인 할 수 있다.


Accuracy: 0.769433 <- 정확도 역시 75% 이상



조금더 학습을 시키면 더 좋아질듯?

그래서 학습횟수를 늘려봤더니 (2만번 학습시켰을때)

Accuracy: 0.774704


약 1퍼 센트 더 정확해졌다.



이건 중간에 에러가 났었는대 ... 한참을 찾았더니


hypothesis 구하는 과정에서 행렬 곱셈을 반대로 했더니.. 에러가 났던것이다. 


'머신 러닝' 카테고리의 다른 글

11.Soft_Regression 실습 (동물 구분하기)  (0) 2017.12.06
10.Soft_Regression  (0) 2017.12.06
08.Logistic Classification  (0) 2017.12.05
07.Multi_variable 실습  (0) 2017.12.04
06. Multi-variable linear regression  (0) 2017.12.03

댓글