Linear Regression (선형 회귀)

sklearn libaray의 dataset을 기준으로 코드를 작성하고 연습을 진행하였다.

큰 흐름을 말하자면,

  1. Dataset and Data Preprocessing

  2. Model Declaration and Initialization.

  3. Cost function Declaration and Gradient(Optimizer) Declaration

  4. Training

  5. Visualization

CODE

# Declare the required library

import numpy as np                 # Data libaray
import matplotlib.pyplot as plt    # Visualization


import torch                       # torch libaray
import torch.nn as nn              # torch neural network libaray
from sklearn import datasets       # Dataset Load
# Data Load
x_numpy, y_numpy = datasets.make_regression(n_samples=100, n_features=1, noise=20, random_state=1)
x = torch.from_numpy(x_numpy.astype(np.float32))      # neural network에 올리기 위한 형변환.
y = torch.from_numpy(y_numpy.astype(np.float32))      # neural network에 올리기 위한 형변환.
y = y.view(y.shape[0],1)                              # tensor의 size를 100,1로 변경한다.

# 와... y_numpy에 x_numpy 넣어줘서 1시간걸려서 찾았네;;
# 생각해보면 y가 이상하다는거 알았으면 바로 여기부터 볼것이지....어이가 없네
x.shape, y.shape
(torch.Size([100, 1]), torch.Size([100, 1]))
# model
n_samples, n_features = x.shape        
input_size = n_features
output_size = 1
model = nn.Linear(input_size, output_size)      # model은 nn.Linear모델을 사용하였다. 지금은 내가 답을 알고 선택하기에 이렇지만, 차후에는 데이터의 특성을 파악하고 해야한다.
# loss and optimizer

criterion = nn.MSELoss()                                        # cost fucntion은 MSE(Mean Square Error를 선택했다. 특정 값이상에서는 오차가 커지므로 학습하기 무난하다고 생가했는데. 사실 그냥 골랐디.)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)        # 최적화(optimizer)로는 SGD(Stochastic gradient descent)를 선택했는데 Adam을 하는것도 무난한데, Linear이고 처음이니깐 이거 했다. 별 이유는 없다.
# training loop
epochs = 100
for epoch in range(epochs):
  # forward pass and loss
  y_pred = model(x)                      # 모델을 학습시켜서 예측값을 뱉어낸다.
  loss = criterion(y_pred, y)            # 정답과 학습시켜서 나온 예측값의 오차를 측정한다.

  # backward pass
  loss.backward()                        # 오차를 줄인다.

  # update
  optimizer.step()                       # 예측값을 업데이트한다.

  optimizer.zero_grad()                  # 다음학습에 영향을 받으면 안되니깐 다시 초기화.

  if (epoch+1) % 10 == 0:
    print(f"epoch: {epoch+1}, loss = {loss.item():.4f} ")
  
# plot
predicted = model(x).detach().numpy()
# plt.subplot(121)
plt.plot(x_numpy, y_numpy, 'ro')
# plt.subplot(122)
plt.plot(x_numpy, predicted, 'b')
plt.show()
epoch: 10, loss = 4349.8877 
epoch: 20, loss = 3245.0125 
epoch: 30, loss = 2445.9539 
epoch: 40, loss = 1867.4298 
epoch: 50, loss = 1448.1460 
epoch: 60, loss = 1143.9843 
epoch: 70, loss = 923.1429 
epoch: 80, loss = 762.6686 
epoch: 90, loss = 645.9738 
epoch: 100, loss = 561.0574 


댓글남기기