추천 시스템(Recommendation System)은 사용자의 과거 행동, 선호도, 유사 사용자의 패턴을 분석하여 관심 있을 아이템을 예측·추천하는 시스템이다. 넷플릭스, 유튜브, 아마존의 핵심 기술이다.
추천 시스템 유형
| 유형 | 방법 | 장점 | 단점 |
|---|
| 협업 필터링 | 사용자/아이템 유사도 | 콘텐츠 분석 불필요 | 콜드 스타트 |
| 콘텐츠 기반 | 아이템 특성 유사도 | 새 아이템 추천 가능 | 새 사용자 문제 |
| 하이브리드 | 협업 + 콘텐츠 | 균형 잡힌 성능 | 복잡도 |
| 딥러닝 | Neural CF, Wide&Deep | 복잡한 패턴 | 해석 어려움 |
| LLM 기반 | 자연어 이해 | 컨텍스트 이해 | 비용 |
행렬 분해 (Matrix Factorization)
python
import numpy as np
from scipy.sparse.linalg import svds
from sklearn.metrics.pairwise import cosine_similarity
# 사용자-아이템 평점 행렬 (0: 미평가)
ratings = np.array([
[5, 4, 0, 1, 2],
[4, 0, 0, 1, 1],
[1, 1, 0, 5, 4],
[0, 0, 4, 4, 0],
[2, 1, 5, 0, 0],
], dtype=float)
# SVD 분해 (k개의 잠재 요인)
U, sigma, Vt = svds(ratings, k=2)
sigma_matrix = np.diag(sigma)
predicted_ratings = U @ sigma_matrix @ Vt
def recommend(user_id: int, n: int = 3):
"""미평가 아이템 중 예측 평점 높은 순으로 추천"""
user_ratings = predicted_ratings[user_id]
unrated = np.where(ratings[user_id] == 0)[0]
ranked = sorted(unrated, key=lambda i: user_ratings[i], reverse=True)
return ranked[:n]
print(f"사용자 0 추천: {recommend(0)}")
Neural Collaborative Filtering
python
import torch
import torch.nn as nn
class NeuralCF(nn.Module):
def __init__(self, num_users, num_items, embedding_dim=64, hidden_dims=[128, 64, 32]):
super().__init__()
self.user_emb = nn.Embedding(num_users, embedding_dim)
self.item_emb = nn.Embedding(num_items, embedding_dim)
layers = []
in_dim = embedding_dim * 2
for h in hidden_dims:
layers += [nn.Linear(in_dim, h), nn.ReLU(), nn.Dropout(0.2)]
in_dim = h
layers.append(nn.Linear(in_dim, 1))
self.mlp = nn.Sequential(*layers)
def forward(self, user_ids, item_ids):
u = self.user_emb(user_ids)
v = self.item_emb(item_ids)
x = torch.cat([u, v], dim=-1)
return torch.sigmoid(self.mlp(x)).squeeze()
평가 메트릭
| 메트릭 | 설명 |
|---|
| RMSE/MAE | 평점 예측 오차 |
| Precision@K | 상위 K개 중 관련 아이템 비율 |
| Recall@K | 관련 아이템 중 상위 K에 포함된 비율 |
| NDCG@K | 순위 고려한 정규화 누적 이득 |