PyTorch 推荐系统项目
推荐系统是现代互联网应用的核心技术之一,广泛应用于电商、社交媒体、视频平台等领域。它通过分析用户行为数据,预测用户可能感兴趣的内容或商品,从而提供个性化推荐。本文将带你使用PyTorch构建一个简单的推荐系统,适合初学者学习和实践。
什么是推荐系统?
推荐系统是一种信息过滤系统,旨在预测用户对物品的偏好或评分。常见的推荐算法包括协同过滤、基于内容的推荐和混合推荐。本文将重点介绍基于协同过滤的推荐系统,并使用PyTorch实现。
项目概述
我们将构建一个基于矩阵分解的推荐系统,使用MovieLens数据集(一个经典的电影评分数据集)。通过分解用户-物品评分矩阵,我们可以学习用户和物品的潜在特征向量,从而预测用户对未评分物品的评分。
1. 数据准备
首先,我们需要加载并预处理数据。MovieLens数据集包含用户ID、电影ID和评分。我们将数据分为训练集和测试集。
python
import torch
import pandas as pd
from sklearn.model_selection import train_test_split
# 加载数据
ratings = pd.read_csv('ratings.csv')
# 将用户ID和电影ID映射为连续整数
user_ids = ratings['userId'].unique()
movie_ids = ratings['movieId'].unique()
user_to_idx = {user: idx for idx, user in enumerate(user_ids)}
movie_to_idx = {movie: idx for idx, movie in enumerate(movie_ids)}
ratings['user_idx'] = ratings['userId'].map(user_to_idx)
ratings['movie_idx'] = ratings['movieId'].map(movie_to_idx)
# 划分训练集和测试集
train_data, test_data = train_test_split(ratings, test_size=0.2, random_state=42)
2. 构建模型
我们将使用矩阵分解模型,其中用户和物品分别由潜在特征向量表示。模型的目标是通过用户和物品向量的点积来预测评分。
python
import torch.nn as nn
class MatrixFactorization(nn.Module):
def __init__(self, n_users, n_items, n_factors=20):
super(MatrixFactorization, self).__init__()
self.user_factors = nn.Embedding(n_users, n_factors)
self.item_factors = nn.Embedding(n_items, n_factors)
self.user_bias = nn.Embedding(n_users, 1)
self.item_bias = nn.Embedding(n_items, 1)
def forward(self, user, item):
user_vec = self.user_factors(user)
item_vec = self.item_factors(item)
user_bias = self.user_bias(user).squeeze()
item_bias = self.item_bias(item).squeeze()
return (user_vec * item_vec).sum(1) + user_bias + item_bias
3. 训练模型
接下来,我们定义损失函数和优化器,并训练模型。
python
model = MatrixFactorization(len(user_ids), len(movie_ids))
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
# 转换为PyTorch张量
train_users = torch.LongTensor(train_data['user_idx'].values)
train_items = torch.LongTensor(train_data['movie_idx'].values)
train_ratings = torch.FloatTensor(train_data['rating'].values)
# 训练循环
for epoch in range(10):
model.train()
optimizer.zero_grad()
predictions = model(train_users, train_items)
loss = criterion(predictions, train_ratings)
loss.backward()
optimizer.step()
print(f'Epoch {epoch+1}, Loss: {loss.item()}')
4. 评估模型
训练完成后,我们可以在测试集上评估模型的性能。
python
test_users = torch.LongTensor(test_data['user_idx'].values)
test_items = torch.LongTensor(test_data['movie_idx'].values)
test_ratings = torch.FloatTensor(test_data['rating'].values)
model.eval()
with torch.no_grad():
predictions = model(test_users, test_items)
test_loss = criterion(predictions, test_ratings)
print(f'Test Loss: {test_loss.item()}')
5. 实际应用
训练好的模型可以用于预测用户对未评分电影的评分,从而为用户推荐他们可能喜欢的电影。
python
def recommend_movies(user_id, top_n=5):
user_idx = user_to_idx[user_id]
all_movies = torch.LongTensor(range(len(movie_ids)))
user_tensor = torch.LongTensor([user_idx] * len(movie_ids))
with torch.no_grad():
predictions = model(user_tensor, all_movies)
top_movies = torch.argsort(predictions, descending=True)[:top_n]
return [movie_ids[movie] for movie in top_movies]
# 为用户推荐电影
recommended_movies = recommend_movies(user_id=1)
print(f'Recommended movies: {recommended_movies}')
总结
通过本文,我们学习了如何使用PyTorch构建一个基于矩阵分解的推荐系统。我们从数据预处理、模型构建、训练到评估,逐步实现了推荐系统的核心功能。推荐系统是一个广泛应用的领域,掌握其基本原理和实现方法对初学者来说非常重要。
附加资源
练习
- 尝试调整模型的潜在特征维度(
n_factors
),观察对模型性能的影响。 - 使用不同的优化器(如SGD)训练模型,比较其效果。
- 扩展模型,加入更多的特征(如用户年龄、电影类型)进行混合推荐。
提示
推荐系统的性能高度依赖于数据的质量和数量。在实际应用中,通常需要结合多种推荐算法和特征工程来提升推荐效果。