binary classification์ ์ข ๋ฅ๊ฐ 2๊ฐ๋ก ๋๋์ด์ง ๋ฐ์ดํฐ๊ฐ ์๊ณ ์ด๋ฅผ ๋ถ๋ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
์ด ๋ฌธ์ ๋ ์์ธก ๊ฐ์ด ์ฐ์์ ์ธ ๊ฐ์ด ์๋ 0 ๋๋ 1์ ๋๋ค.
์์
์ด๋ฉ์ผ : ์คํธ์ธ๊ฐ / ์๋๊ฐ?
์จ๋ผ์ธ ๊ฑฐ๋: Fraudulent Financial Statement (FFS)์ธ๊ฐ / ์๋๊ฐ?
์ข ์ : ์ ์ฑ์ข ์(์)์ธ๊ฐ / ์์ฑ์ธ๊ฐ?
์ด๋๋ ์ฐ๋ฆฌ์ ์์ธก ๊ฐ์ ํ๋ฅ ๊ฐ์ผ๋ก ๋ง๋ ๋ค์์ ํ๋ฅ ๊ฐ์ด ์ฐ๋ฆฌ์ ๊ธฐ์ค๋ณด๋ค ๋์ผ๋ฉด 1, ์๋๋ฉด 0์ผ๋ก ๋ถ๋ฅํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ logistic regression์ด๋ผ๊ณ ํฉ๋๋ค.
๋๋๋ ์ข ๋ฅ๊ฐ 3๊ฐ์ด์์ด๋ฉด - multi classification
Logistic regression์ ์งํํ๊ธฐ ์ํด์๋ ์ถ๋ ฅ ๊ฐ์ 0๊ณผ 1์ ๊ฐ์ผ๋ก ๋ง์ถฐ์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด์ ์ฐ๋ฆฌ๋ logistic function ์ ์ฌ์ฉํฉ๋๋ค. Logistic function์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Logistic regression์ ์งํํ ๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๐ฅ, ์ค์ class ๊ฐ์ ๐ฆ, ์์ธก๋ ์ถ๋ ฅ ๊ฐ์ ๐ฆฬ ๋ผ๊ณ ํ๋ฉด ๐ฅ๋ ๋๊ฐ์ง ๋ณํ์ ๊ฑฐ์ณ์ ๐ฆฬ ๊ฐ ๋ฉ๋๋ค.
์ฐ๋ฆฌ์ ๋ชฉํ๋ ๐ฆฬ ๊ฐ ์ค์ ๐ฆ์ ๊ฐ์ฅ ๊ฐ๊น๊ฒ ๋๋๋ก ํ๋ ๐ค์ ๐๋ฅผ ์ฐพ๋ ๊ฒ ์ ๋๋ค.
Logistic function์ ์ฝ๋๋ฅผ ํตํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
import sympy
import numpy
from matplotlib import pyplot
%matplotlib inline
z = sympy.Symbol('z', real=True)
logistic = 1/(1+ sympy.exp(-z))
sympy.plotting.plot(logistic);
์ ๊ทธ๋ํ๋ฅผ ๋ณด๋ฉด ๐ง=0 ์ผ ๋ ์ถ๋ ฅ ๊ฐ์ด 0.5๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ์ผ ๋๋ 1์ ๊ฐ๊น์์ง๊ณ ์์์ผ ๋๋ 0์ผ๋ก ๊ฐ๊น์์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๐ง๊ฐ์ 0๊ณผ 1 ์ฌ์ด๋ก ํํํ ์ ์๊ฒ ๋์์ต๋๋ค.
์ด์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ง๋ค์ด์ ์งํํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
# synthetic data
x_data = numpy.linspace(-5, 5, 100)
w = 2
b = 1
numpy.random.seed(0)
z_data = w * x_data + b + numpy.random.normal(size=len(x_data))
y_data = 1 / (1+ numpy.exp(-z_data))
pyplot.scatter(x_data, y_data, alpha=0.4);
์ด์ ์ค์ class ๊ฐ์ ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค. Numpy ํจํค์ง ์์ where ํจ์๋ก 0.5 ๋ณด๋ค ํฐ ๊ฐ์ 1, ์์ ๊ฐ์ 0์ผ๋ก class๋ฅผ ๋ถ์ฌํด ์ฃผ๊ฒ ์ต๋๋ค.
y_data = numpy.where(y_data >= 0.5, 1, 0)
pyplot.scatter(x_data, y_data, alpha=0.4);
1.2 Logistic loss function
๐ฆฬ ๊ฐ ์ค์ ๐ฆ์ ๊ฐ์ฅ ๊ฐ๊น๊ฒ ๋๋๋ก ํ๋ ๐ค์ ๐๋ฅผ ์ฐพ์ผ๋ ค๋ฉด ์ฐ๋ฆฌ๋ cost function์ ์ ์ํด์ผ ํฉ๋๋ค.
Linear regression ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋๋ mean square error๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
ํ์ง๋ง logistic regression์ ์ ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
๊ธฐ์กด์ linear regression์์์ mean square error ์์๋
์ ํํ๋ฅผ ์ด๋ฃจ๊ณ ์์ด์ convex ํ ํํ๋ฅผ ์ด๋ฃจ๊ณ ์์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ logistic function์ ํฌํจํ logistic regression์์๋
๐์ธ logistic function ๋๋ฌธ์ ๋์ด์ convex ํ ํํ๊ฐ ์๋๋๋ค. ์์๋ฅผ ํตํด์ ์ convex๊ฐ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
๊ฐ๋จํ ์์๋ฅผ ์ํด ๐ค=1,๐=0์ผ ๋ 3๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํตํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
(๐ฅ,๐ฆ):(−1,2),(−20,−1),(−5,5) ์ผ ๋ cost function์ ๊ทธ๋ํ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
badloss = (2 - 1/(1+ sympy.exp(-z)))**2 + \
(-1 - 1/(1+ sympy.exp(-20*z)))**2 + \
(5 - 1/(1+ sympy.exp(-5*z)))**2
badloss
sympy.plotting.plot(badloss, xlim=(-1,1));
Gradient descent ๋ฐฉ์์ผ๋ก ์ cost function์ ์ต์๊ฐ์ ๊ตฌํ๊ฒ ๋๋ฉด ์ค๊ฐ์ ๊ธฐ์ธ๊ธฐ๊ฐ 0์ธ ์ง์ ์์ ๋ฉ์ถ๊ฒ ๋๊ณ , ์ฐ๋ฆฌ๋ ์ํ๋ ๊ฐ์ฅ ์์ ๊ฐ์ ๋๋ฌํ์ง ๋ชปํ๊ณ local minimum์ ๋๋ฌํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ mean square error๋ง๊ณ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด cost function์ ์๋ฏธ๋ฅผ ๋ค์ ํ๋ฒ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด๋ค ๊ฐ์ ์์ธกํ ๋ ๋ง์ด ํ๋ ธ๋ค๋ฉด, ์์ธกํ๋๋ฐ ์ฐ์ธ ๋ณ์๋ค์ ๋ง์ด ๋ฐ๊พธ์ด์ผ ํฉ๋๋ค. ๊ทธ์ ๋นํด ์กฐ๊ธ ํ๋ ธ๋ค๋ฉด, ์ด๋ฏธ ์ ์์ธกํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณ์๋ค์ ์กฐ๊ธ ๋ฐ๊พธ์ด์ผ ํฉ๋๋ค. ๋ง์ด ๋ฐ๊พธ๊ณ , ์กฐ๊ธ ๋ฐ๊พธ๋ ๊ฒ์ ๊ธฐ์ธ๊ธฐ์ ํฌ๊ธฐ๊ฐ ์ ํฉ๋๋ค. ์ด๋ฌํ ์๋ฆฌ๋ฅผ ์ฌ์ฉํด์ linear regression์์๋ square error๋ฅผ ์ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์๋ฆฌ๋ฅผ logistic regression์๋ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
๐ง=๐ค๐ฅ+๐ ์ผ ๋ cost function ๐ฟ์ b์ ๋ํด์ ๋ฏธ๋ถ์ ํด๋ณด๊ฒ ์ต๋๋ค. Chain rule์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
a, y = sympy.symbols('a y', real=True)
dLda = (y-a)/a/(1-a)
dLda
L = sympy.integrate(dLda, a)
L
sympy.simplify(L)
์ฌ๊ธฐ์ ๐=๐(๐ง)์ด๊ธฐ ๋๋ฌธ์ ๐<1์ด ๋ฉ๋๋ค. ๊ทธ๋์ log ์์ ๊ฐ์ด ์์๊ฐ ๋๋ฉด ์๋๊ธฐ ๋๋ฌธ์ ์์ ๋ณํํด ์ค๋๋ค.
L = -y*sympy.log(a) + (y-1)*sympy.log(1-a)
L
์ฐ๋ฆฌ๊ฐ ๊ตฌํ cost function์
sympy.plotting.plot(-sympy.log(a), xlim=(0,1));
์ค์ class ๊ฐ 1์ผ ๋ ์์ธก ๊ฐ์ด 0์ ๊ฐ๊น์์ง๋ฉด cost function๊ฐ์ด ์ปค์ง๊ณ , 1์ ๊ฐ๊น์์ง๋ฉด cost function์ด ์์์ง๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ์๋ ๋ชฉํํ๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
์ด์ ๐ฆ=0์ด๋ผ๋ฉด ๐ฟ=log(1−๐) ๋ง ๋จ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ๋ํ ๊ทธ๋ํ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
sympy.plotting.plot(-sympy.log(1-a), xlim=(0,1));
์ด๋ฒ์๋ ์์ธก๊ฐ์ด ์ค์ ๊ฐ์ด๋ ๊ฐ๊น์์ง๋ฉด cost function๊ฐ์ด ์์์ง๊ณ ๋ฉ์ด์ง๋ฉด ์ปค์ง๊ฒ ๋จ์ ์ ์ ์์ต๋๋ค.
1.3 Find the parameters using autograd function
์ด์ logistic regression์ ์ ์ฒด์ ์ธ ๊ณผ์ ์ ์ฝ๋๋ฅผ ํตํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ง๊ธ๊น์ง diff ๋ฅผ ํตํด์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์์ด ๋ณต์กํด์ง์๋ก ์๋๊ฐ ๋๋ ค์ง๊ธฐ ๋๋ฌธ์ autograd๋ฅผ ํตํด์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
# import the autograd-wrapped version of numpy
from autograd import numpy
# import the gradient calculator
from autograd import grad
# note: the namespace numpy is the autograd wrapper to NumPy
def logistic(z):
'''The logistic function'''
return 1 / (1 + numpy.exp(-z))
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 = logistic(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))
# get a function to compute the gradient of the logistic loss
gradient = grad(log_loss)
์ด ๋ grad ํจ์๋ ๋ณ์ ๊ฐ์๋งํผ output์ ๋ง๋ค๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๐ค,๐ 2๊ฐ์ ๋ณ์๊ฐ ์์ต๋๋ค. ๋จผ์ ์์๋ก ๋๋ค์ผ๋ก ์ด๊ธฐํํ ๋ณ์๋ฅผ ๋ฃ์ด์ ๊ธฐ์ธ๊ธฐ๊ฐ์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
numpy.random.seed(0)
params = numpy.random.rand(2)
gradient(params, logistic_model, x_data, y_data)
์ด๋ ๊ฒ 2๊ฐ์ ๋ณ์์ ๋ํด์ ๊ฐ๊ฐ ๊ธฐ์ธ๊ธฐ ๊ฐ์ ๋ฐํํด์ค๋๋ค.
์ด๋ฒ์ gradient descent ๋ฅผ ์งํํ ๋๋ ์๋ก์ด ์กฐ๊ฑด์ ์ถ๊ฐํด์ ์งํํ๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ํ ๋ฐ๋ณต ์ ์ธ์ ๊ธฐ์ธ๊ธฐ ๊ฐ์ด 0์ ๊ฐ๊น์์ง๋ฉด ๋์ด์ ๋ฐ๋ณต์ ํ์ง ์๋ ์กฐ๊ฑด์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค. 0์ ๊ฐ๊น์ด ๊ฐ์ ์ค์ ํ ๋ค ๊ทธ๊ฒ๋ณด๋ค ์์์ง๋ฉด while ๋ฌธ์ด ๋ฉ์ถ๋๋ก ์ค์ ํ์ฌ์ gradient descent ๋ฅผ ์งํํ๊ฒ ์ต๋๋ค.
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)
params = params - descent * 0.01
i += 1
print('Optimized value of w is {} vs. true value: 2'.format(params[0]))
print('Optimized value of b is {} vs. true value: 1'.format(params[1]))
print('Exited after {} iterations'.format(i))
pyplot.scatter(x_data, y_data, alpha=0.4)
pyplot.plot(x_data, logistic_model(params, x_data), '-r');
๋นจ๊ฐ์ ๊ณก์ ์ด ์ฐ๋ฆฌ์ ๋ชจ๋ธ์ ๋๋ค.
์ด์ ๊ธฐ์ค๊ฐ์ ์ ํ๊ณ ๊ทธ๊ฒ๋ณด๋ค ํฌ๋ฉด 1, ์์ผ๋ฉด 0์ผ๋ก ๋ถ๋ฅ๋ฅผ ํ๋ฉด ๋ฉ๋๋ค.
์ด๋ฒ์๋ 0.5๋ก ์ค์ ํด์ ์งํํ๊ฒ ์ต๋๋ค.
def decision_boundary(y):
return 1 if y >= .5 else 0
๋ชจ๋ ์ ์ ํจ์์ ๋ฃ์ด์ผ ํ๋๋ฐ ํ๋์ฉ ๋ฃ์ผ๋ฉด ๋ฐ๋ณต๋ฌธ์ ๋์์ผํด์ ์ค๋๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ numpy์ vectorize ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
decision_boundary = numpy.vectorize(decision_boundary)
def classify(predictions):
'''
Argument:
predictions, an array of values between 0 and 1
Returns:
classified, an array of 0 and 1 values'''
return decision_boundary(predictions).flatten()
pyplot.scatter(x_data, y_data, alpha=0.4,
label='true value')
pyplot.scatter(x_data, classify(logistic_model(params, x_data)), alpha=0.4,
label='prediciton')
pyplot.legend();
๊ฑฐ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ ์ ํํ๊ฒ ์์ธกํ ๊ฒ์ ์ ์ ์์ต๋๋ค.
'๋จธ์ ๋ฌ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ค์ค ๋ก์ง์คํฑ ํ๊ท (์ํํธ๋งฅ์ค ํ๊ท) (0) | 2022.12.05 |
---|---|
๋ก์ง์คํฑ ํ๊ท sklearn logistic regression iris python (0) | 2022.12.04 |
[๋จธ์ ๋ฌ๋3] Multiple Linear Regression ๋ค์ค์ ํํ๊ท python (0) | 2022.11.30 |
[๋จธ์ ๋ฌ๋2] Polynomial Regression python (0) | 2022.11.30 |
[๋จธ์ ๋ฌ๋1] ์ ํํ๊ท Linear Regression , gradient descent pyhton (0) | 2022.11.28 |