IT/Machine Learning

Pytorch Linear/MLP Regression 튜토리얼 (feat. sklearn diabetes datasets)

엘티엘 2023. 6. 13. 08:47

pytorch 로 sklearn 의 diabetes datasets 을 Regression 해보자. Linear와 MLP Regression 모델을 적용하며, 모델 외에 optimizer, loss function 등은 동일하게 사용하고자 했다.

공통함수 정의

  • sklearn 의  load_diabetes 함수를 사용해 데이터 Load
  • 데이터 tensor 변환
from sklearn import datasets
import pandas as pd
import numpy as np
import torch
from torch import nn


data = datasets.load_diabetes()

x = torch.from_numpy(data.data).float()
y = torch.from_numpy(data.target.reshape(-1, 1)).float()
  • optimizer, loss function, train 함수 정의
    • optimizer: SGD
    • loss_fn: MSE
    • train: epoch=10000
def get_optimizer(lr):
  return torch.optim.SGD(model.parameters(), lr=lr)


def get_loss_fn():
  return torch.nn.MSELoss()


def train(model, optimizer, loss):
  epoches=100000
  PRINT=5000

  for e in range(epoches):
    pred = model(x)
    loss = loss_fn(pred, y)

    optimizer.zero_grad()
    loss.backward()

    optimizer.step()

    if e % PRINT == 0:
      print(e, loss.item())
  • 결과 시각화를 위한 plotting 함수 정의
import matplotlib.pyplot as plt

def plotting(title, pred, y):
  plt.scatter(x=y.numpy(), y=pred.reshape(1, -1).detach().numpy())
  plt.title(title)
  plt.xlabel('y')
  plt.ylabel('pred')

Lineare Regression

  • nn.Linear 를 사용해서 모델을 정의
  • train (lr=0.01)
  • 마지막 epoch 의 loss 는 2881.43
model = nn.Linear(x.size(-1), 1)
loss = get_loss_fn()
optimizer = get_optimizer(0.01)

train(model, optimizer, loss)
  • 결과 시각화
plotting("Linear Regression", pred, y)

 

MLP Regression

  • nn.Sequential 을 사용해서 MLP Regression 모델을 정의
  • 중간의 nn,Linear size 및 nn.ReLU 등은 임의로 선정
class MyModel(nn.Module):
  def __init__(self):
    super().__init__()

    self._stacked_model = nn.Sequential(
        nn.Linear(x.size(-1), 50),
        nn.ReLU(),
        nn.Linear(50, 100),
        nn.ReLU(),
        nn.Linear(100, 25),
        nn.ReLU(),
        nn.Linear(25, 1)
    )

  def forward(self, x):
    pred = self._stacked_model(x)
    return pred

 

  • lr(Learning Rate)이 너무 클 경우 loss 가 nan 으로 출력됨
  • train (lr=0.0001)
  • 마지막 epoch의 loss는 1.73
    • Linear 에 비해 굉장히 낮은 값
    • 다만, train/test 셋을 나눠서 측정한 결과가 아니기 때문에 큰 의미는 없음
    • MLP의 특성상 overfitting
model = MyModel()
optimizer = torch.optim.SGD(model.parameters(), lr=0.0001)
loss_fn = get_loss_fn()

train(model, optimizer, loss_fn)

 

  • 결과 시각화
plotting("MLP Regression", pred, y)

반응형