用 Keras 实现图书推荐系统

栏目: 数据库 · 发布时间: 6年前

内容简介:本文为 AI 研习社编译的技术博客,原标题 :Building a book Recommendation System using Keras

用 Keras 实现图书推荐系统

本文为 AI 研习社编译的技术博客,原标题 :

Building a book Recommendation System using Keras

作者 |  Gilbert Tanner

翻译 |  王逍遥、 孙稚昊2、 UPDATA

校对 | 就2       整理 | 菠萝妹

原文链接:

https://towardsdatascience.com/building-a-book-recommendation-system-using-keras-1fba34180699

用 Keras 实现图书推荐系统

用 Keras 实现图书推荐系统

图 1: Photo by  Brandi Redd  on  Unsplash

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

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

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

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

    Embedding

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

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

用 Keras 实现图书推荐系统

图 2:Projector Embeddings

    获取数据

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

dataset = pd.read_csv('ratings.csv')
train, test = train_test_split(dataset, test_size=0.2, random_state=42)
n_users = len(dataset.user_id.unique())
n_books = len(dataset.book_id.unique())

用 Keras 实现图书推荐系统

图3:Rating-Dataset Head

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

  建立嵌入模型

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

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

1. 输入:包括书和用户

2. 嵌入层:书和用户的嵌入

3.点乘:使用点乘来合并各个嵌入向量

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

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

下面是创建模型的代码:

from keras.layers import Input, Embedding, Flatten, Dot, Dense
from keras.models import Model
book_input = Input(shape=[1], name="Book-Input")
book_embedding = Embedding(n_books, 5, name="Book-Embedding")(book_input)
book_vec = Flatten(name="Flatten-Books")(book_embedding)
user_input = Input(shape=[1], name="User-Input")
user_embedding = Embedding(n_users, 5, name="User-Embedding")(user_input)
user_vec = Flatten(name="Flatten-Users")(user_embedding)
prod = Dot(name="Dot-Product", axes=1)([book_vec, user_vec])
model = Model([user_input, book_input], prod)
model.compile('adam', 'mean_squared_error')

    训练模型

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

下面是训练代码:

history = model.fit([train.user_id, train.book_id], train.rating, epochs=10, verbose=1)
model.save('regression_model.h5')

    将嵌入可视化

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

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

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

# Extract embeddings
book_em = model.get_layer('Book-Embedding')
book_em_weights = book_em.get_weights()[0]

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

from sklearn.decomposition import PCA
import seaborn as sns
pca = PCA(n_components=2)
pca_result = pca.fit_transform(book_em_weights)
sns.scatterplot(x=pca_result[:,0], y=pca_result[:,1])

用 Keras 实现图书推荐系统

图4:Visualizing embeddings with PCA

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

from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, verbose=1, perplexity=40, n_iter=300)
tnse_results = tsne.fit_transform(book_em_weights)
sns.scatterplot(x=tnse_results[:,0], y=tnse_results[:,1])

用 Keras 实现图书推荐系统

图5:Visualizing embeddings with TSNE

    进行推荐

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

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

# Creating dataset for making recommendations for the first user
book_data = np.array(list(set(dataset.book_id)))
user = np.array([1 for i in range(len(book_data))])
predictions = model.predict([user, book_data])
predictions = np.array([a[0] for a in predictions])
recommended_book_ids = (-predictions).argsort()[:5]
print(recommended_book_ids)
print(predictions[recommended_book_ids])

这段代码输出:

array([4942, 7638, 8853, 9079, 9841], dtype=int64)
array([5.341809 , 5.159592 , 4.9970446, 4.9722786, 4.903894 ], dtype=float32)

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

books = pd.read_csv(‘books.csv’)
books.head()

用 Keras 实现图书推荐系统

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

用 Keras 实现图书推荐系统

    结论

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

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

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

  • 在点乘后加入全连接层

  • 训练更多轮

  • 对评分列做归一化

  • 等等

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

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

感谢Dipanjan (DJ) Sarkar.

想要继续查看该篇文章相关链接和参考文献?

长按链接点击打开或点击【 用 Keras 实现图书推荐系统 】:

https://ai.yanxishe.com/page/TextTranslation/1300

AI研习社每日更新精彩内容,观看更多精彩内容: 雷锋网雷锋网雷锋网 (公众号:雷锋网)

五个很厉害的 CNN 架构

一文带你读懂计算机视觉

用Pytorch做深度学习(第一部分)

Python高级技巧:用一行代码减少一半内存占用

等你来译:

(Python)3D人脸处理工具face3d

25个能放到数据湖中的语音研究数据集

如何在数据科学面试中脱颖而出 

Apache Spark SQL以及DataFrame的基本概念,架构以及使用案例

用 Keras 实现图书推荐系统


以上所述就是小编给大家介绍的《用 Keras 实现图书推荐系统》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

敏捷软件开发

敏捷软件开发

马丁 / 邓辉、孙鸣 / 人民邮电出版社 / 2008-01-01 / 69.00元

《敏捷软件开发:原则模式和实践(C#版)》不仅是一部深入浅出、生动易懂的面向对象原则与设计模式著作。而且还是一部通俗的敏捷方法导引书和快速实用的LJML教程。通过《敏捷软件开发:原则模式和实践(C#版)》你会发现,许多以前看起来非常枯燥费解的概念,忽然间都豁然开朗。变得鲜活生动起来。 C#版与此前的Java版相比,主要的更新包括加强了UML的介绍章节。使其更加贴近实战;增加了对MVP模式的介......一起来看看 《敏捷软件开发》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具