์„ ํ˜•ํšŒ๊ท€(Linear Regression) ๊ฐœ์š”

ํšŒ๊ท€๋ถ„์„(Regression Analysis)

ํŠน์ • ๋ณ€์ˆ˜(๋…๋ฆฝ๋ณ€์ˆ˜)๊ฐ€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜(์ข…์†๋ณ€์ˆ˜)์— ์–ด๋– ํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€ (์ธ๊ณผ๊ด€๊ณ„ ๋ถ„์„)

ex) ๊ฐ€๊ฒฉ์€ ์ œํ’ˆ ๋งŒ์กฑ๋„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”๊ฐ€? -> ํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์˜ ๊ฐ’ ์˜ˆ์–ธ

 

์ƒ๊ด€๊ด€๊ณ„๋ถ„์„ : ๋ณ€์ˆ˜ ๊ฐ„์˜ ๊ด€๋ จ์„ฑ ๋ถ„์„

ํšŒ๊ท€๋ถ„์„ : ๋ณ€์ˆ˜ ๊ฐ„์˜ ์ธ๊ณผ๊ด€๊ณ„ ๋ถ„์„

 

‘ํ†ต๊ณ„๋ถ„์„์˜ ๊ฝƒ’ โž” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•˜๊ณ , ๋งŽ์ด ์ด์šฉ

์ข…์†๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ทœ๋ช…(๋ณ€์ˆ˜ ์„ ํ˜• ๊ด€๊ณ„ ๋ถ„์„)

๋…๋ฆฝ๋ณ€์ˆ˜์™€ ์ข…์†๋ณ€์ˆ˜์˜ ๊ด€๋ จ์„ฑ ๊ฐ•๋„

๋…๋ฆฝ๋ณ€์ˆ˜์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์ข…์†๋ณ€์ˆ˜ ๋ณ€ํ™” ์˜ˆ์ธก

ํšŒ๊ท€ ๋ฐฉ์ •์‹(Y=a+βX → Y:์ข…์†๋ณ€์ˆ˜, a:์ƒ์ˆ˜, β:ํšŒ๊ท€๊ณ„์ˆ˜, X:๋…๋ฆฝ๋ณ€์ˆ˜) ์„ ๋„์ถœํ•˜์—ฌ ํšŒ๊ท€์„  ์ถ”์ •

๋…๋ฆฝ๋ณ€์ˆ˜์™€ ์ข…์†๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ๋“ฑ๊ฐ„์ฒ™๋„ ๋˜๋Š” ๋น„์œจ์ฒ™๋„ ๊ตฌ์„ฑ

 

 

ํšŒ๊ท€ ๋ฐฉ์ •์‹ (1์ฐจ ํ•จ์ˆ˜) -> ํšŒ๊ท€์„  ์ถ”์ •

Y=a+βX : Y:์ข…์†๋ณ€์ˆ˜, a:์ƒ์ˆ˜, β:ํšŒ๊ท€๊ณ„์ˆ˜, X:๋…๋ฆฝ๋ณ€์ˆ˜

* ํšŒ๊ท€๊ณ„์ˆ˜(β) : ๋‹จ์œ„์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ์–‘(๊ธฐ์šธ๊ธฐ)์ด๋ฉฐ, ํšŒ๊ท€์„ ์„ ์ถ”์ •ํ•จ์— ์žˆ ์–ด ์ตœ์†Œ์ž์Šน๋ฒ• ์ด์šฉ

 

 

์ตœ์†Œ์ œ๊ณฑ๋ฒ• ์ ์šฉ ํšŒ๊ท€์„ 

ํšŒ๊ท€๋ฐฉ์ •์‹์— ์˜ํ•ด์„œ ๊ทธ๋ ค์ง„ y์˜ ์ถ”์„ธ์„  ์‚ฐํฌ๋„ ๊ฐ ์ ์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •์ค‘์•™ ํ†ต๊ณผํ•˜๋Š” ํšŒ๊ท€์„  ์ถ”์ • ๋ฐฉ๋ฒ•

 

 

 

 

 

Tensorflow ํšŒ๊ท€๋ฐฉ์ •์‹

ํšŒ๊ท€๋ฐฉ์ •์‹ & ์˜ค์ฐจ

X, y ๋ณ€์ˆ˜ : ์ƒ์ˆ˜ ์ •์˜ -> ์ˆ˜์ • ๋ถˆ๊ฐ€

X = tf.constant(6.5) # ๋…๋ฆฝ๋ณ€์ˆ˜

y = tf.constant(5.2) # ์ข…์†๋ณ€์ˆ˜

 

w, b ๋ณ€์ˆ˜ : ๋ณ€์ˆ˜ ์ •์˜ -> ์ˆ˜์ • ๊ฐ€๋Šฅ

w = tf.Variable(0.5) #๊ฐ€์ค‘์น˜

b = tf.Variable(1.5) #ํŽธํ–ฅ

 

y_pred = tf.math.multiply(X, w) + b #ํšŒ๊ท€๋ฐฉ์ •์‹(Y ์˜ˆ์ธก์น˜)

err = tf.math.subtract(y, y_pred) #์˜ค์ฐจ = ๊ด€์ธก์น˜-์˜ˆ์ธก์น˜

loss = tf.reduce_mean(tf.square(err)) #์†์‹คํ•จ์ˆ˜ : MSE

 

 

 

 

 

๊ฒฝ์‚ฌํ•˜๊ฐ•(GradientDesent) ์•Œ๊ณ ๋ฆฌ์ฆ˜

์˜ค์ฐจ(loss)๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๋Š”๋ฐ ์ด์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ•™์Šต๋ฅ (step) ๋‹จ์œ„๋กœ ๊ฒฝ์‚ฌ๋ฅผ ๋”ฐ๋ผ์„œ ์ตœ์†Ÿ์  ์ด๋™

* ์˜ˆ์ธก์น˜์™€ ์‹ค์ œ๊ฐ’ ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์ตœ์†Œ๊ฐ€ ๋˜๋„๋ก ์ตœ์ ์˜ ๊ฐ€์ค‘์น˜(weight)์™€ ํŽธํ–ฅ(bias)๋ฅผ ์ฐพ์•„์„œ ์—…๋ฐ์ดํŠธ

 

 

๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•(Gradient Descent algorithm)

์—ญ์ „ํŒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ‘œ์ค€(๋”ฅ๋Ÿฌ๋‹ ํ”„๋ ˆ์ž„์›Œํฌ ํ•„์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

์ผ์ •ํ•œ step ๋‹จ์œ„๋กœ ๊ฒฝ์‚ฌ(๊ธฐ์šธ๊ธฐ) ๋”ฐ๋ผ ํ•˜๊ฐ•ํ•˜๋ฉด์„œ w ์กฐ์ • → loss ์ตœ์†Œํ™”

์†์‹ค(loss) ์ตœ์†Œํ™”๋ฅผ ์œ„ํ•ด์„œ ์ตœ์ ์˜ w(๊ฐ€์ค‘์น˜)๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ์†์‹ค(loss) : ์˜ˆ์ธก๊ฐ’์™€ ์‹ค์ œ๊ฐ’ ๊ฐ„์˜ ์ฐจ์ด

- ์†์‹ค(loss)๋ฅผ ๊ฐ€์ค‘์น˜(weight)๋กœ ํŽธ๋ฏธ๋ถ„ → ์ ‘์„ ์˜ ๊ธฐ์šธ๊ธฐ ๊ณ„์‚ฐ

- ๊ณ„์‚ฐ๋œ ๊ธฐ์šธ๊ธฐ(Gradient) ์ด์šฉ → W ์—…๋ฐ์ดํŠธ

 

 

Linear Regression ์‹ ๊ฒฝ๋ง ์˜ˆ

* Hidden layer ์—†์Œ

w: ๊ฐ€์ค‘์น˜(weight)

b : ํŽธํ–ฅ(bias)

 

 

 

 

 

์„ ํ˜•ํšŒ๊ท€ ๋ชจ๋ธ(Linear Regression model)

1. ํšŒ๊ท€๋ฐฉ์ •์‹ y_pred = (X * w) + b -> Y ์˜ˆ์ธก์น˜ (w:๊ฐ€์ค‘์น˜, b : ํŽธํ–ฅ)

2. ์†์‹คํ•จ์ˆ˜ = ์ฐจ(์‹ค์ œ๊ฐ’-์˜ˆ์ธก์น˜)์˜ ์ œ๊ณฑ์— ๋Œ€ํ•œ ํ‰๊ท ๊ฐ’

loss = tf.reduce_mean(tf.square(Y – y_pred)) -> ํ‰๊ท ์ œ๊ณฑ์˜ค์ฐจ(MSE)

3. ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• : ์˜ค์ฐจ ์ตœ์†Œํ™” [์ตœ์ ์˜ w(๊ฐ€์ค‘์น˜), b(ํŽธํ–ฅ) ์ˆ˜์ •]

optimizer=tf.optimizers.Adam(0.1) -> ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ์ฒด

optimizer.minimize(loss) -> ํ•™์Šต์— ์˜ํ•œ ์˜ค์ฐจ ์ตœ์†Œํ™”

 

 

์†์‹คํ•จ์ˆ˜(loss function)

์˜ˆ์ธก์น˜์™€ ์‹ค์ œ๊ฐ’ ์‚ฌ์ด์˜ ์ฐจ์ด(loss)๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜=MSE

1. ํšŒ๊ท€๋ฐฉ์ •์‹

y_pred = (X * w) + b -> y ์˜ˆ์ธก์น˜(w:๊ฐ€์ค‘์น˜, b : ํŽธํ–ฅ)

2. ์†์‹คํ•จ์ˆ˜ = ์ฐจ(์‹ค์ œ๊ฐ’-์˜ˆ์ธก์น˜)์˜ ์ œ๊ณฑ์— ๋Œ€ํ•œ ํ‰๊ท ๊ฐ’

loss = tf.reduce_mean(tf.square( model - Y )) -> ํ‰๊ท ์ œ๊ณฑ์˜ค์ฐจ(MSE)

* MSE = ํ‰๊ท (์‹ค์ œ๊ฐ’ -์˜ˆ์ธก์น˜)^2 -> ์ œ๊ณฑ ์ ์šฉ ๋ถ€ํ˜ธ์–‘์ˆ˜, Penalty ๋ฐ˜์˜

 

 

๋‹ค์ค‘ํšŒ๊ท€๋ฐฉ์ •์‹์—์„œ ํ–‰๋ ฌ๊ณฑ ํ•จ์ˆ˜ : ์ž…๋ ฅ(X)์™€ ๊ฐ€์ค‘์น˜(w) ๊ณ„์‚ฐ

tf.matmul(X, w) : ๋‘ ํ…์„œ ํ–‰๋ ฌ๊ณฑ ์—ฐ์‚ฐ(์ž…๋ ฅ : 2๊ฐœ, ๊ธฐ์šธ๊ธฐ : 2๊ฐœ)

 

 

 

 

 

regression formula

๋‹จ์ˆœ์„ ํ˜•ํšŒ๊ท€๋ฐฉ์ •์‹ 
X : ๋…๋ฆฝ๋ณ€์ˆ˜(1), y : ์ข…์†๋ณ€์ˆ˜(1)
 y_pred = X * w + b (w:๊ฐ€์ค‘์น˜(weight), b:ํŽธํ–ฅ(bias))

import tensorflow as tf  #ver 2.3


X, y๋ณ€์ˆ˜ : ์ƒ์ˆ˜ ์ •์˜(์ˆ˜์ • ๋ถˆ๊ฐ€)

X = tf.constant(value=6.5) # ๋…๋ฆฝ๋ณ€์ˆ˜ 
y = tf.constant(value=5.2) # ์ข…์†๋ณ€์ˆ˜(์ •๋‹ต)


w, b๋ณ€์ˆ˜ : ๋ณ€์ˆ˜ ์ •์˜(์ˆ˜์ • ๊ฐ€๋Šฅ)

w = tf.Variable(0.5) # ๊ฐ€์ค‘์น˜(๊ธฐ์šธ๊ธฐ)
b = tf.Variable(1.5) # ํŽธํ–ฅ(์ ˆํŽธ)


ํšŒ๊ท€๋ชจ๋ธ ํ•จ์ˆ˜ : y์˜ˆ์ธก์น˜ ๋ฐ˜ํ™˜

def linear_model(X) :
    #y_pred = X * w + b # ํšŒ๊ท€๋ฐฉ์ •์‹(๊ธฐํ˜ธ) 
    y_pred = tf.math.multiply(X, w) + b # ํšŒ๊ท€๋ฐฉ์ •์‹(ํ•จ์ˆ˜)
    return y_pred


model ์˜ค์ฐจ ํ•จ์ˆ˜ : ์˜ค์ฐจ ๋ฐ˜ํ™˜(err = y - y_pred) 

def model_err(X, y) :
    y_pred = linear_model(X) # y ์˜ˆ์ธก์น˜ 
    err = tf.math.subtract(y, y_pred) # err = y - y_pred
    return err


์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๋ฐ˜ํ™˜(MSE) 

def loss_fn(X, y) :
    err = model_err(X, y) # model ์˜ค์ฐจ 
    loss = tf.reduce_mean(tf.square(err)) # MSE 
    return loss # ์†์‹ค๊ฐ’

tf.square(err) : +๋ถ€ํ˜ธ, ์˜ค์ฐจ ํŒจ๋„ํ‹ฐ 
tf.reduce_mean() : ๊ฐ ๊ด€์ธก์น˜์˜ ์˜ค์ฐจ์˜ ์‚ฐ์ˆ ํ‰๊ท \
    

print("<๊ฐ€์ค‘์น˜, ํŽธํ–ฅ ์ดˆ๊ธฐ๊ฐ’>")
print('๊ฐ€์ค‘์น˜(w) = %.3f, ํŽธํ–ฅ(b) = %.3f'%(w, b))    

print('y_pred = %.3f'%(linear_model(X)))
print('model error = %.3f'%(model_err(X, y)))
print('loss value = %.3f'%(loss_fn(X, y)))

<๊ฐ€์ค‘์น˜, ํŽธํ–ฅ ์ดˆ๊ธฐ๊ฐ’>
๊ฐ€์ค‘์น˜(w) = 0.500, ํŽธํ–ฅ(b) = 1.500
y_pred = 4.750
model error = 0.450(5.2 - 4.75)
loss value = 0.202

    
๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ ์ˆ˜์ •(update) 

w.assign(value=0.6) # 0.5 -> 0.6 
b.assign(value=1.2) # 1.5 -> 1.2 

print("<๊ฐ€์ค‘์น˜, ํŽธํ–ฅ ์ˆ˜์ •๋œ ๊ฐ’>")
print('๊ฐ€์ค‘์น˜(w) = %.3f, ํŽธํ–ฅ(b) = %.3f'%(w, b))    

print('y_pred = %.3f'%(linear_model(X)))
print('model error = %.3f'%(model_err(X, y)))
print('loss value = %.3f'%(loss_fn(X, y)))

<๊ฐ€์ค‘์น˜, ํŽธํ–ฅ ์ˆ˜์ •๋œ ๊ฐ’>
๊ฐ€์ค‘์น˜(w) = 0.600, ํŽธํ–ฅ(b) = 1.200
y_pred = 5.100
model error = 0.100
loss value = 0.010


๋”ฅ๋Ÿฌ๋‹ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ : SGD, Adam
- ์ตœ์ ์˜ ๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ update -> ์†์‹ค(loss) 0์— ์ˆ˜๋ ด 
- ์กฐ์ ˆ๋ณ€์ˆ˜ : ๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ 

 

 

 

 

regression formula2

๋‹ค์ค‘์„ ํ˜•ํšŒ๊ท€๋ฐฉ์ •์‹

X : ๋…๋ฆฝ๋ณ€์ˆ˜(2), y : ์ข…์†๋ณ€์ˆ˜(1)
 y_pred = (X1 * w1 + X2 * w2) + b (w:๊ฐ€์ค‘์น˜(weight), b:ํŽธํ–ฅ(bias))
 y_pred = tf.linalg.matmul(X, w) + b

import tensorflow as tf  # ver 2.3


X, y๋ณ€์ˆ˜ : ์ƒ์ˆ˜ ์ •์˜(์ˆ˜์ • ๋ถˆ๊ฐ€)

X = tf.constant(value=[[1.0, 2.0]]) # ๋…๋ฆฝ๋ณ€์ˆ˜(1, 2) 
y = tf.constant(value=2.5) # ์ข…์†๋ณ€์ˆ˜(์ •๋‹ต)


w, b๋ณ€์ˆ˜ : ๋ณ€์ˆ˜ ์ •์˜(์ˆ˜์ • ๊ฐ€๋Šฅ)

w = tf.Variable(tf.random.normal(shape=[2, 1])) # ๊ฐ€์ค‘์น˜(๊ธฐ์šธ๊ธฐ)
b = tf.Variable(tf.random.normal(shape=[1])) # ํŽธํ–ฅ(์ ˆํŽธ)


ํšŒ๊ท€๋ชจ๋ธ ํ•จ์ˆ˜ : y์˜ˆ์ธก์น˜ ๋ฐ˜ํ™˜

def linear_model(X) :
    y_pred = tf.linalg.matmul(X, w) + b # ํšŒ๊ท€๋ฐฉ์ •์‹ : ํ–‰๋ ฌ๊ณฑ 
    return y_pred


model ์˜ค์ฐจ ํ•จ์ˆ˜ : ์˜ค์ฐจ ๋ฐ˜ํ™˜(err = y - y_pred) 

def model_err(X, y) :
    y_pred = linear_model(X) # y ์˜ˆ์ธก์น˜ 
    err = tf.math.subtract(y, y_pred) # err = y - y_pred
    return err


์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๋ฐ˜ํ™˜(MSE) 

def loss_fn(X, y) :
    err = model_err(X, y) # model ์˜ค์ฐจ 
    loss = tf.reduce_mean(tf.square(err)) # MSE 
    return loss # ์†์‹ค๊ฐ’
    
print("<๊ฐ€์ค‘์น˜์™€ ์ ˆํŽธ ์ดˆ๊ธฐ๊ฐ’ ")
print("๊ฐ€์ค‘์น˜(w) : ", w.numpy(), "\n ํŽธํ–ฅ(b) : ", b.numpy())

<๊ฐ€์ค‘์น˜์™€ ์ ˆํŽธ ์ดˆ๊ธฐ๊ฐ’ 
๊ฐ€์ค‘์น˜(w) :  [[-0.16868056]
 [ 1.0764664 ]] 
 ํŽธํ–ฅ(b) :  [-0.19150431]

print('model err : ', model_err(X, y).numpy())
print('loss_fn : ', loss_fn(X, y).numpy())

<๊ฐ€์ค‘์น˜์™€ ์ ˆํŽธ ์ดˆ๊ธฐ๊ฐ’ 
๊ฐ€์ค‘์น˜(w) :  [[-0.97801447]
 [-0.74548423]] 
 ํŽธํ–ฅ(b) :  [-1.0766629]
model err :  [[6.0456457]]
loss_fn :  36.54983

<๊ฐ€์ค‘์น˜์™€ ์ ˆํŽธ ์ดˆ๊ธฐ๊ฐ’ 
๊ฐ€์ค‘์น˜(w) :  [[1.3209214]
 [1.0085039]] 
 ํŽธํ–ฅ(b) :  [-0.43631306]
model err :  [[-0.4016161]]
loss_fn :  0.16129549

 

 

 

 

 

regression model

ํšŒ๊ท€๋ชจ๋ธ : ๋”ฅ๋Ÿฌ๋‹ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ

tensorflow๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ numpy์„ค์น˜
(base) > conda activate tensorflow
(tensorflow) > conda install numpy

* R, python์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” deep neural network model์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

import tensorflow as tf #๋”ฅ๋Ÿฌ๋‹ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜
import numpy as np #dataset ์ƒ์„ฑ


1. X, y๋ณ€์ˆ˜ : numpy์ด์šฉ - ๋‹จ์ˆœ ์„ ํ˜•ํšŒ๊ท€

X = np.array([1, 2, 3]) #๋…๋ฆฝ๋ณ€์ˆ˜(์ž…๋ ฅ) : [n] -> n:๊ด€์ธก์น˜
y = np.array([2, 4, 6]) #์ข…์†๋ณ€์ˆ˜(์ถœ๋ ฅ) : [n] -> n:๊ด€์ธก์น˜
#X,y ์ขŒํ‘œ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ, ์ž…๋ ฅ1 -> ์ •๋‹ต2, ์ž…๋ ฅ2 -> ์ •๋‹ต4
X.shape #(3, ) -> ๋…๋ฆฝ๋ณ€์ˆ˜ : 1๊ฐœ
y.shape #(, 3) -> ์ข…์†๋ณ€์ˆ˜ : 1๊ฐœ

tf.random.set_seed(seed = 12) #๋‚œ์ˆ˜ ๊ณ ์ • -> ๋™์ผ model ์ƒ์„ฑ
#seed๊ฐ’์— ์˜ํ•ด ๋‚œ์ˆ˜๊ฐ’์ด ์ƒ์„ฑ, ๋™์ผํ•œ ํ•™์Šต๋ชจ๋ธ์ด ์ƒ์„ฑ๋œ๋‹ค.



2. w, b๋ณ€์ˆ˜ ์ •์˜ : ์กฐ์ ˆ๋ณ€์ˆ˜(๋‚œ์ˆ˜ -> ์ˆ˜์ •)

w = tf.Variable(tf.random.normal(shape=[1])) #๊ฐ€์ค‘์น˜(=๊ธฐ์šธ๊ธฐ)
b = tf.Variable(tf.random.normal(shape=[1])) #ํŽธํ–ฅ(=์ ˆํŽธ)
#์ดˆ๊ธฐ๊ฐ’ : ๋‚œ์ˆ˜. shape=[1] : ๋‚œ์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” ๋…๋ฆฝ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™๋‹ค



3. ํšŒ๊ท€๋ชจ๋ธ ํ•จ์ˆ˜ ์ •์˜ : y์˜ ์˜ˆ์ธก์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• 

def linear_model(X) :
    y_pred = tf.math.multiply(X, w) + b #y_pred = X * w + b
    return y_pred



4. ์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๊ฐ’(MSE) ๋ฐ˜ํ™˜

def loss_fn() : #์ธ์ˆ˜ ์—†์Œ
    y_pred = linear_model(X) #y์˜ˆ์ธก์น˜
    err = y - y_pred #์˜ค์ฐจ(error)
    loss = tf.reduce_mean(tf.square(err)) #MSE์‹
    return loss



5. model์ตœ์ ํ™” (=Optimizer) : ์˜ค์ฐจ์˜ ์ตœ์†Œ์ ์„ ์ฐพ๋Š” ๊ณผ์ •

opt = tf.optimizers.SGD(learning_rate = 0.01) #์ตœ์ ํ™” ๊ฐ์ฒด
print('๊ฐ€์ค‘์น˜(w) ์ดˆ๊ธฐ๊ฐ’ ', w.numpy(), 'ํŽธํ–ฅ(b) ์ดˆ๊ธฐ๊ฐ’ ', b.numpy())

SGD : ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์ตœ์ ํ™”)

Adam : ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ• ์ตœ์‹  ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๊ธฐ์กด ๋ชจ๋ธ์˜ ๋ฌธ์ œ์  ๊ฐœ์„  ์•Œ๊ณ ๋ฆฌ์ฆ˜)
learning_rate : ํ•™์Šต ์†๋„, ํ•™์Šต๋ฅ . ์˜ค์ฐจ์˜ ์ตœ์†Œ์  ์ˆ˜๋ ด์†๋„ (ํด์ˆ˜๋ก ๋น ๋ฆ„)

2) ๋ฐ˜๋ณตํ•™์Šต : ์†์‹ค๊ฐ’ ์ด์šฉ ->  w, b ์ˆ˜์ •

for step in range(100) : #100ํšŒ ๋ฐ˜๋ณต
    opt.minimize(loss = loss_fn, var_list=[w, b]) #(์†์‹ค๊ฐ’, ์กฐ์ ˆ๋ณ€์ˆ˜) -> ๋”ฅ๋Ÿฌ๋‹ ์ตœ์ ํ™” ์ฝ”๋“œ
    
    #step๋‹จ์œ„ -> ์†์‹ค๊ฐ’ -> w, b ์ˆ˜์ •
    print('step : ', (step+1), '์†์‹ค๊ฐ’ = ', loss_fn().numpy())
    #w, b๋ณ€์ˆ˜ update
    print('๊ฐ€์ค‘์น˜(w) ', w.numpy(), 'ํŽธํ–ฅ(b) ', b.numpy())

step :  1 ์†์‹ค๊ฐ’ =  13.138714
๊ฐ€์ค‘์น˜(w)  [-0.108078] ํŽธํ–ฅ(b)  [1.0261636]
    :
step :  100 ์†์‹ค๊ฐ’ =  0.23863406
๊ฐ€์ค‘์น˜(w)  [1.4326231] ํŽธํ–ฅ(b)  [1.2897477]

๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ์ด update๋˜๋ฉด์„œ ์†์‹ค๊ฐ’์ด ์ค„์–ด๋“œ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๋ฐ˜๋ณตํ•™์Šต ํšŸ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, learning_rate ์ˆ˜์น˜๋ฅผ ๋†’์—ฌ์„œ(0.001) ์†๋„๋ฅผ ๋†’์ด๊ฑฐ๋‚˜, ์ˆ˜์น˜๋ฅผ ๋‚ฎ์ถฐ์„œ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

Adam, ๋ฐ˜๋ณตํ•™์Šต ํšŸ์ˆ˜ ๋ณ€๊ฒฝ

opt = tf.optimizers.Adam(learning_rate = 0.01) #์ตœ์ ํ™” ๊ฐ์ฒด

for step in range(50) : #200ํšŒ ๋ฐ˜๋ณต
    opt.minimize(loss = loss_fn, var_list=[w, b]) #์†์‹ค๊ฐ’ ์ตœ์†Œํ™”
    
    #step๋‹จ์œ„ -> ์†์‹ค๊ฐ’ -> w, b ์ˆ˜์ •
    print('step : ', (step+1), '์†์‹ค๊ฐ’ = ', loss_fn().numpy())
    #w, b๋ณ€์ˆ˜ update
    print('๊ฐ€์ค‘์น˜(w) ', w.numpy(), 'ํŽธํ–ฅ(b) ', b.numpy())

step :  1 ์†์‹ค๊ฐ’ =  0.027950585
๊ฐ€์ค‘์น˜(w)  [1.8160036] ํŽธํ–ฅ(b)  [0.44134665]
    :
step :  50 ์†์‹ค๊ฐ’ =  0.0004616741
๊ฐ€์ค‘์น˜(w)  [1.9758178] ํŽธํ–ฅ(b)  [0.05683928]

 

์†์‹ค๊ฐ’์˜ 0์˜ ์ˆ˜๋ ด์ •๋„๊ฐ€ ๋” ๋†’์•„์กŒ๋‹ค. (= y์˜ˆ์ธก์น˜์˜ ์˜ค์ฐจ๊ฐ€ ์ค„์–ด๋“ค์—ˆ๋‹ค.)

์†์‹ค๊ฐ’์ด 0์— ์ˆ˜๋ ดํ• ์ˆ˜๋ก ๋ชจ๋ธํ•™์Šต์ด '์ž˜ ๋๋‹ค'
w, b(=์กฐ์ ˆ๋ณ€์ˆ˜)์˜ ๊ฐ’์ด ๋ฐ”๋€œ์œผ๋กœ์„œ ์†์‹ค(์˜ค์ฐจ)์ด ๊ฐœ์„ ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

learning_rate๊ณผ ๋ฐ˜๋ณตํ•™์Šต ํšŸ์ˆ˜๋Š” ๋ฐ˜๋น„๋ก€ ๊ด€๊ณ„์— ์žˆ๋‹ค.

 

 

6. ์ตœ์ ํ™”๋œ model test
์ตœ์ ํ™”๋œ model : ์ตœ์ ์˜ w,b(= ์กฐ์ ˆ๋ณ€์ˆ˜)๊ฐ€ ์ˆ˜์ •๋œ ์ƒํƒœ

 

1) test set

X_test = [2.5] #ํ•™์Šต๋˜์ง€ ์•Š์€ ๊ฐ’์„ ๋„ฃ์–ด ์˜ˆ์ธก์น˜๋ฅผ ๊ตฌํ•œ๋‹ค.

* ํ•™์Šตdataset์˜ ๊ตฌ์กฐ ์ƒ, 5์˜ ๊ทผ์‚ฌ์น˜๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ์ž˜ ํ•™์Šต๋œ ๋ชจ๋ธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

y_pred = linear_model(X_test) #์ตœ์ ํ™”๋œ model 
print('X = 2.5 :', y_pred.numpy()) #X = 2.5 : [4.9999723] -> ์–ด๋А์ •๋„ ์ตœ์ ํ™”๋œ ๋ชจ๋ธ์ด๋ผ๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

print(X) #[1 2 3]
y_pred = linear_model(X)
print('y_pred =', y_pred.numpy()) #y_pred = [1.9999841 3.999976  5.999968 ]
print('y =', y) #y = [2 4 6]

์ด๋ฏธ ํ•™์Šต์ด ๋˜์–ด ์žˆ๋Š” X([1 2 3])์— ๋Œ€ํ•œ y์˜ ์˜ˆ์ธก๊ฐ’์„ model์— ์ง์ ‘ ์‹คํ—˜
์ •๋‹ต(real value)๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์•„์ฃผ ์œ ์‚ฌํ•œ ๊ฐ’์„ ์˜ˆ์ธกํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

2) ํšŒ๊ท€์„ 

import matplotlib.pyplot as plt

plt.plot(X, y, 'bo') #ํŒŒ๋ž€์ƒ‰ ์‚ฐ์ ๋„ 
plt.plot(X, y_pred, 'r-') #๋นจ๊ฐ„์ƒ‰ ์‹ค์„  ํšŒ๊ท€์„ 
plt.show()

 

 

 

 

 

regression model iris (๋‹จ์ˆœ์„ ํ˜•ํšŒ๊ท€)

csv file data ์ด์šฉ
์ •๊ทœํ™” : X, y๋ณ€์ˆ˜ ์ •๊ทœํ™”

tensorflow ๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ scikit-learn, pandas, numpy, matplotblib
(base) > conda activate tensorflow
(tensorflow) > conda install scikit-learn

import tensorflow as tf #์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜
import pandas as pd #csv file read
from sklearn.metrics import mean_squared_error #model ํ‰๊ฐ€
from sklearn.preprocessing import minmax_scale #์ตœ์†Œ/์ตœ๋Œ€๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ 0~1 ์‚ฌ์ด๋กœ ์ •๊ทœํ™”

 

iris = pd.read_csv(r'C:\ITWILL\5_Tensorflow\data\iris.csv')
iris.info()

 0   Sepal.Length  150 non-null    float64 -> X๋ณ€์ˆ˜ : ๋…๋ฆฝ๋ณ€์ˆ˜
 1   Sepal.Width   150 non-null    float64
 2   Petal.Length  150 non-null    float64 -> y๋ณ€์ˆ˜ : ์ข…์†๋ณ€์ˆ˜
 3   Petal.Width   150 non-null    float64
 4   Species       150 non-null    object 
  * float : ์‹ค์ˆ˜ํ˜• (32๋น„ํŠธ or 64๋น„ํŠธ)

 
1. X, y ๋ณ€์ˆ˜ ์ƒ์„ฑ

X = iris['Sepal.Length'] #๋…๋ฆฝ๋ณ€์ˆ˜(์ž…๋ ฅ)
y = iris['Petal.Length'] #์ข…์†๋ณ€์ˆ˜(์ถœ๋ ฅ)
print(X.mean()) #5.843333333333335 -> ์ •๊ทœํ™” ์ด์ „
print(y.max()) #6.9


[์ถ”๊ฐ€] Tensor ์ƒ์ˆ˜ ๋ณ€ํ™˜ : pandas -> tesor

X = tf.constant(X, dtype = tf.float32)
y = tf.constant(y, dtype = tf.float32)

 

 

2. X, y๋ณ€์ˆ˜ ์ •๊ทœํ™” : ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์—์„œ ์ •๊ทœํ™” ํ•„์ˆ˜

X = minmax_scale(X)
print(X.mean()) #ํ‰๊ท ํ™•์ธ : 0.42870370370370364 -> ์ •๊ทœํ™” ์ดํ›„

y = y / 6.9 #๋ณ€์ˆ˜๊ฐ€ 1๊ฐœ์ผ ๋•Œ๋Š” ์ตœ๋Œ€๊ฐ’ ์ด์šฉํ•ด์„œ ์ •๊ทœํ™” ๊ฐ€๋Šฅ
print(y.mean()) #0.5446376811594202



3. w, b๋ณ€์ˆ˜ ์ •์˜ : ์กฐ์ ˆ๋ณ€์ˆ˜

w = tf.Variable(tf.random.normal(shape=[1])) #๊ฐ€์ค‘์น˜(์ดˆ๊ธฐ๊ฐ’) = ์ž…๋ ฅ ์ˆ˜
b = tf.Variable(tf.random.normal(shape=[1])) #ํŽธํ–ฅ(์ดˆ๊ธฐ๊ฐ’) = ์ถœ๋ ฅ ์ˆ˜

๋ณ€์ˆ˜ ํƒ€์ž… ์ผ์น˜ ํ•„์š” : X(float64) * w(float32) ์ผ ๋•Œ, type์ด ์„œ๋กœ ๋‹ค๋ฅด๋ฉด ์—ฐ์‚ฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ช…๋ช… ํ•„์š”


4. ํšŒ๊ท€๋ชจ๋ธ ํ•จ์ˆ˜ ์ •์˜ : y์˜ ์˜ˆ์ธก์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• 

def linear_model(X) :
    y_pred = tf.math.multiply(X, w) + b #y_pred = X * w + b
    return y_pred



5. ์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๊ฐ’(MSE) ๋ฐ˜ํ™˜

def loss_fn() : #์ธ์ˆ˜ ์—†์Œ
    y_pred = linear_model(X) #y์˜ˆ์ธก์น˜
    err = y - y_pred #์˜ค์ฐจ(error)
    loss = tf.reduce_mean(tf.square(err)) #MSE์‹
    return loss

 


6. model ์ตœ์ ํ™” : ์˜ค์ฐจ์˜ ์ตœ์†Œ์ ์„ ์ฐพ๋Š” ๊ณผ์ •
1) ์ตœ์ ํ™” ๊ฐ์ฒด ์ƒ์„ฑ

opt = tf.optimizers.Adam(learning_rate = 0.5)
print('๊ฐ€์ค‘์น˜(w) ์ดˆ๊ธฐ๊ฐ’ ', w.numpy(), 'ํŽธํ–ฅ(b) ์ดˆ๊ธฐ๊ฐ’ ', b.numpy())


2) ๋ฐ˜๋ณตํ•™์Šต : ์†์‹ค๊ฐ’ ์ด์šฉ -> w, b ์ˆ˜์ •

for step in range(100) : #100ํšŒ ๋ฐ˜๋ณต
    opt.minimize(loss = loss_fn, var_list=[w, b]) #์†์‹ค๊ฐ’ ์ตœ์†Œํ™”
    
    #step๋‹จ์œ„ -> ์†์‹ค๊ฐ’ -> w, b ์ˆ˜์ •
    print('step : ', (step+1), '์†์‹ค๊ฐ’ = ', loss_fn().numpy())
    #w, b๋ณ€์ˆ˜ update
    print('๊ฐ€์ค‘์น˜(w) ', w.numpy(), 'ํŽธํ–ฅ(b) ', b.numpy())

[error] No gradients provided for any variable: ['Variable:0', 'Variable:0'].
-> X์™€ w์˜ ๊ฐ์ฒด ํƒ€์ž…์ด ๋‹ฌ๋ผ ์—๋Ÿฌ ๋ฐœ์ƒ.Tensor ์ƒ์ˆ˜ ๋ณ€ํ™˜ : pandas -> tesor์ž‘์—… ํ•„์š”

step :  1 ์†์‹ค๊ฐ’ =  1.1448004
๊ฐ€์ค‘์น˜(w)  [0.24944857] ํŽธํ–ฅ(b)  [-0.612033]
    :
step :  100 ์†์‹ค๊ฐ’ =  0.0156148765
๊ฐ€์ค‘์น˜(w)  [0.97155386] ํŽธํ–ฅ(b)  [0.1308557]


7. ์ตœ์ ํ™”๋œ model ๊ฒ€์ฆ

y_pred = linear_model(X) #y ์˜ˆ์ธก์น˜ ๋ฐ˜ํ™˜


1) MSE

mse = mean_squared_error(y, y_pred)
print('MSE = ', mse) #MSE =  0.015614878


2) ํšŒ๊ท€์„ 

import matplotlib.pyplot as plt

plt.plot(X, y, 'bo') #ํŒŒ๋ž€์ƒ‰ ์‚ฐ์ ๋„ 
plt.plot(X, y_pred, 'r-') #๋นจ๊ฐ„์ƒ‰ ์‹ค์„  ํšŒ๊ท€์„ 
plt.show()

 

 

 

 

 

regression model iris2 (๋‹ค์ค‘์„ ํ˜•ํšŒ๊ท€)

๋‹ค์ค‘์„ ํ˜•ํšŒ๊ท€๋ชจ๋ธ
iris dataset
X๋ณ€์ˆ˜ : 2~4๋ฒˆ์งธ ์นผ๋Ÿผ
Y๋ณ€์ˆ˜ : 1๋ฒˆ์งธ ์นผ๋Ÿผ 

๋”ฅ๋Ÿฌ๋‹ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ : Adam ์ ์šฉ


import tensorflow as tf #๋”ฅ๋Ÿฌ๋‹ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜
from sklearn.datasets import load_iris #dataset
from sklearn.model_selection import train_test_split #split
from sklearn.metrics import mean_squared_error #model ํ‰๊ฐ€
from sklearn.preprocessing import minmax_scale #X๋ณ€์ˆ˜ ์ •๊ทœํ™”(0~1)


1. dataset load

X, y = load_iris(return_X_y=True)
type(X) #numpy.ndarray


X๋ณ€์ˆ˜(์ž…๋ ฅ๋ณ€์ˆ˜) ์ •๊ทœํ™”

X_nor = minmax_scale(X)
print(X_nor)

[[0.22222222 0.625      0.06779661 0.04166667]
 150ํ–‰, 4๊ฐœ ๋ณ€์ˆ˜ -> 2์ฐจ์›
๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ 0, ๊ฐ€์žฅ ํฐ ๊ฐ’ 1๋กœ ์Šค์ผ€์ผ๋ง (๋”ฅ๋Ÿฌ๋‹์ด ์ข‹์•„ํ•˜๋Š” ์ „์ฒ˜๋ฆฌ)

๋ณ€์ˆ˜ ์„ ํƒ (X๋ณ€์ˆ˜ : 2~4๋ฒˆ์งธ ์นผ๋Ÿผ, Y๋ณ€์ˆ˜ : 1๋ฒˆ์งธ ์นผ๋Ÿผ)

X_nor.shape #(150, 4)
y_data = X_nor[:,0]
x_data = X_nor[:, 1:]

y_data.shape #(150,) -> 1์ฐจ์›
x_data.shape #(150, 3) -> 2์ฐจ์›

x_data.dtype #dtype('float64')

 



2. train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    x_data, y_data, test_size = 0.3, random_state=123)

X : numpy, w : tensor
- tensor ๊ฐ์ฒด ๋ณ€ํ™˜ ํ•„์š” ์—†์Œ
- cf) pandas -> tensor ๋ณ€ํ™˜ ํ•„์š”

 



3. w, b ์กฐ์ ˆ๋ณ€์ˆ˜ ์ •์˜ : update๋Œ€์ƒ

tf.random.set_seed(123)
w = tf.Variable(tf.random.normal(shape=[3,1],
                                 dtype=tf.float64)) #๊ฐ€์ค‘์น˜ = ์ž…๋ ฅ์ˆ˜
#shape : ๋‚œ์ˆ˜ ๊ฐœ์ˆ˜, dtype = ๊ธฐ๋ณธ์€ 32 ๋”ฐ๋กœ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด error๋ฐœ
b = tf.Variable(tf.random.normal(shape=[1],
                                 dtype=tf.float64)) #ํŽธํ–ฅ = ์ถœ๋ ฅ์ˆ˜
print(w) #dtype=float64




4. ํšŒ๊ท€๋ชจ๋ธ ์ •์˜ : y ์˜ˆ์ธก์น˜ ๋ฐ˜ํ™˜

def linear_model(X) :
    #y_pred = (X*w)+b : ๋‹จ์ˆœ์„ ํ˜•ํšŒ๊ท€๋ฐฉ์ •์‹
    #y_pred = (X1*w1 + X2*w2 +X3*w3)+b : ๋‹ค์ค‘์„ ํ˜•ํšŒ๊ท€๋ฐฉ์ •์‹
    y_pred = tf.linalg.matmul(X, w) + b #[์ˆ˜์ •] ํ–‰๋ ฌ๊ณฑ
    return y_pred

ํ–‰๋ ฌ๊ณฑ tf.linalg.matmul(X, w) ์ˆ˜ํ–‰ ์กฐ๊ฑด

1. X, w : ํ–‰๋ ฌ
2. ์ˆ˜์ผ์น˜ : X(์—ด ์ˆ˜) = w(ํ–‰ ์ˆ˜)



5. ์†์‹ค/๋น„์šฉ ํ•จ์ˆ˜(loss/cost function) : ์†์‹ค๊ฐ’(MSE) ๋ฐ˜ํ™˜

def loss_fn() : #์ธ์ˆ˜ ์—†์Œ
    y_pred = linear_model(X_train) #y์˜ˆ์ธก์น˜ [์ˆ˜์ •] ํ›ˆ๋ จ์…‹ x๋ณ€์ˆ˜
    err = y_train - y_pred #์˜ค์ฐจ(error) [์ˆ˜์ •] ํ›ˆ๋ จ์…‹ y๋ณ€์ˆ˜
    loss = tf.reduce_mean(tf.square(err)) #MSE์‹
    return loss




6. ์ตœ์ ํ™” ๊ฐ์ฒด ์ƒ์„ฑ

opt = tf.optimizers.Adam(learning_rate = 0.01) #ํ•™์Šต๋ฅ  0.1 -> 0.01

learning_rate = 0.1 : ๋น ๋ฅธ ์†๋„ ์ตœ์†Œ์  ์ˆ˜๋ ด (step = 100)
 -> step = 100 loss value = 0.05592662787911901
 
learning_rate = 0.01 : ์•ˆ์ •์ ์œผ๋กœ ์ตœ์†Œ์  ์ˆ˜๋ ด (step=500)
 -> step = 500 loss value = 0.04842921530752257
 
* ์†์‹ค๊ฐ’์€ 0์— ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ์ข‹์€ ๋ชจ๋ธ์ด๋‹ค. ์ˆ˜์น˜์˜ ์ž„๊ณ„๊ฐ’, ๊ธฐ์ค€ ๋“ฑ์€ ๋ช…ํ™•ํžˆ ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š๋‹ค. ๋Œ€์‹  ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ ํ‰๊ฐ€๋ฅผ ํ•œ๋‹ค.

print('์ดˆ๊ธฐ๊ฐ’ w = ', w.numpy(), 'b = ', b.numpy())
print('='*30)

 



7. ๋ฐ˜๋ณตํ•™์Šต ๊ณผ์ •

loss_value = [] #์†์‹ค๊ฐ’ ์ €์žฅ

for step in range(500) : #100 -> 500
    opt.minimize(loss = loss_fn, var_list=[w, b]) #์†์‹ค๊ฐ’ ์ตœ์†Œํ™”
    loss_value.append(loss_fn().numpy()) #๊ณ„์‚ฐ๋œ ์†์‹ค๊ฐ’์ด loss_vlaue์•ˆ์— ์Œ“์ž„
    
    #100๋ฐฐ์ˆ˜ ๋‹จ์œ„ ์ถœ๋ ฅ (100๊ฐœ ๋ฌธ์žฅ์€ ๋„ˆ๋ฌด ๋งŽ์•„!)
    if (step+1) % 100 == 0 :
        print('step = ', (step+1), 'loss value =', loss_fn().numpy())

์‹คํ–‰๋•Œ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ’์ด ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์ง€๋Š” ์ด์œ 
seed๊ฐ’์€ ๊ฐ™์ง€๋งŒ 3๋ฒˆ์˜ w,b ์กฐ์ ˆ๋ณ€์ˆ˜๋Š” seed๊ฐ’์ด ์—†๋Š” ๋‚œ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ -> 3๋ฒˆ ๊ณผ์ •์— seed๊ฐ’์„ ๋„ฃ์–ด์„œ ํ•ด๊ฒฐ



8. ์ตœ์ ํ™”๋œ model ๊ฒ€์ฆ

print('='*30) #๊ตฌ๋ถ„์„  '=' 30๊ฐœ
print('์ตœ์ ํ™”๋œ w =', w.numpy(), 'b = ', b.numpy())


model ํ‰๊ฐ€ : test set

y_pred = linear_model(X_test)
mse = mean_squared_error(y_test, y_pred) #MSE : 0์˜ ์ˆ˜๋ ด์ •๋„๋กœ ๋ชจ๋ธ์„ ํ‰๊ฐ€ํ•˜๋Š” ํšŒ๊ท€๋ฐฉ์ •์‹์˜ ํ‰๊ฐ€๋ฐฉ์‹
print('MSE = ', mse) #0.06236167829034685


Loss value ์‹œ๊ฐํ™”

import matplotlib.pyplot as plt

plt.plot(loss_value, 'r--')
plt.ylabel('loss value')
plt.xlabel('epochs') #1epochs : 1ํšŒ ์†Œ์ง„๋œ ์ˆ˜
plt.show()


[ํ•ด์„] loss value๊ฐ€ ์ ์  ๊ฐ์†Œํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. y์ถ•์€ ์†์‹ค ์ˆ˜, x์ถ•์€ step ์ˆ˜ (ํ•œ ๋ฒˆ ํ•™์Šต์— ์†Œ์ง„๋œ ์ˆ˜)

+ Recent posts