๐Ÿ”ธํšŒ๊ท€๋ถ„์„(Regression Analysis)

Jiwon Parkยท2023๋…„ 3์›” 27์ผ
0

ํšŒ๊ท€๋ถ„์„

  • ํšŒ๊ท€: ํ•˜๋‚˜ ํ˜น์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ๋ณ€์ˆ˜์™€ ํ•œ ๊ฐœ์˜ ์ข…์†๋ณ€์ˆ˜ ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ธฐ๋ฒ•

  • ์„ ํ˜•ํšŒ๊ท€: ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ž„์˜์˜ ์ ์ด ํ‰๋ฉด ์ƒ์— ๊ทธ๋ ค์กŒ์„ ๋•Œ ์ตœ์ ์˜ ์„ ํ˜• ๋ชจ๋ธ์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•จ.

  • ๋‹จ์ˆœ ์„ ํ˜• ํšŒ๊ท€๋ถ„์„

  • ๊ฒ€์€ ์ : ๋ชจ์ง‘๋‹จ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ / ๋นจ๊ฐ„ ์ : ํ•™์Šต์ง‘ํ•ฉ์˜ ๋ฐ์ดํ„ฐ
    (๋ชจ์ง‘๋‹จ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ถ„์„ ์–ด๋ ค์›Œ, ํ•™์Šต์ง‘ํ•ฉ ๋ถ„์„ ํ›„ ์ž”์ฐจ๋ฅผ ํ†ตํ•ด ์ถ”์ •)

  • ์ตœ์ ์˜ ํšŒ๊ท€ ๋ชจ๋ธ: ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ์ž”์ฐจ(์˜ค๋ฅ˜๊ฐ’)์˜ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๋ชจ๋ธ
    -> ์˜ค๋ฅ˜๊ฐ’์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ํšŒ๊ท€๊ณ„์ˆ˜(์ ˆํŽธ, ๊ธฐ์šธ๊ธฐ) ์ฐพ๊ธฐ

์˜ค์ฐจ ๊ณ„์‚ฐ

  • ์ž”์ฐจ(residual) : ์‹ค์ œ๊ฐ’ - ์ถ”์ •๊ฐ’
  • ์ž”์ฐจ์˜ ์ œ๊ณฑํ•ฉ(SSE; Error Sum of Squares)

  • ์ž”์ฐจ์˜ ์ œ๊ณฑํ•ฉ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์ด์œ  :
    1) ์ž”์ฐจ์˜ ํ•ฉ์ด 0์ด ๋˜๋Š” ํ•ด๋Š” ๋ฌด์ˆ˜ํžˆ ๋งŽ์Œ (์œ ์ผํ•œ ํ•ด X)

2) ์ž”์ฐจ์˜ ์ ˆ๋Œ€๊ฐ’์˜ ํ•ฉ์€ ๋ฏธ๋ถ„ ๋ถˆ๊ฐ€๋Šฅ

3) ์ž”์ฐจ์˜ ์ œ๊ณฑํ•ฉ -> ์œ ์ผํ•œ ํ•ดO, ๋ฏธ๋ถ„ ๊ฐ€๋ŠฅO

๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•

  • ๊ณ ์ฐจ์› ๋ฐฉ์ •์‹์—์„œ RSS๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ์ง๊ด€์  ๋ฐฉ๋ฒ• ์ œ๊ณต
    -> ๋น„์šฉํ•จ์ˆ˜๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋Š” W ๋ณ€์ˆ˜๊ฐ’ ํšจ๊ณผ์ ์œผ๋กœ ๋„์ถœ

    ๋ฐฉ๋ฒ•:

    ์ œ๊ณฑํ•ฉ(Squared Loss):

    ํ‰๊ท ์ œ๊ณฑํ•ฉ(Mean Squared Loss):

    W ํŒŒ๋ผ๋ฏธํ„ฐ ์—…๋ฐ์ดํŠธ: ๊ทธ๋ž˜๋””์–ธํŠธ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ(-), ์ฆ‰ '-๊ธฐ์šธ๊ธฐ'


    ๊ฐฑ์‹  ํฌ๊ธฐ ๊ฒฐ์ •(learning rate): ์•„์ฃผ ์กฐ๊ธˆ์”ฉ ๊ฐฑ์‹ ๋˜๋„๋ก ํ•จ.

์ฝ”๋“œ์‹ค์Šต

scatter plot ์‹œ๊ฐํ™”
import numpy as np
import matplotlib.pyplot as plt 
%matplotlib.inline 

np.random.seed(0) 
X = 2 * np.random.rand(100, 1) 
y = 6 + 4 * X + np.random.randn(100,1) # ๋…ธ์ด์ฆˆ ์ƒ์„ฑ์„ ์œ„ํ•ด random๊ฐ’ ์ถ”๊ฐ€


plt.scatter(X,y)

w1,w0 ์—…๋ฐ์ดํŠธ
# w1, w0 ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ w1_update, w0_update ๋ฐ˜ํ™˜
def get_weight_updates(w1, w0, X, y, learning_rate=0.01):
    N = len(y) # y=w0+w1X1(์ฆ‰, ๋ฒกํ„ฐ์˜ ๊ธธ์ด)
    # ๋จผ์ € w1_update, w0_update๋ฅผ ๊ฐ๊ฐ w1, w0์˜ shape๊ณผ ๋™์ผํ•œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ 0 ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
    w1_update = np.zeros_like(w1) 
    w0_update = np.zeros_like(w0)
    y_pred = np.dot(X, w1.T) + w0 # dot ์—ฐ์‚ฐ ์‹œ, y = ax+b ax->np.dot(X,w1.T)
    diff = y-y_pred # error function  = (์‹ค์ œ๊ฐ’ - ์˜ˆ์ธก๊ฐ’)
         
    # w0_update๋ฅผ dot ํ–‰๋ ฌ ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋‘ 1๊ฐ’์„ ๊ฐ€์ง„ ํ–‰๋ ฌ ์ƒ์„ฑ 
    w0_factors = np.ones((N,1)) 

    # w1๊ณผ w0์„ ์—…๋ฐ์ดํŠธํ•  w1_update์™€ w0_update ๊ณ„์‚ฐ
    w1_update = -(2/N)*learning_rate*(np.dot(X.T, diff)) # error ftn : mse(mean square error)
    #/summation_i^n (y-y_hat)(-x_i)
    w0_update = -(2/N)*learning_rate*(np.dot(w0_factors.T, diff)) # summation_i^n (y-y_hat)(-x_1)
    
    return w1_update, w0_update #W_0,W_1 update
# iters ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต์ ์œผ๋กœ w1, w0 ์—…๋ฐ์ดํŠธ 
def gradient_descent_steps(X, y, iters=10000):
    # w0, w1 ๋ชจ๋‘ 0์œผ๋กœ ์ดˆ๊ธฐํ™” 
    w0 = np.zeros((1,1))
    w1 = np.zeros((1,1))
    
    # iters ํšŸ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต์ ์œผ๋กœ get_weight_updates() ํ˜ธ์ถœํ•˜์—ฌ w1, w0 ์—…๋ฐ์ดํŠธ 
    for ind in range(iters):
        w1_update, w0_update = get_weight_updates(w1, w0, X, y, learning_rate=0.01)
        w1 = w1 - w1_update # new = old - update (update = 0->new =old ) 
        w0 = w0 - w0_update
              
    return w1, w0
def get_cost(y, y_pred):
    N = len(y) 
    cost = np.sum(np.square(y - y_pred))/N
    print(cost) # root(์‹ค์ œ๊ฐ’-์˜ˆ์ธก๊ฐ’) ํ•ฉ์‚ฐํ•ด์„œ ์ €์žฅ-> cost
    return cost
w1, w0 = gradient_descent_steps(X, y, iters=1000) #1000๋ฒˆ ๋ฐ˜๋ณต
#์ตœ์ ์˜ ๊ฐ’๊ณผ ๊ทธ๋•Œ์˜ cost๊ฐ’ ์ถœ๋ ฅ
print("w1:{0:.3f} w0:{1:.3f}".format(w1[0,0], w0[0,0]))
y_pred = w1[0,0] * X + w0
print('Gradient Descent Total Cost:{0:.4f}'.format(get_cost(y, y_pred)))
plt.scatter(X, y)
plt.plot(X,y_pred)
profile
Data Science

0๊ฐœ์˜ ๋Œ“๊ธ€