6. 基于TFRS构建电影推荐系统

Posted 小天梦语

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6. 基于TFRS构建电影推荐系统相关的知识,希望对你有一定的参考价值。

概要:人工智能的核心是机器学习,深度学习则是机器学习中的一个新的研究方向,小天这个系列的文章将带你从机器学习入门到实战,这是第六篇。这篇文章我将介绍如何通过TFRS开源库实现一个推荐系统。



1


准备工作



推荐系统已经深入到我们生活的方方面面,比如你目前看到的订阅号文章就是基于推荐算法实现的;还有目前很热门的短视频,它的核心功能就是推荐系统;再比如,你在网上的购物,可能你都不知道你要买这个商品,可是它已经给你推荐好了,等等。


也许你也曾好奇推荐系统是如何实现的,这篇文章我将通过谷歌开源的机器学习推荐系统库实现一个电影推荐系统,当然这只是一个简易版的,目的是为了让你近距离感受推荐系统的诱人之处,后续我们会实现一个复杂的推荐系统.


注:本次数据集均使用TFRS开源库自带的数据集


第一步:导入相关库

from typing import Dict, Text
import numpy as np
import tensorflow as tfimport tensorflow_datasets as tfdsimport tensorflow_recommenders as tfrs


2


数据预处理



数据预处理包括下载数据和构建用户ID和电影标题的映射表

ratings = tfds.load('movielens/100k-ratings', split="train")movies = tfds.load('movielens/100k-movies', split="train")
ratings = ratings.map(lambda x: {"movie_title": x["movie_title"],"user_id": x["user_id"]})movies = movies.map(lambda x: x["movie_title"])

# 构建用户ID和电影标题映射表user_ids_vocabulary = tf.keras.layers.experimental.preprocessing.StringLookup(mask_token=None)user_ids_vocabulary.adapt(ratings.map(lambda x: x["user_id"]))
movie_titles_vocabulary = tf.keras.layers.experimental.preprocessing.StringLookup(mask_token=None)movie_titles_vocabulary.adapt(movies)



3


构建模型



class MovieLensModel(tfrs.Model):def __init__(self,user_model: tf.keras.Model,movie_model: tf.keras.Model,task: tfrs.tasks.Retrieval):super().__init__()
# 设置用户和电影模型self.user_model = user_modelself.movie_model = movie_model
# 设置检索任务self.task = task
def compute_loss(self, features: Dict[Text, tf.Tensor], training=False) -> tf.Tensor:# 定义损失函数.
user_embeddings = self.user_model(features["user_id"]) movie_embeddings = self.movie_model(features["movie_title"])
return self.task(user_embeddings, movie_embeddings)
 # 定义用户模型.user_model = tf.keras.Sequential([ user_ids_vocabulary, tf.keras.layers.Embedding(user_ids_vocabulary.vocab_size(), 64)])# 定义电影模型movie_model = tf.keras.Sequential([ movie_titles_vocabulary, tf.keras.layers.Embedding(movie_titles_vocabulary.vocab_size(), 64)])
# 设定目标task = tfrs.tasks.Retrieval(metrics=tfrs.metrics.FactorizedTopK( movies.batch(128).map(movie_model)))



4


训练模型


# 训练模型并验证model = MovieLensModel(user_model, movie_model, task)model.compile(optimizer=tf.keras.optimizers.Adagrad(0.5))
# 训练3个epoch.model.fit(ratings.batch(4096), epochs=3)
# 使用暴力搜索来设置使用训练的表示的检索index = tfrs.layers.factorized_top_k.BruteForce(model.user_model)index.index(movies.batch(100).map(model.movie_model), movies)



5


验证


_, titles = index(np.array(["42"]))print(f"Top 3 recommendations for user 42: {titles[0, :3]}")

运行结果如下:


我们可以看到通过训练,该模型已经可以为用户推荐了,我们测试为ID为3的用户推荐了三部电影了,分别是:终极笑探总动员,海市蜃楼和亚里士多德.





以上是关于6. 基于TFRS构建电影推荐系统的主要内容,如果未能解决你的问题,请参考以下文章

电影推荐系统(037~039)

Keras深度学习实战(31)——构建电影推荐系统

如何只使用标签来构建一个简单的电影推荐系统

如何评估基于内容的推荐系统

Coursera在线学习---第九节.推荐系统

Python基于机器学习方法实现的电影推荐系统