์ ํํ๊ท(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 ์ (ํ ๋ฒ ํ์ต์ ์์ง๋ ์)
'๋ฐ์ดํฐ๋ถ์๊ฐ ๊ณผ์ > Tensorflow' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| DAY65. Tensorflow Keras model (1)dnn model (0) | 2021.12.22 |
|---|---|
| DAY64. Tensorflow Classification (Sigmoid, Softmax) (0) | 2021.12.21 |
| DAY63. Tensorflow LinearRegression (3)keras dnn (0) | 2021.12.20 |
| DAY61. Tensorflow LinearRegression (1)function basic (๊ธฐ๋ณธํจ์) (0) | 2021.12.16 |
| DAY60. Tensorflow Basic (1)์ค์น, ๊ธฐ๋ณธ (0) | 2021.12.15 |