본문 바로가기
머신러닝딥러닝/딥러닝

딥러닝(deeplearning) #4 - 로지스틱 회귀(logistic regression)

by orangecode 2022. 4. 12.
728x90

로지스틱 회귀(logistic regression)

회귀를 사용하여 데이터가 어떤 범주에 속할 확률이 0~1사이의 값으로 예측하고

예측 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도학습 알고리즘이다.

 

로지스틱 회귀는 참(1), 거짓(0)을 구분하는 S자 형태의 선을 그어주는 작업

 

시그모이드 함수(sigmoid function)

e = 2.71828... 자연상수라 불리는 무리수 = 파이와 비슷

 

구해야 하는 값 ax+b

a = 그래프의 경사도 (a값이 크면 경사도↑, a값이 작으면 경사도 ↓)

b = 그래프의 좌우 이동

 

출처 : 모두의 딥러닝

 

코딩으로 확인하기

# 라이브러리
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
tf.__version__

# 데이터 만들기
data = [[2, 0], [4,0], [6, 0], [8,1], [10,1], [12,1], [14,1]]
x_data = [x_row[0] for x_row in data]
y_data = [y_row[1] for y_row in data]

# ax+b
# a 기울기값, b = y절편값 설정
# random seed는 random으로 생성한 결과가 항상 같은 value를 갖도록 하는 방법
a = tf.Variable(tf.random.normal([1], dtype=tf.float64, seed=0))
b = tf.Variable(tf.random.normal([1], dtype=tf.float64, seed=0))

라이브러리와 데이터를 만든다.

사용 라이브러리 numpy, matplatlib, tensorflow

 

x_data = data 파일의 x 값 반복

y_data = data 파일의 y 값 반복

 

ax+b 구하기

a = 기울기 값, b = y절편 값

 

임의값 a, b 구하기

랜덤 데이터는 속성이 dtype = tf.float64인 1개의 값을 1~10개까지 생성하고 생성 값을 일정(seed)하게 한다.

Variable() = 변수값 설정
random.uniform() = 임의의 수를 생성해주는 함수 최소, 최대값만 적어줌

 

# 시그모이드 함수 작성하기
y = 1/(1+ np.e**(a* x_data + b))

시그모이드 함수 방정식

시그모이드 함수를 numpy 라이브러리를 이용해 작성

 

# 오차 = -평균(y*logh + (1-y)log(1-h)) 방정식 구현
# h = y, y_data = y
# treduce_mean() = 평균 구하기
loss = -tf.reduce_mean(np.array(y_data) * tf.log(y) + (1 - np.array(y_data)) * tf.log(1-y))

오차 구하기

출처 : 모두의 딥러닝

 

로그함수로 나타낸 a, b의 오차 함수를 방정식으로 나타내면 

오차 = -평균(y*logh + (1-y)log(1-h))
 
loss = -tf.reduce_mean(np.array(y_data) * tf.log(y) + (1 - np.array(y_data)) * tf.log(1-y))

- reduce mean() 함수 : 평균구하기

 

# 학습률 지정, 오차 최소화하는 값 찾기(경사하강법)
learning_rate = 0.5
gradient_decent = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

학습률 learning_rate = 기존 지점에서 움직이는 값

- 기울기 2.0, 학습률 0.01 → 경사스탭 0.02

 

경사하강법(GradientDescentOptimizer)

- 미분의 기울기를 이용해 기울기가 0인점을 찾아가는 방법

 

#결과값 출력하기
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for i in range(60001):
        sess.run(gradient_decent)
        if i % 6000 ==0: # i = 6000번이 될 때마다 결과값 print
            print("Epoch: %.f, loss = %.04f, 기울기 a = %.4f, y 절편 b = %.4f" % (i, sess.run(loss),sess.run(a),sess.run(b)))
(tf.global_variables_initializer()) = 변수값 초기화
tensorflow에서 변수형은 그래프를 실행하기 전, 변수값을 초기화해야 값이 변수에 지정된다.
 
tf.global_variables_initializer() 선언 전까지 y의 값이 지정되어 있지 않다.
 
따라서 Session 시행 시 변수에 대한 초기화를 먼저 해야한다.
 
6000번씩 시행하여 i = 6000 일 때마다결과값(Epoch, loss, a, b 값)을 출력한다.

 

 

모르는 용어

- seed = random seed는 random으로 생성한 결과가 항상 같은 value를 갖도록 하는 방법

 

- 학습률 learning_rate = 기존 지점에서 움직이는 값

- 기울기 2.0, 학습률 0.01 → 경사스탭 0.02

 

- reduce mean() 함수 : 평균구하기

- tf.global_variables_initializer() = 변수값 초기화

 

 

반응형

댓글