본문 바로가기

[Pytorch] Multivariable Linear Regression (다중 선형 회귀)

Derrick 발행일 : 2022-04-12
728x90
반응형

< Multivariable Linear Regression >

 " 다수의 x로부터 하나의 y값을 예측하는 모델 "
 → 2개 이상의 데이터(정보)들로부터 어떤 값을 예측하는 모델
 ex) 암의 위치, 넓이, 모양 등을 통한 치료 성공률
 ex) 여러 쪽지시험 데이터들을 통한 마지막 시험의 점수

 

1. PyTorch로 모델 구현하기

 → 독립 변수 x가 3개인 모델, 즉 3개의 쪽지시험 점수로부터 Final 점수를 예측하는 모델 구현

 

 

import torch
import torch.nn as nn                                # 신경망을 구축하기 위한 데이터 구조나 레이어 정의
import torch.nn.functional as F
import torch.optim as optim                          # Parameter 최적화 알고리즘 구현

# Random value 지정
torch.manual_seed(1)

# Training Dataset
x_train = torch.FloatTensor([[79, 82, 72],
                             [93, 88, 84],
                             [87, 96, 84],
                             [95, 90, 100],
                             [71, 77, 67]])
y_train = torch.FloatTensor([[146], [162], [163], [172], [137]])

# 가중치 w와 편향(bias) b 초기화 - 모델 초기화
W = torch.zeros((3, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)

# optimizer 설정
optimizer = optim.SGD([W,b], lr=1e-5)

# Training
nb_epochs = 20            # epoch 20번 반복
for epoch in range(nb_epochs + 1):

  # H(x) 계산
  # Bias(b)는 Broadcasting되어 각 샘플에 더해진다.

  hypothesis = x_train.matmul(W) + b

  # cost 계산
  cost = torch.mean((hypothesis - y_train) ** 2)

  # cost로 H(x) 개선
  optimizer.zero_grad()
  cost.backward()
  optimizer.step()

  print('Epoch {:4d}/{} hypothesis: {} Cost: {:.6f}'.format(
      epoch, nb_epochs, hypothesis.squeeze().detach(), cost.item()
  ))

 
 → x_train의 size : (5, 3), y_train의 size : (5, 1), bias = (3, 1)
 → x_train(matrix), bias(vector)는 행렬곱

 

>>
Epoch    0/20 hypothesis: tensor([143.5209, 163.1045, 164.4483, 175.0885, 132.4360]) Cost: 7.966598
Epoch    1/20 hypothesis: tensor([143.5222, 163.1048, 164.4500, 175.0867, 132.4374]) Cost: 7.961514
Epoch    2/20 hypothesis: tensor([143.5234, 163.1049, 164.4515, 175.0846, 132.4386]) Cost: 7.956445
...
Epoch   18/20 hypothesis: tensor([143.5381, 163.1025, 164.4704, 175.0467, 132.4545]) Cost: 7.876423
Epoch   19/20 hypothesis: tensor([143.5390, 163.1023, 164.4715, 175.0443, 132.4555]) Cost: 7.871497
Epoch   20/20 hypothesis: tensor([143.5399, 163.1021, 164.4727, 175.0419, 132.4564]) Cost: 7.866568

 
 → 실제값 : 146, 162, 163, 172, 137  /  예측값 : 143, 163, 164, 175, 132

 

2. nn.Module로 모델 구현하기

 → nn.Linear( )와 nn.functional.mse_loss( )으로 다중 선형 회귀 구현!

 

... Training Dataset까지는 동일

# 모델 선언 및 초기화. input_dim = 3, output_dim = 1
# 3개의 입력 x에 대해서 하나의 출력 y를 가짐. ( → 입력 차원(1), 출력 차원(3) )
model = nn.Linear(3,1)            

# Optimizer 설정
optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)

# Training 
nb_epochs = 2000
for epoch in range(nb_epochs+1):

  # H(x) 계산
  prediction = model(x_train)

  # cost 계산
  cost = F.mse_loss(prediction, y_train)        # → PyTorch에서 제공하는 평균 제곱 오차(MSE) 함수

  # cost로 H(x) 개선하는 부분
  # gradient를 0으로 초기화
  optimizer.zero_grad()

  # 비용 함수를 미분하여 gradient 계산
  cost.backward()

  # W와 b를 업데이트
  optimizer.step()

  if epoch % 100 == 0:
    # 100번마다 결과 로그 출력
    print('Epoch {:4d}/{} Cost: {:.6f}'.format(
        epoch, nb_epochs, cost.item()
    ))

 

>>
Epoch    0/2000 Cost: 26285.941406
Epoch  100/2000 Cost: 11.329120
Epoch  200/2000 Cost: 10.469337
...
Epoch 1800/2000 Cost: 5.274269
Epoch 1900/2000 Cost: 5.186571
Epoch 2000/2000 Cost: 5.109119                    # Cost 값이 점점 줄어드는 것을 확인



  • Weight와 bias가 잘 학습되어서 변경되었는지 확인!
print(list(model.parameters()))

 

>>
[Parameter containing:
tensor([[0.8448, 0.6758, 0.3095]], requires_grad=True), Parameter containing:
tensor([0.2881], requires_grad=True)]

 

3. Class로 모델 구현하기

... Training Dataset까지 동일

# 모델을 Class로 구현
class Multi_Model(nn.Module):
  def __init__(self):
    super().__init__()
    self.linear = nn.Linear(3, 1)   
    # 다중 선형 회귀이므로 input_dim = 3, output_dim = 1

  def forward(self, x):
    return self.linear(x)

# 모델 선언
model = Multi_Model()

# Optimizer 설정
optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)

...Training Part 위와 동일

 

>>
Epoch    0/2000 Cost: 26285.941406
Epoch  100/2000 Cost: 11.329120
Epoch  200/2000 Cost: 10.469337
...
Epoch 1800/2000 Cost: 5.274269
Epoch 1900/2000 Cost: 5.186571
Epoch 2000/2000 Cost: 5.109119                            




< 참고 : 파이토치로 시작하는 딥러닝 기초(boostcourse) >

댓글