[파이썬] PyTorch 추천 시스템 구축

추천 시스템은 사용자의 선호도를 예측하여 관련 상품이나 콘텐츠를 추천하기 위한 기술입니다. 최근에는 인공지능과 머신러닝 기술의 발전으로 추천 시스템이 더욱 정교해지고 있습니다. 이번 블로그에서는 PyTorch를 사용하여 추천 시스템을 구축하는 방법에 대해 살펴보겠습니다.

데이터 준비

추천 시스템을 구축하기 위해서는 사용자의 평가 데이터가 필요합니다. 일반적으로 사용자에게 제공된 항목에 대한 평가 점수를 가지고 있는 데이터셋을 사용합니다. 예를 들어, 영화 추천 시스템을 구축하기 위해서는 사용자가 영화에 대해 준 평점 데이터를 사용할 수 있습니다.

데이터셋 로드

import pandas as pd

# 데이터셋 로드
data = pd.read_csv('ratings.csv')

# 데이터셋 확인
print(data.head())

위 예제는 CSV 파일 형식의 평점 데이터셋을 로드하는 예시입니다. Pandas를 사용하여 데이터를 로드한 후, head() 함수를 사용하여 데이터의 일부를 확인할 수 있습니다.

모델 생성

PyTorch를 사용하여 추천 모델을 생성할 수 있습니다. 가장 간단한 추천 모델은 사용자와 항목 간의 상호작용을 나타내는 행렬 분해 모델입니다.

모델 정의

import torch
import torch.nn as nn

class MatrixFactorization(nn.Module):
    def __init__(self, num_users, num_items, embedding_dim):
        super(MatrixFactorization, self).__init__()
        self.user_embedding = nn.Embedding(num_users, embedding_dim)
        self.item_embedding = nn.Embedding(num_items, embedding_dim)
        
    def forward(self, user_indices, item_indices):
        user_embedded = self.user_embedding(user_indices)
        item_embedded = self.item_embedding(item_indices)
        return (user_embedded * item_embedded).sum(dim=1)

위 예제는 사용자와 항목의 임베딩을 위한 Embedding 레이어를 사용하는 행렬 분해 모델을 정의하는 예시입니다. forward() 함수에서 사용자와 항목 인덱스를 입력으로 받아 임베딩을 추출하고 내적을 통해 예측 점수를 계산합니다.

모델 학습

import torch.optim as optim
from torch.utils.data import DataLoader, Dataset

# 데이터셋 클래스 정의
class RatingDataset(Dataset):
    def __init__(self, user_indices, item_indices, ratings):
        self.user_indices = user_indices
        self.item_indices = item_indices
        self.ratings = ratings

    def __len__(self):
        return len(self.ratings)

    def __getitem__(self, idx):
        user_idx = self.user_indices[idx]
        item_idx = self.item_indices[idx]
        rating = self.ratings[idx]
        return {'user_idx': user_idx, 'item_idx': item_idx, 'rating': rating}

# 모델 및 옵티마이저 초기화
model = MatrixFactorization(num_users, num_items, embedding_dim)
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 데이터로더 생성
dataset = RatingDataset(data['user_idx'], data['item_idx'], data['rating'])
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

# 학습 반복
for epoch in range(num_epochs):
    for batch in dataloader:
        user_indices = batch['user_idx']
        item_indices = batch['item_idx']
        ratings = batch['rating']

        optimizer.zero_grad()
        predictions = model(user_indices, item_indices)
        loss = nn.MSELoss()(predictions, ratings)
        loss.backward()
        optimizer.step()

위 예제는 PyTorch의 DataLoader를 사용하여 데이터셋을 배치 단위로 로딩하고, Adam 옵티마이저를 사용하여 모델을 학습하는 예시입니다. 모델의 forward 메소드를 호출하여 예측 값을 계산하고, 평가 점수와의 Mean Squared Error를 최소화하는 방향으로 모델을 업데이트합니다.

평가 및 예측

훈련이 완료된 추천 모델을 사용하여 사용자에게 적합한 항목을 예측하고, 모델의 성능을 평가할 수 있습니다.

예측

# 특정 사용자의 예측 점수 계산
user_idx = 1
item_indices = torch.arange(num_items)
predictions = model(torch.tensor([user_idx] * num_items), item_indices)
top_k_items = predictions.argsort(descending=True)[:k].tolist()

위 예제는 특정 사용자의 예측 점수를 계산하고, 상위 k개의 항목을 추출하는 예시입니다. 모델의 forward 메소드를 호출할 때, 특정 사용자 인덱스와 모든 항목 인덱스를 입력으로 주어 예측 점수를 계산하고, 상위 k개를 추출합니다.

평가

from sklearn.metrics import mean_squared_error

# 모델의 예측 점수와 실제 평점 간의 MSE 계산
predictions = model(data['user_idx'], data['item_idx'])
mse = mean_squared_error(data['rating'], predictions.detach().numpy())

위 예제는 모델의 예측 점수와 실제 평점간의 평균 제곱 오차(Mean Squared Error)를 계산하는 예시입니다. 예측 점수와 실제 평점을 비교하여 모델의 성능을 평가할 수 있습니다.

결론

이러한 방법을 사용하여 PyTorch를 활용한 추천 시스템을 구현할 수 있습니다. 데이터셋의 로드, 모델의 정의와 학습, 그리고 최종적인 평가와 예측에 대해 살펴보았습니다. PyTorch는 머신러닝과 딥러닝 모델의 구현을 간편하게 도와주기 때문에, 추천 시스템 개발에 많은 도움이 될 것입니다.