利用pytorch实现推荐模型NCF
时间: 2023-11-12 21:06:15 浏览: 104
NCF是一种基于神经网络的协同过滤推荐模型,它将用户和物品的交互矩阵作为输入,通过神经网络将用户和物品映射到一个低维空间中,并用内积计算两者之间的相关性得分。下面介绍如何使用PyTorch实现NCF推荐模型。
1. 数据预处理
首先,我们需要准备训练数据。通常情况下,训练数据由用户-物品交互矩阵组成,其中每个元素表示用户对某个物品的评分或点击行为。我们可以使用Pandas库读取和处理数据,如下所示:
```python
import pandas as pd
import numpy as np
# 读取数据
data = pd.read_csv('ratings.csv')
# 将用户和物品ID映射为连续的整数
user_ids = data['user_id'].unique()
user2id = {u: i for i, u in enumerate(user_ids)}
item_ids = data['item_id'].unique()
item2id = {i: j for j, i in enumerate(item_ids)}
data['user_id'] = data['user_id'].apply(lambda x: user2id[x])
data['item_id'] = data['item_id'].apply(lambda x: item2id[x])
# 将数据拆分为训练集、验证集和测试集
train_data = data.iloc[:80000]
val_data = data.iloc[80000:90000]
test_data = data.iloc[90000:]
```
2. 定义NCF模型
接下来,我们需要定义NCF模型。NCF模型由三个部分组成:用户嵌入层、物品嵌入层和全连接层。用户和物品嵌入层将用户和物品ID映射为低维向量,全连接层将这些向量拼接起来并通过一系列非线性变换得到最终的相关性得分。代码如下所示:
```python
import torch
import torch.nn as nn
class NCF(nn.Module):
def __init__(self, num_users, num_items, hidden_size):
super(NCF, self).__init__()
self.user_embedding = nn.Embedding(num_users, hidden_size)
self.item_embedding = nn.Embedding(num_items, hidden_size)
self.fc_layers = nn.Sequential(
nn.Linear(hidden_size * 2, 64),
nn.ReLU(),
nn.Linear(64, 1),
nn.Sigmoid()
)
def forward(self, user_ids, item_ids):
user_vectors = self.user_embedding(user_ids)
item_vectors = self.item_embedding(item_ids)
vectors = torch.cat([user_vectors, item_vectors], dim=1)
scores = self.fc_layers(vectors)
return scores
```
3. 定义训练和评估函数
接下来,我们需要定义训练和评估函数。训练函数将训练数据输入模型,计算损失并根据损失更新模型参数。评估函数将验证集输入模型,计算预测得分并计算评估指标(如准确率、召回率、F1值等)。代码如下所示:
```python
def train(model, train_data, val_data, num_epochs, batch_size, lr):
criterion = nn.BCELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
for epoch in range(num_epochs):
model.train()
total_loss = 0.0
for i in range(0, len(train_data), batch_size):
batch_data = train_data.iloc[i:i+batch_size]
user_ids = torch.LongTensor(batch_data['user_id'].values)
item_ids = torch.LongTensor(batch_data['item_id'].values)
labels = torch.FloatTensor(batch_data['rating'].values)
optimizer.zero_grad()
outputs = model(user_ids, item_ids)
loss = criterion(outputs.squeeze(), labels)
loss.backward()
optimizer.step()
total_loss += loss.item() * len(batch_data)
print('Epoch %d, train loss: %.4f' % (epoch+1, total_loss / len(train_data)))
evaluate(model, val_data)
def evaluate(model, val_data):
model.eval()
user_ids = torch.LongTensor(val_data['user_id'].values)
item_ids = torch.LongTensor(val_data['item_id'].values)
labels = val_data['rating'].values
with torch.no_grad():
outputs = model(user_ids, item_ids)
scores = outputs.squeeze().numpy()
predictions = (scores >= 0.5).astype(int)
accuracy = np.mean(predictions == labels)
print('Accuracy: %.4f' % accuracy)
```
4. 训练和评估模型
最后,我们可以使用训练和评估函数训练和评估NCF模型。代码如下所示:
```python
num_users = len(user_ids)
num_items = len(item_ids)
hidden_size = 64
model = NCF(num_users, num_items, hidden_size)
train(model, train_data, val_data, num_epochs=10, batch_size=256, lr=0.001)
evaluate(model, test_data)
```
运行以上代码,即可训练和评估NCF推荐模型。需要注意的是,NCF模型的训练非常耗时,建议使用GPU进行加速。