这篇文章主要讲解了“怎么使用TensorFlow和Keras”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用TensorFlow和Keras”吧!
成都创新互联,为您提供网站建设公司、成都网站制作、网站营销推广、网站开发设计,对服务玻璃钢坐凳等多个行业拥有丰富的网站建设及推广经验。成都创新互联网站建设公司成立于2013年,提供专业网站制作报价服务,我们深知市场的竞争激烈,认真对待每位客户,为客户提供赏心悦目的作品。 与客户共同发展进步,是我们永远的责任!
为了进行分析,我们将使用著名的数据集MovieLens 20M。
这个数据集包含了来自电影推荐服务MovieLens的2000多万个评分。下面是dataframe的示例:
该数据集列出了138000个用户和27000多部电影。经过清洗和过滤(我们只接受正面评价),我们有:
13.6万用户
2万部电影
1000万次互动
99.64%稀疏度
我们还可以从下面的直方图中看到,大多数电影的收视率都在5000以下…
而且大多数用户评价不超过500部电影。
这与大多数推荐系统问题是一致的:很少有用户对很多电影进行评分,很少有电影有很多评分。
我们可以根据这些数据建立一个点击矩阵。点击矩阵的格式如下所示。如果用户u与项i交互,则行u和列i上的单元格包含1,否则包含0。
我们还将点击向量xᵤ定义为点击矩阵的第u行向量。
为了评估模型的质量,我们将数据集分成3个子集,一个子集用于训练,一个子集用于验证,一个子集用于测试。我们将使用第一个子集训练模型,第二个子集在训练期间选择最佳模型,最后一个子集获得度量。
如前所述,我们将使用两个指标来评估我们的模型。第一个将是NDCG,它衡量质量和我们的推荐项目的顺序。我们首先需要定义DCG。DCG越高越好。DCG@p定义为:
I是指示函数,elem_i代表推荐列表的第i个元素。为了说明这个抽象公式,这里有一个简短的例子:
需要建议:{A,B,C}
建议1:[C、A、D]-DCG@3=1.63
建议2:[D、B、A]-DCG@3=1.13
注意,这些建议是有顺序的。因此,我们有:DCG₁ > DCG₂,因为预测1中的前两个项目是我们的目标项目,而这些项目位于预测2的列表末尾。
NDCG是DCG的近亲,将分数投影在0到1之间,以便它们在模型之间转换。
Personalization=计算每对推荐之间的距离,然后计算平均值。为了比较不同的个性化指数,我们将其标准化(就像我们对NDCG所做的那样,我们将分数投影在0到1之间)。为了说明这个指标,让我们看看下面的示例:
建议1:
用户1:[A,B,C]/用户2:[D,E,F] 个性化=1
建议2:
用户1:[A,B,C]/用户2:[A,B,C] 个性化=0
推荐系统可以分为两类:协同过滤和基于内容的过滤。
协同过滤是基于用户相似度的RS子族。它通过分析与用户u关系密切的其他用户的口味来预测用户u的兴趣。它基于关系密切的用户喜欢的东西是类似的。
基于内容的过滤是基于用户偏好和内容相似性的另一类RS,这意味着它基于这样一种想法:如果你喜欢item i,那么你更可能喜欢类似于i的项,而不是不同于它的项。
如上所述,基于内容的方法使用项目描述来查找与用户看到的最接近的项目。我尽可能详尽地实现了这个方法,但是一个几乎没有特征的数据集是这个方法的一个限制。MovieLens数据集只提供电影的类型。
但是,我们开发了一个简单的方法,如下面的伪代码所述:
reco = zero-vector of size number of items for i in items of user u: for j in the k closest items to i: reco[j] = max(reco[j]https://my.oschina.net/u/4253699/blog/,1 - dist(ihttps://my.oschina.net/u/4253699/blog/,j)) output recommendation reco
对于dist(i,j),使用类型向量之间的余弦距离。
NDCG@100:0.011
Personalization:0.958
NDCG非常低,这是因为每个样本的特征数量非常有限。
无冷启动:推荐系统(RS)中经常出现的问题之一是冷启动。当添加新项目或用户时,会出现此问题。由于没有可供推断的先前活动,推荐系统给的推荐就会有点生硬。在我们的场景中,一个项目的交互次数并不影响它最终被推荐的可能性,这意味着当涉及到新项目时,我们不存在冷启动问题。
实现简单:如上图所示,使用几行伪代码,算法相当简单。
查询时间是O(#items×#features),#代表个数,我们必须小心数据的大小。在不进行预处理的情况下,每次要求系统向用户推荐新内容时,它都必须找到与用户交互的每个项目最接近的k个项目。因为有项目可以比较,而每一个距离都需要计算特征来衡量,所以整个过程都需要O(#items × #features)。通过预处理,我们可以终止这个查询时间,但是我们需要在每个项中存储k个最近的项,这意味着在内存中存储k × #items 个项目。
仅当项目具有足够的特征时才有效:如结果所示,如果项目没有足够的特征,则此操作不起作用。例如如果有电影情节的描述,我们会有更好的结果。
基于记忆的推荐是一种计算用户和项目之间相似度的简单方法。与基于模型的方法不同,基于记忆的推荐没有要优化的参数。这是一个非常简单的算法,可以概括为以下几行伪代码:
输入用户u: 使用dist函数查找与u最接近的k个用户 在一个新向量v_u中聚集k个最近接近用户的向量 输出建议v_u
在我们的例子中,我们用以下方法实现了算法:
对于距离函数,我们使用了汉明距离:
我们使用的聚合函数为:
NDCG@100: 0.173
Personalization:0.715
实现简单:如上所示,使用少量伪代码,算法相当简单,易于实现。
可解释性:这是一些算法的一个重要特性。这允许向用户解释为什么向他们推荐特定内容。这可以是:“我们推荐你看电影A是因为你看了电影B”。
复杂度:这种方法的主要问题是它会使获得可缩放的对象变得更加困难。我们在这方面最好的朋友是本地敏感哈希(LSH)和最近邻搜索算法。
查询时间是O(#users×#items):没有预处理的查询时间对每个用户来说都很高,因为你需要以O(#items)的成本计算用户距离,以获得到所有其他用户的距离。然后我们需要找到k个最接近的用户,即O(#items)。通过预处理,我们可以结束这个查询时间,但是我们需要存储离每个用户最近的k个用户,这意味着k × #users个用户在内存中。
非负矩阵分解(Non-negative matrix factorization,NMF)是Netflix竞赛期间出现的一种著名的推荐系统算法。
NMF的思想是将点击矩阵分解为两个低维矩形矩阵,一个用于用户,一个用于项目,嵌入到可计算维度的向量中(我们称之为潜在空间)。将这两个矩阵相乘,得到一个新的矩阵,其值接近它们存在的原始点击矩阵,所有的空白都用(希望)好的预测填补。
NDCG@100: 0.315
Personalization:0.800
实现简单:一些库,如Surprise或sklearn可以实现矩阵分解!
潜在的可解释性:使用一些聚类和对它们的一些分析(找到共同的演员、流派等);从技术上来说,获得可解释的结果是可能的。
查询时间快:为了得到用户的推荐,我们只需要乘以一个向量和一个矩阵。
线性模型:矩阵分解的一个主要限制是它是一个线性模型,因此它不能捕获数据中更复杂的关系。尽管它是线性的,但我们看到它在NDCG方面给出了很好的结果。
神经矩阵因式分解(NeuMF)是一种尝试推广上述经典NMF的新方法。它是在本文中开发的。该模型采用两个整数(两个索引)作为表示项i和用户u的输入,并输出一个介于0和1之间的数字。输出表示用户u对项目i感兴趣的概率。
该神经网络的结构可以分为两部分:矩阵分解部分和全连接部分。然后连接起来传递到Sigmoid层。
NDCG@100:0.173
Personalization:0.017
下面,尽管我试图用许多不同的参数来正则化,但过拟合是不可避免的。
神经网络(非线性模型):NeuMF的主要优点之一是它是一个非线性模型,因此它可以捕获数据中更复杂的模式。然而,我们可以看到我们的NDCG比常规NMF要低。
对大数据集的过拟合:在最初的论文中,NeuMF改进了NMF模型,但它适用于较小的数据集。我们可以推断,对于较大的数据集,这种方法往往会过拟合。
查询时间是O(#items):此方法的问题之一是,对于给定的用户,我们需要解析所有项目。当项目数量增加时,这可能会成为一个可伸缩性问题。
受限玻尔兹曼机(RBM)是一种生成随机神经网络,具有非常简单的结构(一个输入层和一个隐藏层),可以用来学习输入上的概率分布,在我们的例子中是点击向量。
NDCG@100:0.155
Personalization:0.959
下图是验证集上随着epochs增加的NDCG@100
神经网络(非线性模型):由于RBM是一个神经网络,它是一个非线性模型,所以它可以捕捉数据中更复杂的模式。
潜在的可解释性:RBM从隐藏层表示的数据中学习复杂的特性。通过做一些分析(例如演员),有可能在技术上可以解释结果。
长期训练:这个模型的训练围绕着一种叫做吉布斯抽样的方法。这种方法意味着大量的采样,这是计算密集型的。
深度协同是一个直截了当的协同模型,旨在为用户预测最有用的项目。输入是用户的点击向量,原始输出是我们的建议。为了训练这个模型,我使用了用户点击向量的70%作为输入,剩下的作为输出。
架构很简单。有一个相同大小的输入和输出(#items),以及多个相同大小的隐藏层(1000个神经元)。
NDCG@100:0.353
Personalization:0.087
下面,和往常一样(验证集上随着epochs增加的NDCG@100):
神经网络(非线性模型):深度协同是一个非线性模型,因此它可以捕获数据中更复杂的模式。
查询时间快:该模型的主要优点是,在一次正向传递中,我们可以获得对给定用户的推荐,从而缩短查询时间。我们可以看到,模型的参数数量随着项目数量的增加而增加,但即使如此,它仍然比NeuMF快。
没有可解释性:这种深度神经网络使得无法解释结果。
自动编码器(AE)最初用于学习数据的表示(编码)。它们被分解为两部分:
编码器,它减少了数据的维度大小;
解码器,它将编码转换回其原始形式。由于存在降维,神经网络需要学习输入(潜在空间)的低维表示,以便能够重构输入。
在RS环境中,它们可以用来预测新的推荐。为了做到这一点,输入和输出都是点击向量(通常AE的输入和输出是相同的),我们将在输入层之后使用dropout。这意味着模型将不得不重构点击向量,因为输入中的某个元素将会丢失,因此要学会预测给定的点击向量的推荐值。
NDCG@100:0.382
Personalization:0.154
下面惯例(验证集上随着epochs增加的NDCG@100)。尽管我们试图用很多不同的参数来调整,但它很快就过拟合了。
神经网络(非线性模型):该模型是一个非线性模型,这意味着它可以捕获数据中更复杂的模式。
查询时间快:一次向前传递就足以获得给定用户的推荐。这意味着查询时间很快。
无可解释性:这种深度神经网络使得无法解释结果。
变分自编码器(VAE)是AE的扩展。它将有一个采样层,而不是简单的全连接层。这一层将使用从编码器的最后一层的均值和方差得到一个高斯样本,并使用它作为输入的解码器。跟AE一样,我们在第一层使用dropout。
NDCG@100:0.403
Personalization:0.117
下面,和往常一样(验证集上随着epochs增加的NDCG@100):
神经网络(非线性模型):VAE是一个非线性模型,因此它可以捕获数据中更复杂的模式。
查询时间快:一次向前传递就足以获得给定用户的推荐。因此查询时间很快。
更复杂的实现:采样层使得用反向传播计算梯度下降变得困难。重新参数化技巧使得利用方程z=ε×σ+μ,ε~N(0https://my.oschina.net/u/4253699/blog/,1)来解决这个问题成为可能。我们现在可以安全地计算梯度了。
不可解释:这种深度神经网络使得解释结果不可行。
混合模型提供了两个世界中最好的(基于记忆和基于模型的方法),因此在RS中非常流行。
为了实现混合方法,我选择使用VAE,然后将其结果与基于记忆的结果进行平均。
NDCG@100:0.334
Personalization:0.561
它的一部分是NN:作为VAE方法的一部分,它可以捕获数据中更复杂的模式。
可解释性:作为基于记忆的方法的一部分,我们得到了一个有趣的属性,我们可以向用户解释为什么我们推荐他们一个特定的项目。
查询时间是O(#users × #items):计算时间的瓶颈是基于记忆的部分。如上所示,它的查询时间是O(#users×#items),无需预处理。
我们现在可以比较我们所有的模型。NDCG@100最好的模型看是VAE。对于个性化索引,它是RBM。
感谢各位的阅读,以上就是“怎么使用TensorFlow和Keras”的内容了,经过本文的学习后,相信大家对怎么使用TensorFlow和Keras这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!