본문 바로가기

데이터사이언스/인공지능

간단한 신경망 만들기(보스턴 집값 예측하기)

간단한 신경망을 만들기 위해 사이킷런에서 제공하는 보스턴 집값에 영향을 미치는 데이터셋을 불러와서 집값을 예측해보자.

선형회귀 MLP모델

이번에는 선형회귀 알고리즘을 사용하여 모델링하여 회귀에 의해 얻은 결과를 실제데이터와 비교해 오차(MSE)를 줄여나가는 방식으로 학습한다.

선형 회귀 MLP모델에서는 입력층에 입력데이터가 들어오면 은닉층에 전달된 입력 데이터의 특징으로부터 정보를  추출한다. 이후 출력층의 예측값과 실제 정답을 비교해 손실을 계산한다. 손실을 계산했으면 가중치를 수정하기 위해 오차를 역전파한다.

 

import pandas as pd
from sklearn.datasets import load_boston

dataset = load_boston()
dataFrame = pd.DataFrame(dataset['data']) #데이터셋의 데이터 불러오기
dataFrame.columns = dataset['feature_names'] #특징의 이름 불러오기
dataFrame['target'] = dataset['target'] #데이터프레임에 정답추가

import torch
import torch.nn as nn
from torch.optim.adam import Adam

model = nn.Sequential( #신경망 모델을 정의
    nn.Linear(13, 100), # Linear()는 MLP모델이며 13개의 특징을 받아 100개의 특징을 반환한다
    nn.ReLU(), #ReLU()는 활성화 함수의 일종
    nn.Linear(100, 1))
    
X = dataFrame.iloc[:, :13].values #정답을 제외한 특징을 X에 입력
Y = dataFrame['target'].values # 데이터프레임의 target값을 추출

batch_size = 100
learning_rate = 0.001

optim = Adam(model.parameters(), lr = learning_rate) # Adam은 가장 많이 쓰이는 최적화기법
#최적화기법이란 역전파된 오차를 이용해 가중치를 수정하는 기법으로 대표적으로 경사하강법과 Adam이 있음

for epoch in range(200): #에포크 반복
    for i in range(len(X)//batch_size): # 배치반복
        start = i*batch_size
        end = start+batch_size
        
        x = torch.FloatTensor(X[start:end])
        y = torch.FloatTensor(Y[start:end])
        
        optim.zero_grad() #최적화 실행 전 가중치의 모든 기울기를 0으로 초기화
        preds = model(x) #모델의 예측값 계산
        loss = nn.MSELoss()(preds, y) #MSE손실계산
        loss.backward() #오차역전파과정에서 모든 가중치에 대한 기울기를 계산
        optim.step() #최적화 진행 얼마만큼 가중치를 수정하느냐를 결정함
        
    if epoch % 20 == 0:
        print(f'epoch{epoch} loss:{loss.item()}')
        
        
prediction = model(torch.FloatTensor(X[0, :13]))
real = Y[0]
print(f'prediction:{prediction.item()} real:{real}')

 

 

 

참고: Must Have 텐초의 파이토치 딥러닝 특강