우리가 지금까지 배운 Regression은 HCG를 사용하였다.
<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)>
이는 함수의 Y값을 압축시키는 함수로 주로 사용된다.
이때 g(H(x))를 마치 새로운 Hypothesis라고 생각하고 사용하는 것이다.
참고: 위의 T는 전치행렬을 의미한다(행, 열을 바꾸는 것).
<Logistic Function(sigmoid function)'s Cost function>
위에 보이는 Logistic(sigmoid) function의 (우리가 이때까지 배운)cost함수는 다음과 같다.
위 그래프를 보면 알 수 있듯이 이를 Cost함수로 사용하기에는 부적절하다.
때문에 Logistic Function에서의 Cost함수는 다음과 같이 정의한다.
이때 시그마의 위 아래 숫자는 생략한다.
y = 1 일때의 Cost 함수는 다음과 같다.
즉, 만약 y값이 1이라고 가정했을 때 경사하강법을 통해 최소값을 구할 수 있으므로 좋은 그래프의 모습을 보인다.
y = 0 일때의 Cost 함수는 다음과 같다.
즉, 만약 y값이 0이라고 가정했을 때 경사하강법을 통해 최소값을 구할 수 있으므로 좋은 그래프의 모습을 보인다.
이때 y값에 대한 if 조건을 없앤 식은 아래와 같다.
처음보는 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)
'AI > 모두를 위한 딥러닝 정리' 카테고리의 다른 글
Day7. learning rate, overfitting, regularization (0) | 2022.04.16 |
---|---|
Day6. Softmax (0) | 2022.04.11 |
Day4. multi-variable linear regression (0) | 2022.03.21 |
Day3. Gradient descent algorithm (0) | 2022.03.05 |
Day2. regression의 원리와 간단한 구현 (0) | 2022.02.28 |
댓글