Logistic regression 과정
Updated:
1. Module import
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
2. Data 준비
따로 파일은 없고 아래와 같은 데이터를 직접 입력하여 사용하겠다.
공부 시간 | 어학연수 기간 | 시험성적 |
---|---|---|
1 | 1 | Fail( 0 ) |
2 | 0 | Fail( 0 ) |
5 | 1 | Fail( 0 ) |
2 | 3 | Pass( 1 ) |
3 | 3 | Pass( 1 ) |
8 | 1 | Pass( 1 ) |
10 | 0 | Pass( 1 ) |
Train data
x_data = [[1,1],
[2,0],
[5,1],
[2,3],
[3,3],
[8,1],
[10,0]]
y_data = [[0],[0],[0],[1],[1],[1],[1]]
3. Machine learning: 설정
1) Placeholder
X = tf.placeholder(shape=[None,2],dtype=tf.float32)
Y = tf.placeholder(shape=[None,1],dtype=tf.float32)
2) Weight, bias
W = tf.Variable(tf.random_normal([2,1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')
3) Hypothesis
기존에 H 라고 가설을 설정했다. 시그모이드를 이용해서 곡선의 가설을 잡을 때는 logit으로 설정한다.
- logit = tf.matmul( X, W ) +b
- logistic regression 가설을 의미
- matmul은 매트릭스 곱셈을 의
- H = tf.sigmoid( logit )
- 시그모이드 함수를 이용해 가설을 설정
개념 | 설명 |
---|---|
Sigmoid | Softmax의 특수 케이스로 클래스 갯수만 2개일 뿐 같은 연산을 수행 |
Softmax | 한 데이터, object가 동시에 여러 클래스를 가지는 멀티레이블에서 사용 |
Logits | softmax, sigmoid지나기 전 단계, model의 raw output을 의미 |
logit= tf.matmul(X,W) + b
H = tf.sigmoid(logit) # sigmoid를 이용해서 곡선으로표현
시그모이드 함수 곡선의 가설
4) Cost function
가설이 변경되었기 때문에 cost 함수 또한 변경된다. 일반적으로 tensorflow에서 제공하는 함수를 사용한다.
두 인자, logits
와 labels
가 들어간다. log 함수를 통해 그래프를 매끈하게 펴주고, 이를 미분함으로써 (최소 제곱법 이용) 최솟값을 찾을 수 있게 된다.
- cost = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits( logits = logit, labels = Y ))
cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = logit, labels=Y))
5) Train data
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1 )
train = optimizer.minimize(cost)
6) Session, 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())
4. Machine learning: 학습
for step in range(3000):
_, cost_val = sess.run([train, cost], feed_dict={X: x_data,
Y: y_data})
if step % 300 == 0:
print(f'cost값은:{cost_val}')
# cost값은:1.894262433052063
# cost값은:0.36012598872184753
# cost값은:0.2540614902973175
# cost값은:0.21127891540527344
# cost값은:0.1861618608236313
# cost값은:0.16863754391670227
# cost값은:0.15521176159381866
# cost값은:0.1443301886320114
# cost값은:0.13518328964710236
# cost값은:0.1273004114627838
5. Machine learning: 예측
result = sess.run(H, feed_dict={X: [[4,1]] })
print(result)
if result > 0.5:
print(f'시험에 통과: {result}')
else:
print(f'시험에 떨어짐: {result}')
# [[0.18584761]]
# 시험에 떨어짐: [[0.18584761]]