logistic regression
๋ก์ง์คํฑ ํ๊ท (logistic regression)
: ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง๋ฅผ ๊ตฌ๋ถ
์ฐธ(1) ๊ณผ ๊ฑฐ์ง(0) ์ฌ์ด๋ฅผ ๊ตฌ๋ถํ๋ s์ ํํ์ ์ ์ ๊ทธ์ด ์ฃผ๋ ์์
์๊ทธ๋ชจ์ด๋ ํจ์

a๋ ๊ทธ๋ํ์ ๊ฒฝ์ฌ๋๋ฅผ ๊ฒฐ์ , a๊ฐ ์ปค์ง๋ฉด ๊ฒฝ์ฌ๊ฐ ์ปค์ง๊ณ , a ๊ฐ์ด ์์์ง๋ฉด ๊ฒฝ์ฌ๊ฐ ์์์ง๋ค
b๋ ๊ทธ๋ํ์ ์ข์ฐ ์ด๋์ ์๋ฏธ, b ๊ฐ์ด ํด ๋ ์ข๋ก ์ด๋, b ๊ฐ์ด ์์์ง ๋ ์ฐ๋ก ์ด๋
a์ b์ ๊ฐ์ ๋ฐ๋ผ ์ค์ฐจ๊ฐ ๋ณํ๋ฉฐ, a ๊ฐ์ด ์์์ง๋ฉด ์ค์ฐจ๋ ๋ฌดํ๋๋ก ์ปค์ง๋ค.
๊ทธ๋ฐ๋ฐ a ๊ฐ์ด ์ปค์ง๋ค๊ณ ํด์ ์ค์ฐจ๊ฐ ๋ฌดํ๋๋ก ์ปค์ง์ง๋ ์๋๋ค
์๊ทธ๋ชจ์ด๋ ํจ์์์ a์ b์ ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ด๋ค
์ค์ ๊ฐ์ ๋ฐ๋ผ ์์ธก๊ฐ์ ๊ฐ๊น์ ์ง๋ฉด ์ค์ฐจ๊ฐ ์ปค์ง๊ฒ ๋๋๋ฐ, ์ด๋ ๊ณต์์ ๋ก๊ทธ ํจ์๋ฅผ ์ด์ฉํ๋ค
๋ก๊ทธ ํจ์

์ค์ ๊ฐ์ด 1์ผ ๋ -logh ๊ทธ๋ํ๋ฅผ ์ฐ๊ณ , 0์ผ ๋๋ -log(1 - h)๊ทธ๋ํ๋ฅผ ์จ์ผ ํ๋ค
์ค์ ๊ฐ์ด y ์ผ ๋, ์ด ๊ฐ์ด 1์ด๋ฉด, ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ์์ด์ง๊ณ ,
๋ฐ๋๋ก 0์ด๋ฉด ์ผ์ชฝ ๋ถ๋ถ์ด ์์ด์ ธ์ ์ค์ ๊ฐ์ ๋ฐ๋ผ์ ๊ทธ๋ํ๊ฐ ๋ณํ๋ค
์ฝ๋ฉ์ผ๋ก ํ์ธํ๋ ๋ก์ง์คํฑ ํ๊ท
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#๊ณต๋ถ์๊ฐ X์ ์ฑ์ Y์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.
data = [[2, 0], [4, 0], [6, 0], [8, 1], [10, 1], [12, 1], [14, 1]]
x_data = [i[0] for i in data] # ๊ณต๋ถ์๊ฐ
y_data = [i[1] for i in data] # ์ฑ์
#๊ทธ๋ํ๋ก ๋ํ๋ด ๋ด
๋๋ค.
plt.scatter(x_data, y_data)
plt.xlim(0, 15)
plt.ylim(-.1, 1.1)
# ๊ธฐ์ธ๊ธฐ a์ ์ ํธ b์ ๊ฐ์ ์ด๊ธฐํ ํฉ๋๋ค.
a = 0
b = 0
#ํ์ต๋ฅ ์ ์ ํฉ๋๋ค.(์์๋ก ์ ํจ)
lr = 0.05
#์๊ทธ๋ชจ์ด๋ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
def sigmoid(x):
return 1 / (1 + np.e ** (-x))
#๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์คํํฉ๋๋ค.
for i in range(2001):
for x_data, y_data in data:
a_diff = x_data*(sigmoid(a*x_data + b) - y_data) # a์ ๊ดํ ํธ๋ฏธ๋ถ, ์์จ ์ ์ํ sigmoid ํจ์ ์ฌ์ฉ
b_diff = sigmoid(a*x_data + b) - y_data # b์ ๊ดํ ํธ๋น๋ถ
a = a - lr * a_diff # a๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด, a_diff์ ํ์ต๋ฅ ์ lr์ ๊ณ ํฉ ๊ฐ์ a์์ ๋ป
b = b - lr * b_diff # b๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด, b_diff์ ํ์ต๋ฅ ์ lr์ ๊ณ ํฉ ๊ฐ์ b์์ ๋ป
if i % 1000 == 0: # 1000๋ฒ ๋ฐ๋ณต๋ ๋๋ง๋ค ๊ฐ x_data๊ฐ์ ๋ํ ํ์ฌ์ a๊ฐ, b๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
print("epoch=%.f, ๊ธฐ์ธ๊ธฐ=%.04f, ์ ํธ=%.04f" % (i, a, b))
# ์์ ๊ตฌํ ๊ธฐ์ธ๊ธฐ์ ์ ํธ์ ์ด์ฉํด ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค ๋ด
๋๋ค.
plt.scatter(x_data, y_data)
plt.xlim(0, 15)
plt.ylim(-.1, 1.1)
x_range = (np.arange(0, 15, 0.1)) #๊ทธ๋ํ๋ก ๋ํ๋ผ x๊ฐ์ ๋ฒ์๋ฅผ ์ ํฉ๋๋ค.
plt.plot(np.arange(0, 15, 0.1), np.array([sigmoid(a*x + b) for x in x_range]))
plt.show()
epoch=0, ๊ธฐ์ธ๊ธฐ=-0.0500, ์ ํธ=-0.0250
epoch=0, ๊ธฐ์ธ๊ธฐ=-0.1388, ์ ํธ=-0.0472
epoch=0, ๊ธฐ์ธ๊ธฐ=-0.2268, ์ ํธ=-0.0619
epoch=0, ๊ธฐ์ธ๊ธฐ=0.1201, ์ ํธ=-0.0185
epoch=0, ๊ธฐ์ธ๊ธฐ=0.2374, ์ ํธ=-0.0068
epoch=0, ๊ธฐ์ธ๊ธฐ=0.2705, ์ ํธ=-0.0040
epoch=0, ๊ธฐ์ธ๊ธฐ=0.2860, ์ ํธ=-0.0029
epoch=1000, ๊ธฐ์ธ๊ธฐ=1.4978, ์ ํธ=-9.9401
epoch=1000, ๊ธฐ์ธ๊ธฐ=1.4940, ์ ํธ=-9.9411
epoch=1000, ๊ธฐ์ธ๊ธฐ=1.4120, ์ ํธ=-9.9547
epoch=1000, ๊ธฐ์ธ๊ธฐ=1.4949, ์ ํธ=-9.9444
epoch=1000, ๊ธฐ์ธ๊ธฐ=1.4982, ์ ํธ=-9.9440
epoch=1000, ๊ธฐ์ธ๊ธฐ=1.4984, ์ ํธ=-9.9440
epoch=1000, ๊ธฐ์ธ๊ธฐ=1.4985, ์ ํธ=-9.9440
epoch=2000, ๊ธฐ์ธ๊ธฐ=1.9065, ์ ํธ=-12.9489
epoch=2000, ๊ธฐ์ธ๊ธฐ=1.9055, ์ ํธ=-12.9491
epoch=2000, ๊ธฐ์ธ๊ธฐ=1.8515, ์ ํธ=-12.9581
epoch=2000, ๊ธฐ์ธ๊ธฐ=1.9057, ์ ํธ=-12.9514
epoch=2000, ๊ธฐ์ธ๊ธฐ=1.9068, ์ ํธ=-12.9513
epoch=2000, ๊ธฐ์ธ๊ธฐ=1.9068, ์ ํธ=-12.9513
epoch=2000, ๊ธฐ์ธ๊ธฐ=1.9068, ์ ํธ=-12.9513

-๋ง์ฝ ์ฌ๊ธฐ์ ์ ๋ ฅ ๊ฐ์ด ์ถ๊ฐ๋์ด ์ธ๊ฐ ์ด์์ ์ ๋ ฅ ๊ฐ์ ๋ค๋ฃฌ๋ค๋ฉด, ์๊ทธ๋ชจ์ด๋ ํจ์๊ฐ ์๋๋ผ ์ํํธ๋งฅ์ค (softmax)๋ผ๋ ํจ์๋ฅผ ์จ์ผ ํ๋ค
Last updated
Was this helpful?