TensorFlow Ranking快速入门:基于MovieLens的个性化电影推荐系统
引言
在当今信息爆炸的时代,推荐系统已成为解决信息过载问题的关键技术。TensorFlow Ranking作为专门用于学习排序(LTR)的库,为构建高效的推荐系统提供了强大支持。本文将带您快速上手TensorFlow Ranking,通过MovieLens数据集构建一个个性化的电影推荐系统。
环境准备与数据加载
首先需要安装必要的依赖库:
pip install tensorflow-ranking tensorflow-datasets
MovieLens 100K数据集包含10万条用户对电影的评分,非常适合用于推荐系统的入门实践。我们主要关注三个关键字段:
user_id
: 用户唯一标识movie_title
: 电影标题user_rating
: 用户评分(1-5分)
import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_ranking as tfr
# 加载评分数据和电影数据
ratings = tfds.load('movielens/100k-ratings', split="train")
movies = tfds.load('movielens/100k-movies', split="train")
数据预处理
特征工程
我们需要将原始数据转换为模型可处理的格式:
- 特征选择:仅保留用户ID、电影标题和评分
- 构建词汇表:将用户ID和电影标题转换为整数索引
# 构建用户和电影词汇表
user_ids_vocabulary = tf.keras.layers.StringLookup(mask_token=None)
user_ids_vocabulary.adapt(users.batch(1000))
movie_titles_vocabulary = tf.keras.layers.StringLookup(mask_token=None)
movie_titles_vocabulary.adapt(movies.batch(1000))
数据分组
推荐系统的核心是为每个用户生成个性化的排序列表。我们按用户ID分组,将每个用户的所有评分记录组织在一起:
key_func = lambda x: user_ids_vocabulary(x["user_id"])
reduce_func = lambda key, dataset: dataset.batch(100)
ds_train = ratings.group_by_window(
key_func=key_func, reduce_func=reduce_func, window_size=100)
模型构建
我们采用经典的双塔模型架构:
- 用户塔:学习用户特征表示
- 物品塔:学习电影特征表示
class MovieLensRankingModel(tf.keras.Model):
def __init__(self, user_vocab, movie_vocab):
super().__init__()
self.user_vocab = user_vocab
self.movie_vocab = movie_vocab
# 用户和电影的嵌入层
self.user_embed = tf.keras.layers.Embedding(
user_vocab.vocabulary_size(), 64)
self.movie_embed = tf.keras.layers.Embedding(
movie_vocab.vocabulary_size(), 64)
def call(self, features):
# 计算用户和电影的嵌入向量
user_embeddings = self.user_embed(self.user_vocab(features["user_id"]))
movie_embeddings = self.movie_embed(
self.movie_vocab(features["movie_title"]))
# 通过点积计算排序分数
return tf.reduce_sum(user_embeddings * movie_embeddings, axis=2)
模型训练与评估
损失函数与评估指标
排序问题有其特殊性,我们使用专门的损失函数和评估指标:
- Softmax Loss:考虑列表中所有项目的相对排序
- NDCG:考虑排序位置的信息增益
- MRR:衡量第一个相关结果的位置
model = MovieLensRankingModel(user_ids_vocabulary, movie_titles_vocabulary)
optimizer = tf.keras.optimizers.Adagrad(0.5)
loss = tfr.keras.losses.get(
loss=tfr.keras.losses.RankingLossKey.SOFTMAX_LOSS, ragged=True)
eval_metrics = [
tfr.keras.metrics.get(key="ndcg", name="metric/ndcg", ragged=True),
tfr.keras.metrics.get(key="mrr", name="metric/mrr", ragged=True)
]
model.compile(optimizer=optimizer, loss=loss, metrics=eval_metrics)
训练过程
model.fit(ds_train, epochs=3)
生成推荐
训练完成后,我们可以为特定用户生成个性化推荐:
# 获取所有电影候选集
for movie_titles in movies.batch(2000):
break
# 为用户42生成推荐
inputs = {
"user_id": tf.expand_dims(tf.repeat("42", repeats=movie_titles.shape[0]), axis=0),
"movie_title": tf.expand_dims(movie_titles, axis=0)
}
# 获取推荐结果
scores = model(inputs)
titles = tfr.utils.sort_by_scores(scores,
[tf.expand_dims(movie_titles, axis=0)])[0]
print(f"Top 5 recommendations for user 42: {titles[0, :5]}")
总结
通过本教程,我们完成了以下工作:
- 使用TensorFlow Ranking构建了一个基于双塔架构的推荐系统
- 实现了从数据处理到模型训练的全流程
- 了解了排序问题特有的损失函数和评估指标
这个基础模型可以进一步扩展:
- 添加更多用户和物品特征
- 尝试更复杂的模型架构
- 引入负采样策略
- 实现线上A/B测试框架
TensorFlow Ranking为构建工业级推荐系统提供了强大的工具集,值得深入探索。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考