๋”ฅ๋Ÿฌ๋‹/Today I learned :

[๋”ฅ๋Ÿฌ๋‹] ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€(logistic regression)

์ฃผ์˜ ๐Ÿฑ 2021. 3. 17. 09:37
728x90
๋ฐ˜์‘ํ˜•

๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์˜ ๋ชฉ์ ์€ ์ผ๋ฐ˜์ ์ธ ํšŒ๊ท€ ๋ถ„์„์˜ ๋ชฉํ‘œ์™€ ๋™์ผํ•˜๊ฒŒ ์ข…์† ๋ณ€์ˆ˜์™€ ๋…๋ฆฝ ๋ณ€์ˆ˜๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ตฌ์ฒด์ ์ธ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ด์–ด ํ–ฅํ›„ ์˜ˆ์ธก ๋ชจ๋ธ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 ์„ ํ˜• ํšŒ๊ท€ ๋ถ„์„๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ข…์† ๋ณ€์ˆ˜๊ฐ€ ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ฉฐ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํŠน์ • ๋ถ„๋ฅ˜๋กœ ๋‚˜๋‰˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ข…์˜ ๋ถ„๋ฅ˜ (classification) ๊ธฐ๋ฒ•์œผ๋กœ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 


ex) ์ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ฉ๊ฒฉ ๋ถˆํ•ฉ๊ฒฉ๋งŒ ๋ฐœํ‘œ๋˜๋Š” ์‹œํ—˜
๊ณต๋ถ€ํ•œ ์‹œ๊ฐ„ 2 4 6 8 10 12 14
์‹œํ—˜ ๊ฒฐ๊ณผ ๋ถˆํ•ฉ ๋ถˆํ•ฉ ๋ถˆํ•ฉ ํ•ฉ๊ฒฉ ํ•ฉ๊ฒฉ ํ•ฉ๊ฒฉ ํ•ฉ๊ฒฉ

๊ณต๋ถ€ํ•œ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ํ•ฉ๊ฒฉ ์—ฌ๋ถ€

 

 

ํ•ฉ๊ฒฉ์„ 1 ๋ถˆํ•ฉ์„ 0์ด๋ผ๊ณ  ํ•˜๊ณ  ์ขŒํ‘œ ํ‰๋ฉด์— ๋‚˜ํƒ€๋‚ด๋ฉด ์ง์„ ์˜ ์ผ์ฐจ๋ฐฉ์ •์‹์„ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค.

์ ๋“ค์˜ ํŠน์„ฑ์„ ๋‹ด์•„๋‚ด๋ ค๋ฉด ์ฐธ(1)๊ณผ ๊ฑฐ์ง“(0)์„ ๊ตฌ๋ถ„ํ•˜๋Š” Sํ˜•ํƒœ์˜ ์„ ์„ ๊ธ‹๋Š”๊ฒŒ ์ ์ ˆํ•˜๋‹ค - ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜

 

 

y๊ฐ’์ด 0๊ณผ 1 ์‚ฌ์ด

 

 

์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜๋กœ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ํ‘ธ๋Š” ๊ณต์‹ : 

 

a = ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์‚ฌ๋„

a๊ฐ€ ์ปค์ง€๋ฉด ๊ฒฝ์‚ฌ๋„ ์ปค์ง„๋‹ค.  b๋Š” ๊ทธ๋ž˜ํ”„์˜ ์ขŒ์šฐ์ด๋™์„ ์˜๋ฏธ

 

 

 

 

 

a์™€ b ๊ฐ’์— ๋”ฐ๋ผ ์˜ค์ฐจ๋Š” ๋ณ€ํ™”ํ•œ๋‹ค.

 

  • a๊ฐ’์ด ์ž‘์•„์ง€๋ฉด(0์— ๊ฐ€๊นŒ์›Œ์ง€๋ฉด) ์˜ค์ฐจ๋Š” ๋ฌดํ•œ๋Œ€๋กœ ์ปค์ง€์ง€๋งŒ, a๊ฐ€ ์ปค์ง„๋‹ค๊ณ  ํ•ด์„œ ์˜ค์ฐจ๊ฐ€ ์—†์–ด์ง€์ง€๋Š” ์•Š๋Š”๋‹ค.
  • b๊ฐ’์ด ๋„ˆ๋ฌด ์ž‘๊ฑฐ๋‚˜ ํฌ๋ฉด ์˜ค์ฐจ๋„ ์ด์— ๋”ฐ๋ผ ์ปค์ง„๋‹ค.

 

์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜์—์„œ a์™€ b์˜ ๊ฐ’์€ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์„ ํ†ตํ•ด ๊ตฌํ•œ๋‹ค

๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• = ๋จผ์ € ์˜ค์ฐจ๋ฅผ ๊ตฌํ•œ ๋‹ค์Œ ์˜ค์ฐจ๊ฐ€ ์ž‘์€ ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๋จผ์ €, ์˜ค์ฐจ ๊ตฌํ•˜๋Š” ๊ณต์‹ ํ•„์š”

์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜์˜ ์˜ค์ฐจ๊ฐ€ ์ปค์ง€๋Š” ๊ฒฝ์šฐ : ๋ฅผ ๊ณต์‹์œผ๋กœ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ = ๋กœ๊ทธ ํ•จ์ˆ˜

  1. ์‹ค์ œ ๊ฐ’์ด 1์ผ ๋•Œ ์˜ˆ์ธก ๊ฐ’์ด 0์— ๊ฐ€๊นŒ์›€ - ์™ผ์ชฝ๊ทธ๋ž˜ํ”„ ์“ฐ๊ธฐ
  2. ์‹ค์ œ ๊ฐ’์ด 0์ผ ๋•Œ ์˜ˆ์ธก ๊ฐ’์ด 1์— ๊ฐ€๊นŒ์›€ - ์˜ค๋ฅธ์ชฝ๊ทธ๋ž˜ํ”„ ์“ฐ๊ธฐ

 

 

์˜ค์ฐจํ•จ์ˆ˜

 


 

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]]
xdata= [i[0] for i in data]
ydata= [i[1] for i in data]

plt.scatter(xdata, ydata)
plt.xlim(0,15)
plt.ylim(-.1,1.1)


#์ดˆ๊ธฐํ™”
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์— ๊ด€ํ•œ ํŽธ๋ฏธ๋ถ„. ์•ž์„œ ์ •์˜ํ•œ sigmoid ํ•จ์ˆ˜ ์‚ฌ์šฉ
        a_diff = x_data*(sigmoid(a*x_data + b) - y_data)
        # b์— ๊ด€ํ•œ ํŽธ๋ฏธ๋ถ„
        b_diff = sigmoid(a*x_data + b) - y_data
        # a๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด a - diff์— ํ•™์Šต๋ฅ  lr์„ ๊ณฑํ•œ ๊ฐ’์„ a์—์„œ ๋บŒ
        a = a - lr * a_diff
        # b๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด b - diff์— ํ•™์Šต๋ฅ  lr์„ ๊ณฑํ•œ ๊ฐ’์„ b์—์„œ ๋บŒ
        b = b - lr * b_diff
        if i % 1000 = = 0:
            print("epoch=%.f, ๊ธฐ์šธ๊ธฐ=%.04f, ์ ˆํŽธ=%.04f" % (i, a, b))

    # ์•ž์„œ ๊ตฌํ•œ ๊ธฐ์šธ๊ธฐ์™€ ์ ˆํŽธ์„ ์ด์šฉํ•ด ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ
    plt.scatter(x, y)
    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()

 

์„ธ ๊ฐœ ์ด์ƒ์˜ ์ž…๋ ฅ ๊ฐ’ ๋‹ค๋ฃฌ๋‹ค๋ฉด ์‹œ๊ทธ๋ชจ์ด๋“œ ๋Œ€์‹  ์†Œํ”„ํŠธ๋งฅ์Šค ํ•จ์ˆ˜ ์‚ฌ์šฉ - ๋‹ค์ค‘ ๋ถ„๋ฅ˜

 

๋ฐ˜์‘ํ˜•