Kaist 머신러닝 엔지니어 부트캠프/Study

Logistic Regression

yssy431 2022. 5. 18. 22:12

Logistic Regression은 Binary Classification으로

결과값이 0,1로만 나오게 한다.

 

 

logistic function은 

해당 함수는 z의 값이 음의 무한대부터 양의 무한대까지의 모든 z의 값이 0~1 사이의 값으로 출력이 된다.

 

linear regression와 다른 cost function을 사용해야함

why?

 linear regression의 f(x)는 convex한 함수이지만

 logistic regression은 convex하지 않기에 gradient descent를 하던 도중 최소값이나 최대값에 갇힐 수가 있기 때문

그렇기에 새로운 cost function이 필요함. 

logistic regression out put은 오로지 0,1인 binary classification이기에 

y=1일 때, 예측값 σ(wx+b) 가 1에 가까워질 수록 cost function의  값이 작아져야하고 예측값이 틀렸다면

cost function의 값이 커야한다. 아래 log함수가 만족

 

L = -log(h)

y=1일 때, 예측값 σ(wx+b) 가 1에 가까워질 수록 cost function의  값이 커져야하고 예측값이 틀렸다면

cost function의 값이 작아져야 한다.

L = -log(1-h)

 

cost function은 아래와 같다, 

logistic regression의 cost function (y=0 , 1이기에 아래 성립)

w의 편미분 값

b는 weight의 vector에 추가하여 gradient descent를 진행

 

python code 부분

import sympy
import numpy

# synthetic data
x_data = numpy.linspace(-5, 5, 100)

#초기값 w = 2 , b = 1
w = 2 
b = 1
numpy.random.seed(0)
z_data = w * x_data + b + numpy.random.normal(size=len(x_data))
#z_data에 numpy.random.normal Noise 값을 추가 가우시안 분포에서의 랜덤 값

# y = 2x + 1 + Noise값

y_data = 1 / (1+ numpy.exp(-z_data))
y_data = numpy.where(y_data >= 0.5, 1, 0) # 0.5 보다 크면 1 작으면 0 으로 class 지정
pyplot.scatter(x_data, y_data, alpha=0.4);

dataset

from autograd import numpy
# import the gradient calculator
from autograd import grad 

def logistic_model(params, x):
    '''A prediction model based on the logistic function composed with wx+b
    Arguments:
       params: array(w,b) of model parameters
       x :  array of x data'''
    w = params[0]
    b = params[1]
    z = w * x + b
    y = 1 / (1 + numpy.exp(-z))
    return y

def log_loss(params, model, x, y):
    '''The logistic loss function
    Arguments:
       params: array(w,b) of model parameters
       model:  the Python function for the logistic model
       x, y:   arrays of input data to the model'''
    y_pred = model(params, x)
    return -numpy.mean(y * numpy.log(y_pred) + (1-y) * numpy.log(1 - y_pred))

gradient = grad(log_loss)
params = numpy.random.rand(2)
max_iter = 5000
i = 0
descent = numpy.ones(len(params))

while numpy.linalg.norm(descent) > 0.001 and i < max_iter:

    descent = gradient(params, logistic_model, x_data, y_data) #loss function의 output
    params = params - descent * 0.01 #가중치 업데이트
    i += 1

pyplot.scatter(x_data, y_data, alpha=0.4)
pyplot.plot(x_data, logistic_model(params, x_data), '-r')

w,b를 적용한 최종 model의 선

'Kaist 머신러닝 엔지니어 부트캠프 > Study' 카테고리의 다른 글

Machine learning training 과정  (0) 2022.05.19
Linear Regression  (0) 2022.05.18
Numpy 관련  (0) 2022.05.12
Python 관련  (0) 2022.05.12
딥러닝 최신 동향  (0) 2022.05.09