使用PyTorch构建电影推荐系统
立即解锁
发布时间: 2025-09-05 01:57:09 阅读量: 343 订阅数: 23 AIGC 

### 使用 PyTorch 构建电影推荐系统
在当今数字化时代,推荐系统在各个领域都发挥着至关重要的作用,尤其是在电影推荐领域。本文将详细介绍如何使用 PyTorch 构建一个电影推荐系统,从数据处理到模型训练,再到最终的推荐生成,为你呈现一个完整的推荐系统构建流程。
#### 1. 数据探索与处理
首先,我们需要对 MovieLens 数据集进行探索和处理。该数据集包含用户对电影的评分信息,其中存在一些缺失的评分值,用 NaN 表示。我们的目标是利用非空评分训练推荐系统,并预测这些缺失的评分,从而为每个用户生成电影推荐。
以下是处理数据集的代码:
```python
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import torch
import math
def create_dataset(ratings, top=None):
if top is not None:
ratings.groupby('userId')['rating'].count()
unique_users = ratings.userId.unique()
user_to_index = {old: new for new, old in enumerate(unique_users)}
new_users = ratings.userId.map(user_to_index)
unique_movies = ratings.movieId.unique()
movie_to_index = {
old: new for new, old in enumerate(unique_movies)}
new_movies = ratings.movieId.map(movie_to_index)
n_users = unique_users.shape[0]
n_movies = unique_movies.shape[0]
X = pd.DataFrame({'user_id': new_users, 'movie_id': new_movies})
y = ratings['rating'].astype(np.float32)
return (n_users, n_movies), (X, y), (user_to_index, movie_to_index)
# 假设 ratings 是已经加载好的评分数据
(n, m), (X, y), (user_to_index, movie_to_index) = create_dataset(ratings)
print(f'Embeddings: {n} users, {m} movies')
print(f'Dataset shape: {X.shape}')
print(f'Target shape: {y.shape}')
```
上述代码定义了一个 `create_dataset` 函数,它的主要作用是对用户和电影进行重新索引,并存储新索引与原始 ID 之间的映射关系。同时,该函数还创建了训练所需的输入数据(包含用户和电影索引)和输出数据(包含相应的评分值)。
接下来,我们将数据集划分为训练集和验证集:
```python
RANDOM_STATE = 42
X_train, X_valid, y_train, y_valid = train_test_split(
X, y, test_size=0.2, random_state=RANDOM_STATE)
datasets = {'train': (X_train, y_train), 'val': (X_valid, y_valid)}
dataset_sizes = {'train': len(X_train), 'val': len(X_valid)}
```
#### 2. 创建数据加载器
为了训练模型,我们需要创建一个数据加载器,用于迭代数据集的各个批次。以下是实现数据加载器的代码:
```python
class ReviewsIterator:
def __init__(self, X, y, batch_size=32, shuffle=True):
self.X = X
self.y = y
self.bs = batch_size
self.shuffle = shuffle
self.n_batches = int(math.ceil(X.shape[0] / batch_size))
self._current = 0
def __iter__(self):
return self
def __next__(self):
return self.next()
def next(self):
if self._current >= self.n_batches:
raise StopIteration()
k = self._current
self._current += 1
bs = self.bs
return self.X[k*bs:(k + 1)*bs], self.y[k*bs:(k + 1)*bs]
def batches(X, y, bs=32, shuffle=True):
for xb, yb in ReviewsIterator(X, y, bs, shuffle):
xb = torch.LongTensor(xb)
yb = torch.FloatTensor(yb)
# yield inputs (xb) and targets (yb) reshaped to have 1 column.
yield xb, yb.view(-1, 1)
```
我们可以使用以下代码测试数据加载器:
```python
for x_batch, y_batch in batches(X, y, bs=4):
print(x_batch)
print(y_batch)
break
```
这个数据加载器会以指定的批次大小迭代数据集,并将输入数据转换为 `torch.LongTensor` 类型,将目标数据转换为 `torch.FloatTensor` 类型。
#### 3. 定义 EmbeddingNet 模型
接下来,我们定义一个 EmbeddingNet 模型,用于预测用户对电影的评分。以下是模型的代码:
```python
import torch.nn as nn
import torch.nn.functional as F
import copy
class EmbeddingNet(nn.Module):
def __init__(self, n_users, n_movies,
n_factors=50, embedding_dropout=0.02,
hidden=10, dropouts=0.2):
super().__init__()
if isinstance(hidden, int):
hidden = [hidden]
if isinstance(dropouts, float):
dropouts = [dropouts]
```
0
0
复制全文
相关推荐









