[파이썬] PyTorch 시계열 데이터 및 RNN

시계열 데이터는 시간에 따라 변화하는 데이터를 의미하며, 예측, 분석, 제어 등 다양한 분야에서 사용됩니다. 이러한 시계열 데이터를 처리하기 위해 PyTorch의 RNN(Recurrent Neural Network) 모델을 사용할 수 있습니다. RNN은 이전 시간 단계의 정보를 현재 시간 단계로 전달하여 순차적인 데이터를 처리하는데 특화된 모델입니다.

이 블로그 포스트에서는 PyTorch를 사용하여 시계열 데이터를 처리하는 방법과 RNN 모델을 구현하는 방법에 대해 알아보겠습니다.

1. PyTorch로 시계열 데이터 준비하기

시계열 데이터를 다루기 위해 PyTorch에서는 torch.Tensor와 torch.utils.data.Dataset을 주로 사용합니다. 우선 시계열 데이터를 torch.Tensor 형태로 변환하는 방법을 알아보겠습니다.

import torch

# 시계열 데이터 (예시)
data = [1, 2, 3, 4, 5]

# torch.Tensor로 변환
tensor_data = torch.tensor(data)
print(tensor_data)

위의 예시에서는 간단한 숫자들로 이루어진 시계열 데이터를 정의하고, torch.tensor() 함수를 사용하여 이를 torch.Tensor로 변환했습니다.

2. 시계열 데이터를 활용한 RNN 모델 구현하기

RNN 모델은 이전 시간 단계의 정보를 현재 시간 단계로 전달하는 반복 구조를 가지고 있습니다. PyTorch에서는 nn.RNN 또는 nn.LSTM과 같은 RNN 모델을 제공합니다. RNN 모델을 구현하기 위해 다음과 같은 코드를 사용할 수 있습니다.

import torch
import torch.nn as nn

# RNN 모델 정의
class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super(RNN, self).__init__()
        
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        
        self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)
    
    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)
        
        out, _ = self.rnn(x, h0)
        
        out = self.fc(out[:, -1, :])
        
        return out

위의 코드에서는 nn.RNN을 사용하여 RNN 모델을 정의하였습니다. nn.RNN의 인수로는 input_size, hidden_size, num_layers 순으로 입력해야 합니다. 이 모델은 이전 시간 단계의 hidden 상태를 현재 시간 단계로 전달하는 구조를 가지고 있습니다.

3. RNN 모델 학습과 예측하기

RNN 모델을 학습하기 위해서는 먼저 데이터를 준비하고, 모델을 초기화하고, 손실 함수와 최적화 함수를 설정한 후에 학습을 진행해야 합니다. 다음은 RNN 모델의 학습과 예측 예시입니다.

import torch
import torch.nn as nn

# 학습 데이터 준비
inputs = torch.Tensor([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]])
targets = torch.Tensor([3, 4, 5, 6, 7])

# 모델 초기화
input_size = 1
hidden_size = 32
num_layers = 2
output_size = 1

model = RNN(input_size, hidden_size, num_layers, output_size)

# 손실 함수와 최적화 함수 설정
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

# 학습 반복
num_epochs = 100
for epoch in range(num_epochs):
    # 순전파
    outputs = model(inputs.unsqueeze(2))
    loss = criterion(outputs.squeeze(), targets)
    
    # 역전파 및 최적화
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    
    # 로그 출력
    if (epoch+1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 예측
with torch.no_grad():
    input_test = torch.Tensor([[1, 2, 3, 4, 5]])
    output_test = model(input_test.unsqueeze(2))
    print(f'Prediction: {output_test.item()}')

위의 코드에서는 학습 데이터로 inputs와 targets를 정의한 후에 RNN 모델을 초기화했습니다. 그리고 손실 함수로는 평균 제곱 오차(MSE, Mean Squared Error)를 사용하고, 최적화 함수로는 Adam을 선택했습니다.

학습을 진행하면서 모델의 예측 결과를 확인하기 위해, input_test로 테스트 데이터를 정의하고 이를 모델에 전달하여 예측값을 출력합니다.

마무리

이번 블로그 포스트에서는 PyTorch를 사용하여 시계열 데이터를 처리하고 RNN 모델을 구현하는 방법에 대해 알아보았습니다. 시계열 데이터를 다룰 때는 데이터를 torch.Tensor로 변환하고, RNN 모델을 구현할 때는 nn.RNN 또는 nn.LSTM을 사용하는 것을 기억해주세요. RNN 모델을 학습하고 예측하기 위해서는 데이터를 준비하고, 모델을 초기화하고, 손실 함수와 최적화 함수를 설정한 후에 학습을 진행하면 됩니다.