이번 포스트는 Logistic Classification에 대해서 다루도록 하겠습니다.
본론에 들어가기 앞서, 이전의 Linear Regression에 대해서 Remind해보겠습니다.
Linear regression에서는 가설을 H(x) = WX + b 로 세웠고,
여기에 대해서 Cost function과 이 Cost를 minimize하기 위해 Gradient decent라는 optimizer를 사용하였습니다.
이 것 세가지만 있으면 Linear Regression을 잘 이해할 수 있고, 구현할 수 있습니다.
Classification도 이것과 굉장히 유사합니다.
Classification이 다른 점은 이전의 Regression이 어떤 numeric한 변수를 예측하는 것이었다면,
Classification은 어느 카테고리에 속하는지를 예측하는 것입니다.
오늘은 Classification 중 Binary Classification을 특정하도록 하겠습니다.
Binary Classification은 두 가지 요소를 가진 Categorical 변수를 예측하는 것입니다.
예시1)
메일을 받을 때 스팸메일인지 아닌지에 대해서 예측하는 기능을 사용합니다.
예시2)
페이스북 피드에서 해당 사용자에 대해 보여줄지 숨길지에 대해서 예측하여 사용합니다.
위에서의 예시처럼 두가지 카테고리로 예측하는 것이 Binary Classification인데
예시1)에서는 스팸메일인지를 1로, 아닌지를 0으로
예시2)에서는 보여줄지를 1로, 숨길지를 0으로 두고 학습과 예측을 하게 됩니다.
Linear Regression의 방법을 가지고 이 Classification을 생각해보겠습니다.
학생들의 공부시간과 수업의 Pass/Fail에 대한 데이터가 있습니다.
이 데이터를 공부시간에 따른 수업의 통과 여부에 대해서 학습을 시키고자합니다.
데이터를 그래프로 나타내었을 때, WX를 위와 같이 표현해볼 수 있습니다.
그러나 만약 50시간 공부한 학생이 통과를 했다면, 다른 기울기의 선이 그려지게되는데,
이 때 0.5를 판단기준으로 한다면, 통과한 학생중 가장 적은 공부시간을 가진 학생은
Fail으로 판단될 가능성이 있습니다.
즉, 어떤 데이터들이 합격을 했음에도 불합격을 했다고 예측을 하게되는 것입니다.
그리고 또한 Linear Regression의 가설인 H(x) = Wx + b는 0~1 사이의 값이 나오지 않을 수 있기 때문에
그대로 모델에 적용시키기 힘든 점이 있습니다.
따라서 이 Linear Regression의 가설을 0~1 사이의 범위로 만들기 위해서
새로운 가설을 세우게 됩니다.
위의 z는 Linear Regression의 가설이고, 이 z를 변환하는 g가 만들어집니다.
따라서 Logistic Classification에 사용되는 가설은
과 같이 세워지게 됩니다.
Logistic Classification의 가설을 세웠으니, 이제 Cost function을 알아보도록 하겠습니다.
이전 Linear Regression에서 사용했던 Cost function에 적용을 그대로 적을 시켜본다면, 다음과 같은 그래프를 얻을 수 있습니다.
Linear Regression의 경우에는 Cost의 그래프가 최소인 점을 항상 찾기 쉽게 되어있습니다.
그러나 Logistic Classification의 가설을 cost function에 대입하게 된다면,
우측과 같은 구불구불한 그래프를 얻을 수 있습니다.
Linear Regression에 사용했던 Gradient Descent 알고리즘을 사용하면,
오른쪽 그래프에서는 시작점에 따라 최소인 점이 다르게 구해집니다.
그림에서처럼 가장 왼쪽의 시작점에서 출발한다면 어떠한 최소점을 구하게되는데,
이 때 구해진 값을 Local min이라고 합니다.
즉 전체의 최소값이라기 보단 그 local의 최소라고 할 수 있습니다.
반대로 전체의 최소값은 Global min이라고 합니다.
결과적으로 이 Cost function은 Logistic Regression에 그대로 사용하기는 어렵다고 생각이 됩니다.
우선 제안하는 Cost function은 다음과 같습니다.
그럼 왜 이런 Cost function을 제시했을까요?
직관적으로 생각해보면, 우선 Logistic Classification에서 가설은 다음과 같습니다.
그렇다면 이를 그래프로 생각을 해보면, 다음과 같은데
실제로 우리가 예측한 값이 맞다면 Cost가 0이 되고, 예측이 틀리게 된다면 cost가 굉장히 높아지게 됩니다.
그러한 과정들을 위의 슬라이드에서 나타내고 있습니다.
따라서 위의 가설을 세우게 되었고, 이를 정리하면
라고 할 수 있습니다.
결국 이 가설에 의하면 Gradient Descent Optimizer를 사용하여 학습이 가능하게 됩니다.
Logistic Classification에 대한 가설, Cost, 그리고 옵티마이저를 생각해보았습니다.
그렇다면 앞에서와 같이 Logistic Classification에 대해서 모든 내용을 알아보았습니다.
그럼 이제 이 Logistic Classification을 학습하는 방법에 대해서 알아봅니다.
우선 학습할 데이터를 정의해줍니다.
x_data = [[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]]
y_data = [[0], [0], [0], [1], [1], [1]]
# placeholders for a tensor that will be always fed.
X = tf.placeholder(tf.float32, shape=[None, 2])
Y = tf.placeholder(tf.float32, shape=[None, 1])
다음은 학습에 대한 W와 b, 그리고 가설과 cost, train에 대해서 설정을 합니다.
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)
# Accuracy computation
# True if hypothesis>0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
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)
이 소스를 실행하면
0 1.15598
200 0.686451
400 0.535824
600 0.471086
800 0.436431
1000 0.413566
1200 0.396041
1400 0.38129
1600 0.368182
1800 0.356177
2000 0.344994
2200 0.33448
2400 0.32454
2600 0.315114
2800 0.306157
3000 0.297635
3200 0.28952
3400 0.281785
3600 0.274409
3800 0.267371
4000 0.260651
4200 0.25423
4400 0.248093
4600 0.242223
4800 0.236605
5000 0.231224
5200 0.226069
5400 0.221126
5600 0.216383
5800 0.211831
6000 0.207458
6200 0.203255
6400 0.199213
6600 0.195324
6800 0.191579
7000 0.187972
7200 0.184495
7400 0.181142
7600 0.177907
7800 0.174783
8000 0.171766
8200 0.16885
8400 0.166031
8600 0.163304
8800 0.160664
9000 0.158108
9200 0.155633
9400 0.153233
9600 0.150907
9800 0.14865
10000 0.14646
Hypothesis: [[ 0.02947398]
[ 0.15709515]
[ 0.29874834]
[ 0.78419107]
[ 0.94133139]
[ 0.9807598 ]]
Correct (Y): [[ 0.]
[ 0.]
[ 0.]
[ 1.]
[ 1.]
[ 1.]]
Accuracy: 1.0
이런 결과가 출력되어 나옵니다.
Cost가 점점 줄어드는 모습을 확인할 수 있고,
예측값과 실제로 잘 학습된 모습을 확인할 수 있습니다.
'AI > Lecture notes' 카테고리의 다른 글
[ML lec 07] Application & Tips (0) | 2017.07.25 |
---|---|
[ML lec 06] Softmax Regression (0) | 2017.07.21 |
[ML lec 04] multi-variable linear regression (*new) (0) | 2017.07.17 |
[ML lec 03] Linear Regression의 cost 최소화 알고리즘의 원리 설명 (0) | 2017.07.15 |
[ML lec 02] Linear Regression (1) | 2017.07.06 |