Machine Learning/Coding

[실습] Linear Regression(선형회귀)

ju_young 2021. 6. 27. 15:51
728x90

필요한 라이브러리를 임포트한다.

Import

from keras import optimizers
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

데이터 생성

임의의 데이터를 생성한다.

X = np.linspace(0, 10, 10)
Y = X + np.random.randn(*X.shape)

데이터 조회

어떤 데이터가 만들어졌는지 확인한다.

for x, y in zip(X, Y):
  print((round(x, 1), round(y, 1)))

[출력]
(0.0, -0.3)
(1.1, 1.5)
(2.2, 2.9)
(3.3, 3.3)
(4.4, 3.8)
(5.6, 4.6)
(6.7, 6.1)
(7.8, 9.7)
(8.9, 9.3)
(10.0, 10.1)

모델 생성

현재 입력하는 값은 x값 밖에 없으므로 input_dim = 1, 출력하는 값도 y값 밖에 없으므로 units =1 로 지정한다. 또 y = wx + b 처럼 bias가 있으면 use_bias = True로 지정해주어야한다. 하지만 지금은 y = wx이므로 use_bias=False로 지정해주었다.

model = Sequential()
# input_dim : 입력값 수(x값)
# units : 출력값 수(y값)
# y = wx + b : use_bias = True, y = wx : use_bias = False
model.add(Dense(input_dim=1, units=1, activation='linear', use_bias=False))

sgd = optimizers.SGD(lr=0.01) #lr = learning rate
model.compile(optimizer=sgd, loss='mse') # optimizer - 경사하강법(gradient descent), loss - 평균제곱오차(mse)

#최초의 w값 조회
weights = model.layers[0].get_weights()
print(weights)
w = weights[0][0][0]
print('initial w is : ' + str(w))

[출력]
[array([[-1.0493674]], dtype=float32)]
initial w is : -1.0493674

모델 학습

model.fit(X, Y, batch_size=10, epochs=10, verbose=1) # 배치사이즈 10 - 10개의 데이터, epochs - 반복 학습 수, verbose - 1로 지정시 진행 과정이 표시됨

[출력]
Epoch 1/10
1/1 [==============================] - 13s 13s/step - loss: 151.8819
Epoch 2/10
1/1 [==============================] - 0s 4ms/step - loss: 13.8634
Epoch 3/10
1/1 [==============================] - 0s 5ms/step - loss: 1.7465
Epoch 4/10
1/1 [==============================] - 0s 5ms/step - loss: 0.6827
Epoch 5/10
1/1 [==============================] - 0s 6ms/step - loss: 0.5893
Epoch 6/10
1/1 [==============================] - 0s 5ms/step - loss: 0.5812
Epoch 7/10
1/1 [==============================] - 0s 6ms/step - loss: 0.5804
Epoch 8/10
1/1 [==============================] - 0s 8ms/step - loss: 0.5804
Epoch 9/10
1/1 [==============================] - 0s 5ms/step - loss: 0.5804
Epoch 10/10
1/1 [==============================] - 0s 4ms/step - loss: 0.5804
<keras.callbacks.History at 0x7fa8119b4ed0>

시각화

y_pred = model.predict(X).flatten()
cv_list = [
           ['data', Y],
           ['prediction', y_pred]
          ]
df = pd.DataFrame.from_dict(dict(cv_list))
df.plot()

[출력]

 

728x90