이번 시간은 앞서 배운 선형 회귀와는 다른 논리 회귀이다.
위 사진은 논리 회귀의 예를 보여준다
1) 스팸인지(1), 아닌지(0)
2) 페이스북 타임라인 올린정보를 보여줄지(1), 말지(0)
그중 한 예로 주식시장에서의 머신러닝 예제가 있다.
주식의 차트를 보고 살지(1), 팔지(0) 결정하는 예제 이다.
선형 회귀에 대한 언급이다.
논리 회귀가 되려면 H(x)값이 0또는 1이 되어야 한다.
하지만 H(x)값은 0또는 1이 아닌 값이 나오는 경우가 무수히 많다.
그러므로 밑에 사진과 같이
sigmoid 함수를 이용하여 값을 1또는 0으로 수렴시킨다.
z=WX, H(x)=g(z)라고 할때 g(z)=1/(1+e^-WX)가 된다.
가설함수가 선형함수에서 지수함수로 바꼈다.
비용함수는 선형함수^2에서 지수함수^2로 바뀌는것을 보여준다.
왼쪽은 ax^2형태의 포물선 그래프이므로 경사하강법을 통하여 cost가 0으로 수렴하는 w를 찾을 수 있다.(y축값=cost)
그러나 오른쪽은 지수함수^2 형태이므로 오른쪽 아래와같이 구불구불한 그래프가 된다.
오른쪽과 같이 sigmoid 함수를 사용하여 선형 회귀의 비용함수 최소화 방법을 사용하면 에러가난다.
앞선 강의에서 비용함수가 0에 수렴할수록 prediction값에 일치하는 경향을 보였다.
0과 1을 만들기 위한 cost function은 log형태가 취해져야한다.
그러므로 논리 회귀의 비용함수는 2가지 형태로 나뉘게 된다.
1) y=1일때 cost_val = -log(H(x))
H(x) -> 1(수렴), cost_val = 0
H(x) -> 0(수렴), cost_val = 1
2) y=0일때, cost_val = -log(1-H(x))
H(x) ->1(수렴), cost_val = 0
H(x) ->0(수렴), cost_val = 1
위 내용을 정리하여 비용함수를 나타냈다.
비용함수를 최소하 하기 위한 경사하강법 알고리즘.
선형회귀와 똑같이 비용함수를 미분하는 방법을 쓴다. (비용함수가 log형태로 달라짐. 경사하강법은 동일)
# Lab 5 Logistic Regression Classifier
import tensorflow as tf
tf.set_random_seed(777) # for reproducibility
#6행 2열의 x,y 데이터.
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노드에 대한 언급중 shape=[None, 2]는 None : 행이 n개이다. 2 : 열이 2개이다 라는 뜻.
X = tf.placeholder(tf.float32, shape=[None, 2])
Y = tf.placeholder(tf.float32, shape=[None, 1])
#가설함수는 W*X+b의 형태이다. x가 6행2열이면 W는 2행1열이 되어야 '행렬의 곱'과 'y값의 형태'를 맞출수있다.
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)))
#위에서 학습한 내용과 같이 sigmoid함수를 적용시킨다. sigmoid함수의 z값에 WX를 대입한다.
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으로 정의
train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)
# Accuracy computation
# True if hypothesis>0.5 else False
# 가설함수의 값이 0.5 이상이면 1 아니면 0 -> predicted로 정의
# predicted 값과 Y값을 비교하여 평균을 냄 -> accuracy로 정의
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())
#x_data, y_data를 넣고 cost를 train
#step과 cost를 출력
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
#X,Y노드에 각각 x_data, y_data를 넣고 가설함수, 예측값, 정확성을 각각 h,c,a로 정의
#가설함수, Y값, 정확성을 출력
#x_data를 통해 나온 hypothesis(h) 값을 0.5를 기준으로 1과 0으로 판별했을때(c) c값이 y값과 일치할 확률을 a라고 정의한다.
h, c, a = sess.run([hypothesis, predicted, accuracy],
feed_dict={X: x_data, Y: y_data})
print("\nHypothesis: ", h, "\nCorrect (Y): ", c, "\nAccuracy: ", a)
예를들어 위 코드를 실행하면 h값이 0,0,0,0,1,1 이 나왔을때 y값은 0,0,0,1,1,1 이므로
h값과 y값이 다른부분이 6군데중에 1군데 이므로 a값은 0.833333으로 출력된다.
'코딩이것저것' 카테고리의 다른 글
CNN_training test dataset, learning rate (0) | 2017.08.05 |
---|---|
CNN_Softmax classifier (0) | 2017.08.04 |
OCR_이미지를 텍스트로 변환 (0) | 2017.08.02 |
openCV_영상에서 fullbody 감지 (0) | 2017.08.02 |
CNN_multi-variable linear regression (0) | 2017.07.31 |