본문 바로가기
AI/모두를 위한 딥러닝 정리

Day5. Logistic Classification과 Logistic Regression

by reindeer002 2022. 4. 1.
728x90

우리가 지금까지 배운 Regression은 HCG를 사용하였다.

G에서 알파는 gradient descent를 하는 step의 사이즈


<Binary Classification>

이진 분류에서 나타나는 문제가 존재함

Problem1. 새로운 데이터가 추가되면서 H가 변하고 이로 인해 기존에 올바르게 판단되던 값이 올바르지 않게 판단됨

예를 들어 0, 1 encoding이 있다고 할 때,

다음과 같이 극도로 높은 X값을 지닌 새로운 데이터가 들어오면,
기존에 pass를 받던 데이터들이 모두 fail을 받게 될 확률이 존재함

 

Problem2. H가 개발자가 의도한 값의 범위를 넘어설 수 있음

예를 들어 H(x) = Wx + b에서 H값을 0, 1로 정했을 때
위 그림의 식에서 입력으로 들어오는 X값이 100이 된다면
그 값이 1을 넘게 되면서 의도하지 않은 값이 나오게 되므로 분석에 문제가 발생함

이러한 문제를 해결하기 위해 Logistic Function(sigmoid function)을 사용하기로 함


<Logistic Function(sigmoid function)>

S 모양을 나타냄

이는 함수의 Y값을 압축시키는 함수로 주로 사용된다.

다음과 같이 압축함

이때 g(H(x))를 마치 새로운 Hypothesis라고 생각하고 사용하는 것이다.

참고: 위의 T는 전치행렬을 의미한다(행, 열을 바꾸는 것).


<Logistic Function(sigmoid function)'s Cost function>

위에 보이는 Logistic(sigmoid) function의 (우리가 이때까지 배운)cost함수는 다음과 같다.

위치에 따라 최소값이 변함

위 그래프를 보면 알 수 있듯이 이를 Cost함수로 사용하기에는 부적절하다.

때문에 Logistic Function에서의 Cost함수는 다음과 같이 정의한다.
이때 시그마의 위 아래 숫자는 생략한다.

Logistic function에서의 Cost function

y = 1 일때의 Cost 함수는 다음과 같다.
즉, 만약 y값이 1이라고 가정했을 때 경사하강법을 통해 최소값을 구할 수 있으므로 좋은 그래프의 모습을 보인다.

-log⁡(H(x))

y = 0 일때의 Cost 함수는 다음과 같다.
즉, 만약 y값이 0이라고 가정했을 때 경사하강법을 통해 최소값을 구할 수 있으므로 좋은 그래프의 모습을 보인다.

-log⁡(H(x))

이때 y값에 대한 if 조건을 없앤 식은 아래와 같다.

if 조건을 없앤 식
Gradient descent에 사용될 식


처음보는 cast 함수의 기능을 잘 보며 코드를 분석하길 바람

import numpy as np
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

# 만약 csv를 사용한다면 shape의 정보가 바뀌어야 함
# (예를 들어 x값이 5개라면 placeholder의 값이 5로 변경되어야 함)
# xy = np.loadtxt('data-03-diabetes.csv', delimiter=',', dtype=np.float32)
# x_data = xy[:, 0:-1]
# y_data = xy[:, [-1]]

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])

W = tf.Variable(tf.random_normal([2, 1]), name ='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

#sigmoid 함수를 사용하여 hypothesis를 제작
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)

#만약 조건식이 True라면 1.0이 반환되고 False라면 0.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 % 200 == 0:
            print(step, cost_val)
            
    h, c, a = sess.run([hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data})
    print("\nhypothesis:", h, "\nCorrect (Y):", c, "\nAccuracy:", a)

 

728x90

댓글