코딩로그
5. logistic classification 본문
<Logistic classificaion 가설 함수>
- Binary classification : 0과1, pass와 non-pass 같이 특성에 따른 결과값을 두가지로 분류하는 것이다.
공부 시간에 따른 pass 와 fail을 위의 그래프로 나타내었다고 하자. 이걸 분류하려면 어떻게 해야할까?
이전에 배웠던 linear regression을 사용한다고 해보자
그럼 이와 같이 가장 cost를 최소화하는 hypothesis wx를 찾고, 0.5정도를 기준으로 해서
h(hours) < 0.5 면 fail로 h(hours)>0.5면 pass로 분류할 수 있을 것이다.
그런데 이런 식의 분류에는 두가지 문제점이 있다.
첫째, 예외적인 값에 의해 기준이 너무 쉽게 변한다는 것이다.
둘째, h(x) = wx+b라고 주면 ,값이 0과 1사이가 아닌 너무 크거나 작은 값이 나올 수 있다는 것이다.
첫번째 문제점에 대해 설명해보자.
만약 50시간을 공부한 학생이 있다고 하자. 그럼 이 학생은 당연히 pass를 받을 것이다.
그런데 이 학생으로 인해 wx의 값이 그림과 같이 큰폭으로 변하였다.
따라서 평균적으로 7시간 이상을 공부한 학생이 pass를 했다고 하면,
이제는 9시간을 공부해야 pass할 수 있도록 기준선이 크게 변해버린다.
두번째 문제점 같은 경우도 w가 3, b가 7이라하면 -7/3<x<-2인 범위 외에는 x값이 0보다 작거나 1보다 큰 문제가 발생한다.
- 따라서 이 두가지 문제점을 해결하기 위해 나온 함수가 sigmoid함수다.
-
sigmoid 함수 : $\ g\left ( z \right ) = \frac{1}{1+e^{z}}$
x가 무한대로 갈때 1에 수렴하고(1에 가까워지고 1이 되지는 않는다), 마이너스 무한대로 갈 때 0에 수렴한다.
또한 0.5에서 가장 큰 미분값을 가지므로 예외값에 영향을 덜 받는다.
-
Logistic hypothesis : $\ H\left ( X \right ) = \frac{1}{1+e^{-W^{T}X}}$
- 원래 시그모이드 함수의 z자리에 linear regression의 H(x) = wx를 대입시켜 이와 같은 결론을 도출한다.
<Logistic classificaion cost함수 설명>
- linear regression에서 사용했던 $\ cost\left ( W,b \right ) = \frac{1}{m}\sum_{i=1}^{m}\left ( H(x^{(i)})-y^{(i)} \right )^{2}$를 사용한다고 하면 완전히 볼록한 형태가 되지 않을 수도 있어 밑의 그림과 같은 지역최솟값 문제가 발생한다.
- 따라서 이와 같은 cost 함수를 사용한다.
- $\ C\left ( H(x),y \right ) = -ylog\left ( H(x) \right )-(1-y)log(1-H(x))$
- y가 1일때는 $\ -log(H(x))$, y가 0일때는 $\ -log(1-H(x))$가 되며, 따라서 효율적으로 최솟값을 구할 수 있는 logistic regression에서의 cost function이 완성되었다.
<실습>
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
x_data = [[1, 2],
[2, 3],
[3, 1],
[4, 3],
[5, 3],
[6, 2]]
y_data = [[0],
[0],
[0],
[1],
[1],
[1]]
#set X,Y,W,b
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')
# ** Hypothesis using sigmoid: tf.div(1., 1. + tf.exp(tf.matmul(X, W)))
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)
# ** cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) *
tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
# cast 기능 : 조건을 입력하면 True는 1을 False는 0을 casting한다.
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
# Accuracy computation : predicted와 y를 비교해 같으면 1 다르면 0 -> 이것들의 평균을 구한다.
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))
# Launch graph
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)
|
cs |
'코딩로그 > 모두를 위한 딥러닝' 카테고리의 다른 글
7-1. ML의 실용과 몇가지 팁 (0) | 2020.01.11 |
---|---|
6. softmax regression (0) | 2020.01.11 |
*tip* TensorFlow로 파일에서 데이터 읽어오기 (0) | 2020.01.10 |
4. multi-variable linear regression을 TensorFlow에서 구현하기 (0) | 2020.01.04 |
3. linear regression의 cost 최소화 알고리즘의 원리 (0) | 2020.01.04 |