티스토리 뷰

모두의 딥러닝

Logistic (Regression) Classification

강의-1

이번 강의는 Logistic Regression Classification 대해 설명을 한다. 무엇이냐 하면, 데이터를 통해 Binary 1 또는 0으로 분류를 하는 학습이라고 생각하면 된다.

강의 초반에는 계속적으로 Hypothesis Cost 그리고 Gradient decent 대해 설명을 한다.

그리고 이전에 배웠던 Linear regression으로 분류를 시도? 한다. 분포도가 작은 경우는 다음과 같이 분류가 가능하다. 그러나, 분포도가 경우, 다음과 같이 분류 하기가 힘들어 보인다.


Binary 분류하기 위해서는 해당 데이터가 1인지 0인지에 대해서만 알면 된다. 그러나 Linear regression 1보다 크거나 0보다 작은 경우의 수가 너무 많다. 그래서 위의 이미지와 같이 Hypothesis 분류하기가 어렵다.

그래서 Logistic Hypothesis 만든다. 값들을 0~1사이의 값들로 만들기 위해.


우선 기존의 Hypothesis z=H(x) 두었을 , 특정 함수g(z) z값을 넣었을 , 0~1사이의 값이 나오면 된다.

그러한 함수가 바로 sigmoid라는 함수이다.

보이는 것과 같이 sigmoid함수는 z값이 어느 또는 작은 값이 오더라도 0~1사이에 존재한다.

그래서 다음과 같은 Logistic Hypothesis 나오게 된다.

부가적으로 e 대해 설명하면, 자연상수라 부르고 무한소수(2.xxxx)이다. Z값이 커지면 자연상수의 –z승이 되므로, 0 가깝게된다. 그리고 Z값이 음수로가면 자연상수의 z승이되므로 값이 커지게 되어 무한대에 가깝게 된다. 그래서 최종적으로 Logistic Hypothesis e값에 따라 1 또는 0으로 정해진다.

 

강의-2

이번 동영상은 강의가 1편과 2편으로 나누어져 있다.

2편의 내용은 Cost 함수를 구하는 방법에 대해 강의를 하고 있다.

Logistic Classification 기존의 Linear regression Hypothesis 달라지다 보니, 기존의 Cost 함수를 적용하면 오른쪽 아래와 같이 이상한? 형태의 그래프가 생긴다.

이런 그래프에서 우리가 지금까지 배웠던 Gradient decent 알고리즘을 적용하여, 계산을 하다보면, 최저 비용의 값을 찾지 못했는데 어디서 시작하느냐에 따라 최저 비용의 Hypothesis 찾지 못하는 경우가 발생한다. 예전 강의에서 강조했듯이, Gradient decent 알고리즘을 적용하기 위해선 Cost함수가 원형(bowl) 같은 형태가 되어야 된다. 그래야 기울기를 통해 점점 최저값으로 찾아가기 때문이다.

그래서 Logistic classification에서는 다음과 같은 새로운 Cost 함수를 사용한다.

해당 함수를 살펴보면, y값이 1 경우와 0 경우, 다른 그래프를 사용하고 있는 있다.

가로축을 H(x)라하고 세로축을 Cost비용이라고 했을 경우, y 1이라고 하는 그래프는 왼쪽 그래프이다. 값을 대입해보자. H(x) 1 경우, Cost함수의 값이 0이라는 있다. 반대로 H(x) 0이라고 가정하는 경우, Cost 함수의 값이 무한대로 커지는 있다. 다음으로 y 0 그래프는 오른쪽 그래프인데, H(x) 1인경우, 무한대로 커지고, H(x) 0 경우 0이라는 있다. 우리는 지금 까지 학습이 잘됐다는 기준을 cost함수의 값이 어떠냐에 따라 판단을 하였다. 그래서 해당 Cost함수는 정답인 경우, 0이고, 오답인 경우, 무한대로 값을 줘서 패널티를 주는 형태의 그래프라고 설명을 하고 있다.

Y값에 따라 Cost함수를 변경해 있지만(if문을 사용해서) 그러면 소스코드가 지저분?해질 있고, 복잡? 해지기 때문에 다음과 같이 줄로 나타낼 있다.

그래서 해당 Cost 함수를 사용하여 Gradient decent 적용시키면 다음과 같다. 교수님은 해당 Cost함수의 미분은 복잡하기 때문에, 미분하는 부분에 대해서는 생략을 하신다. 그리고 Tensorflow에서 미분을 해주기 때문에, 중요한 부분이라고 강조를 안하신다.

최종적인 Gradient decent 알고리즘을 적용하는 소스코드와 Cost함수 그리고 미분한 값들을 식으로 나타내고 있다.

 

Lab

이번에는 직접 텐서플로우로 Logistic classification 구현해보겠다.

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(
dtype=tf.float32, shape=[None, 2])
Y = tf.placeholder(
dtype=tf.float32, shape=[None, 1])

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

# Logistic Classification Hypothesis 기존의 Hypothesis sigmoid 추가해준다.

# 다음과 같이 직접 sigmoid함수를 구현할 있다.

# hypothesis = tf.div(1, 1 + tf.exp(tf.matmul(X, W) + b))
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)

# Y값에 따라 Cost 함수가 달라지므로, 다음과 같이 처리하였다.
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))

optimizer = tf.train.GradientDescentOptimizer(
learning_rate=1e-2)
train = optimizer.minimize(cost)

# binary 분류하기 위해, 0.5 기준으로 1 0으로 분류를 한다.
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)

# 데이터가 정확한지 확인하기 위해, Hypothesis값과 Y값을 비교하여 확률을 계산한다.
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for step in range(20001):
    cost_
, _ = sess.run([cost, train], feed_dict={X: x_data, Y: y_data})

   
if step % 200 == 0:
       
print(step, "Cost: ", cost_)

h
, p, a = sess.run([hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data})
print("Hypothesis: ", h, " Predicted: ", p, " Accuracy: ", a)

 

결과값



 

이전 강의에서 배웠던, 파일로 데이터를 불러와 Logistic classification 학습 시켜보자.

import tensorflow as tf
import numpy as np

# numpy 이용하여 데이터를 가져온다.
xy = np.loadtxt('diabetes.csv', delimiter=',', dtype=np.float32)

# numpy 방식에 따라 데이터를 자른다.
#
행은 none이기때문에 : 처리하였고, 부분은 마지막꺼를 나머지 데이터가 필요하므로 X -1까지 배열화 시키고 Y -1데이터만 가지고 온다.
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]), dtype=tf.float32, name='weight')
b = tf.Variable(tf.random_normal([
1]), dtype=tf.float32, 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=1e-2).minimize(cost)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

predicted = tf.cast(hypothesis >
0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted
, Y), dtype=tf.float32))

for step in range(20001):
    cost_
, hy_, _ = sess.run([cost, hypothesis, train], feed_dict={X: x_data, Y: y_data})

   
if step % 400 == 0:
       
# print(step, "cost: ", cost_, "hypothesis: ", hy_)
       
print(step, "cost: ", cost_)

a = sess.run([accuracy]
, feed_dict={X: x_data, Y: y_data})
print("Acuuracy: ", a)

 

이전 강의에서 가르쳤던 부분만 사용하기 때문에, 크게 어려운 내용이 없다.

결과값


댓글
공지사항
최근에 올라온 글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함