专栏首页AI科技评论干货 | 用 Keras 实现图书推荐系统

干货 | 用 Keras 实现图书推荐系统

推荐系统试图依据用户旧物品评级或偏好来预测对某一物品的评级或偏好。为了提高服务质量,几乎每个大公司都使用推荐系统。

在本文中,我们将研究如何使用Embedding来创建图书推荐系统。

对于我们的数据,我们将使用goodbooks-10k数据集,它包含1万种不同的图书和大约100万个评级。它有三个特性:book_id、user_id和评级(rating)。

如果您不想自己从Kaggle下载数据集,可以从我的my Github repository中获得本文所涉及的文件和完整代码。

Embedding

嵌入是一种映射,从离散的对象(如单词或在我们的例子里是图书id)到连续值向量的映射。这可以用来发现离散对象之间的相似性,如果不使用嵌入层,模型就不会发现这些相似性。

嵌入向量是低维的并且在训练网络时得到更新。下图显示了使用谷歌开源的高纬数据可视化 Tensorflows Embedding Projector 创建的嵌入示例。

图 2:Projector Embeddings

获取数据

首先使用Pandas加载数据集。之后将数据集拆分为训练集和测试集,我们将创建两个变量,分别用来存储去重后的用户id和书籍id(并不是用户数量)。

图3:Rating-Dataset Head

数据集已经被清洗过,所以我们无需做更多的数据清洗或者数据预处理的步骤。

建立嵌入模型

使用Keras 的深度学习框架可以很容易地创建神经网络嵌入模型,以及处理多个输入和输出层。

我们的模型有以下的结构:

  1. 输入:包括书和用户
  2. 嵌入层:书和用户的嵌入
  3. 点乘:使用点乘来合并各个嵌入向量

在一个嵌入模型中,嵌入的权重要在训练中学习得到。这些嵌入不仅能用来从数据中提取信息,他们本身也可以被提取或者可视化。

为了简单起见,我不在模型最后加上全连接层,虽然加上可以提高不少准确率。如果你想要更精确的模型,你可以加上试试。

下面是创建模型的代码:

训练模型

现在我们已经建好了模型,准备训练模型。由于模型包含两个输入层(一个是书籍输入,一个是用户输入),我们需要将训练集组合成一个数组作为 x 输入。在本文中, 我对模型训练了 10 epochs,如果想得到更好的结果,你可以训练更长的时间。

下面是训练代码:

将嵌入可视化

嵌入可以被用来可视化一些概念,比如不同书之间的关系。为了可视化这些概念,我们需要减少向量维读,通过一些降维的技术,比如 主成分分析 (PCA),或者t-分布领域嵌入算法(t-SNE)。

从10000维开始 (每一维是一本书),我们通过嵌入模型把它减少到5维,再通过PCA 或t-SNE 把它减少到2维。

首先,我们用 get_layer 函数来提取嵌入:

现在我们用PCA来把嵌入转化为2维向量,并且用Seaborn把结果画成散点图:

图4:Visualizing embeddings with PCA

同样的事也可以用t-SNE:

from sklearn.manifold import TSNE

图5:Visualizing embeddings with TSNE

进行推荐

使用我们训练的模型进行推荐很简单。我们只需要输入一个用户和所有图书,然后选择对该特定用户具有最高预测评级的图书。

下面的代码显示了对特定用户进行预测的过程:

这段代码输出:

导入图书 csv ,得到更多的信息:

print(books[books[‘id’].isin(recommended_book_ids)])

结论

嵌入是一种把离散的物体,比如单词,转化为连续值向量的方法。嵌入对寻找物体相似度,可视化等目标很有帮助,并且可以用来做另一个机器学习模型的输入。

这个例子肯定不是完美的,有很多方法可以被尝试来提高准确率。但对于高级的问题,用嵌入来学习输入是一个好的出发带你。

下面的方法可以得到更好的结果:

  • 在点乘后加入全连接层
  • 训练更多轮
  • 对评分列做归一化
  • 等等

如果你喜欢这篇文章,可以订阅我的youtube频道,并且在社交网络上关注我。

如果有任何问题,可以到我的twitter 上评论。

感谢Dipanjan (DJ) Sarkar.

本文分享自微信公众号 - AI科技评论(aitechtalk)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从静态到动态,词表征近几十年发展回顾

    在自然语言处理技术的整个发展历史中,如何把最小语义元素「单词」做数字化表示,一直都是一个研究热点。

    AI科技评论
  • NAACL 2019 | ​注意力模仿:通过关注上下文来更好地嵌入单词

    在稀疏上下文信息的情况下,很难得到较高质量的低频单词嵌入,“模仿”被认为是一种可行的解决方案:通过给定标准算法的词嵌入,首先训练模型出现频次高的单词的嵌入,然后...

    AI科技评论
  • 微软新作,ImageBERT虽好,千万级数据集才是亮点

    继 2018 年谷歌的 BERT 模型获得巨大成功之后,在纯文本之外的任务上也有越来越多的研究人员借鉴了 BERT 的思维,开发出各种语音、视觉、视频融合的 B...

    AI科技评论
  • Jeff Dean强推:可视化Bert网络,发掘其中的语言、语法树与几何学

    本文是论文(Visualizing and Measuring the Geometry of BERT)的系列笔记的第一部分。这篇论文由Andy Coenen...

    大数据文摘
  • 如何可视化BERT?你需要先理解神经网络的语言、树和几何性质

    语言的结构是离散的,而神经网络则基于连续数据运作:高维空间中的向量。成功的语言处理网络必须要能将语言的符号信息转译为某种几何表征——但是这种表征该是怎样的形式呢...

    机器之心
  • Jeff Dean强推:可视化Bert网络,发掘其中的语言、语法树与几何学

    这篇文章是为了补充解释论文,大致呈现了主要的结论。请参阅论文以获得完整的参考文献和更多信息

    代码医生工作室
  • 从静态到动态,词表征近几十年发展回顾

    在自然语言处理技术的整个发展历史中,如何把最小语义元素「单词」做数字化表示,一直都是一个研究热点。

    AI科技评论
  • 【干货】Entity Embeddings : 利用深度学习训练结构化数据的实体嵌入

    【导读】本文是数据科学家Rutger Ruizendaal撰写的一篇技术博客,文章提出深度学习在非结构数据中有不错的表现,当前通过实体嵌入也可以使之在结构化数据...

    WZEARW
  • 部署基于嵌入的机器学习模型的通用模式

    由于最近大量的研究,机器学习模型的性能在过去几年里有了显著的提高。虽然这些改进的模型开辟了新的可能性,但是它们只有在可以部署到生产应用中时才开始提供真正的价值。...

    OpenCV学堂
  • 文本的词嵌入是什么?

    词嵌入(Word embeddings)是一种单词的表示形式,它允许意义相似的单词具有类似的表示形式。

    StoneDemo

扫码关注云+社区

领取腾讯云代金券