머신러닝&딥러닝/이론

[머신러닝&딥러닝] 파이토치 선형회귀-다중 선형 회귀

거북이07 2024. 1. 11. 09:30

파이토치 다중 선형 회귀

다중 선형 회귀(Multiple Linear Regression)

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt

필요한 라이브러리, 모델들을 import 해준다.

x_train = torch.FloatTensor([[73, 80, 75],
                             [93, 88, 93],
                             [89, 91, 90],
                             [96, 98, 100],
                             [73, 66, 70]])
y_train = torch.FloatTensor([[150], [190], [180], [200], [130]])

print(x_train, x_train.shape)
print(y_train, y_train.shape)

 

x_train, y_train 변수를 선언해주고 FloatTensor() 함수를 이용하여 텐서를 만들어준다.

tensor([[ 73.,  80.,  75.],
        [ 93.,  88.,  93.],
        [ 89.,  91.,  90.],
        [ 96.,  98., 100.],
        [ 73.,  66.,  70.]]) torch.Size([5, 3])
tensor([[150.],
        [190.],
        [180.],
        [200.],
        [130.]]) torch.Size([5, 1])

모델 만들기

 

# y = a1x + a2x + a3x ...... + b
model = nn.Linear(3, 1)
print(model)
Linear(in_features=3, out_features=1, bias=True)

 

nn.Linear() 함수를 이용하여 선형모델을 만들어준다. 만든 모델을 출력하면 위 코드 처럼 나온다.

y_pred = model(x_train)
print(y_pred) # 학습을 안해서 값이 이상하게 나옴

y_pred 변수를 만들고 x_train을 넣으면 예측값이 나오는데 해당 예측값은 학습을 하지 않아 값이 다르게 나온다.

tensor([[0.7260],
        [0.7894],
        [0.8528]], grad_fn=<AddmmBackward0>)

파라미터 확인

print(list(model.parameters())) # w:0.9437, b:-0.7614
[Parameter containing:
tensor([[ 0.5448, -0.4396, -0.3846]], requires_grad=True), Parameter containing:
tensor([-0.1738], requires_grad=True)]

model.parameters() 함수를 이용하연 기울기와 바이어스(절편)를 확인할 수 있다.

w : 0.5448, -0.4396, -0.3846 (기울기가 다중으로 나온다.)

b :  -0.1738


loss 구하기

optimizer = optim.SGD(model.parameters(), lr=0.000001) # lr = 학습률

 

loss=nn.MSELoss()(y_pred, y_train)
print(loss)
tensor(38561.1250, grad_fn=<MseLossBackward0>)

반복학습

반복 학습을 통해 틀린w, b를 수정하면서 오차를 계속 줄여나가는 작업을 진행해준다.

epochs = 200000

for epoch in range(epochs + 1):
    y_pred = model(x_train)
    loss = nn.MSELoss()(y_pred, y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 1000 == 0:
        print(f'Epoch: {epoch}/{epochs} Loss: {loss:.6f}')
x_test = torch.FloatTensor([[92, 90, 89]])
y_pred = model(x_test)
print(y_pred)