第2章 利用用户行为数据

基于用户行为分析的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法 称为协同过滤算法。顾名思义,协同过滤就是指用户可以齐心协力,通过不断地和网站互动,使 自己的推荐列表能够不断过滤掉自己不感兴趣的物品,从而越来越满足自己的需求。

2.1 用户行为数据简介

用户行为数据在网站上最简单的存在形式就是日志。网站在运行过程中都产生大量原始日志 (raw log),并将其存储在文件系统中。很多互联网业务会把多种原始日志按照用户行为汇总成会 话日志(session log),其中每个 会话表示一次用户行为和对应的服务。
用户行为在个性化推荐系统中一般分两种——显性反馈行为(explicit feedback)和隐性反馈 行为(implicit feedback)。显性反馈行为包括用户明确表示对物品喜好的行为。隐性反馈行为指的是那些不能明确反应用户喜好 的行为。最具代表性的隐性反馈行为就是页面浏览行为。


按照反馈的明确性分,用户行为数据可以分为显性反馈和隐性反馈,但按照反馈的方向分, 又可以分为正反馈和负反馈。正反馈指用户的行为倾向于指用户喜欢该物品,而负反馈指用户的 行为倾向于指用户不喜欢该物品。在显性反馈中,很容易区分一个用户行为是正反馈还是负反馈, 而在隐性反馈行为中,就相对比较难以确定。


一般来说,不同的数据集包含不同的行为, 目前比较有代表性的数据集有下面几个。

  • 无上下文信息的隐性反馈数据集 每一条行为记录仅仅包含用户ID和物品ID。 Book-Crossing1就是这种类型的数据集。
  • 无上下文信息的显性反馈数据集 每一条记录包含用户ID、物品ID和用户对物品的评分。
  • 有上下文信息的隐性反馈数据集 每一条记录包含用户ID、物品ID和用户对物品产生行为的时间戳。Lastfm数据集1就是这种类型的数据集。
  • 有上下文信息的显性反馈数据集 每一条记录包含用户ID、物品ID、用户对物品的评分和评分行为发生的时间戳。Netflix Prize提供的就是这种类型的数据集。

2.2 用户行为分析

2.2.1 用户活跃度和物品流行度的分布

很多关于互联网数据的研究发现,互联网上的很多数据分布都满足一种称为Power Law3的分 布,这个分布在互联网领域也称长尾分布。



这两幅图都是双对数曲线,而长尾分布在双对数曲线上应该呈直线。这两幅图中的曲线都呈 近似直线的形状,从而证明不管是物品的流行度还是用户的活跃度,都近似于长尾分布,特别是 物品流行度的双对数曲线,非常接近直线。

用户活跃度和物品流行度的关系

一般认为,新用户倾向于浏览热门的物品,因为他 们对网站还不熟悉,只能点击首页的热门物品,而老用户会逐渐开始浏览冷门的物品。图2-5展 示了MovieLens数据集中用户活跃度和物品流行度之间的关系,其中横坐标是用户活跃度,纵坐 2 标是具有某个活跃度的所有用户评过分的物品的平均流行度。如图2-5所示,图中曲线呈明显下 降的趋势,这表明用户越活跃,越倾向于浏览冷门的物品。


仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法。学术界对协同过滤算法 进行了深入研究,提出了很多方法,比如基于邻域的方法(neighborhood-based)、隐语义模型 (latent factor model)、基于图的随机游走算法(random walk on graph)等。在这些方法中, 最著名的、在业界得到最广泛应用的算法是基于邻域的方法,而基于邻域的方法主要包含下面两种算法。

  • 基于用户的协同过滤算法。这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品。
  • 基于物品的协同过滤算法 这种算法给用户推荐和他之前喜欢的物品相似的物品。

2.3 实验设计和算法评测

2.3.1数据集

该数据集包含6000多用户对4000多部电影的100万条 评分。该数据集是一个评分数据集,用户可以给电影评5个不同等级的分数(1~5分)。本章着重 研究隐反馈数据集中的TopN推荐问题,因此忽略了数据集中的评分记录。也就是说,TopN推荐 的任务是预测用户会不会对某部电影评分,而不是预测用户在准备对某部电影评分的前提下会给 电影评多少分。

2.3.2实验设计

协同过滤算法的离线实验一般如下设计。首先,将用户行为数据集按照均匀分布随机分成M 份(本章取M=8),挑选一份作为测试集,将剩下的M-1份作为训练集。然后在训练集上建立用户 兴趣模型,并在测试集上对用户行为进行预测,统计出相应的评测指标。为了保证评测指标并不 是过拟合的结果,需要进行M次实验,并且每次都使用不同的测试集。然后将M次实验测出的评 测指标的平均值作为最终的评测指标。
下面的Python代码描述了将数据集随机分成训练集和测试集的过程:

    def SplitData(data, M, k, seed):
        test = []
        train = []
        random.seed(seed)
        for user, item in data:
             if random.randint(0,M) == k:
                 test.append([user,item])
             else:
                 train.append([user,item])
        return train, test 

这里,每次实验选取不同的k(0≤k≤M-1)和相同的随机数种子seed,进行M次实验就可
以得到M个不同的训练集和测试集,然后分别进行实验,用M次实验的平均值作为最后的评测指 标。这样做主要是防止某次实验的结果是过拟合的结果(over fitting),但如果数据集够大,模型 够简单,为了快速通过离线实验初步地选择算法,也可以只进行一次实验。

2.3.3评测指标

对用户u推荐N个物品(记为R(u)),令用户u在测试集上喜欢的物品集合为T(u),然后可以通过准确率/召回率评测推荐算法的精度:



召回率描述有多少比例的用户—物品评分记录包含在最终的推荐列表中,而准确率描述最终 的推荐列表中有多少比例是发生过的用户—物品评分记录。下面两段代码给出了召回率和准确率 的计算方法。
除了评测推荐算法的精度,本章还计算了算法的覆盖率,覆盖率反映了推荐算法发掘长尾的 能力,覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。这里,我们采用最简单的 覆盖率定义:

最后,我们还需要评测推荐的新颖度,这里用推荐列表中物品的平均流行度度量推荐结果的新颖度。如果推荐出的物品都很热门,说明推荐的新颖度较低,否则说明推荐结果比较新颖。
这里,在计算平均流行度时对每个物品的流行度取对数,这是因为物品的流行度分布满足长 尾分布,在取对数后,流行度的平均值更加稳定。

2.4基于邻域的算法

2.4.1基于用户的协同过滤算法

1.基础算法

基于用户的协同过滤算法主要包括两个步骤。
(1) 找到和目标用户兴趣相似的用户集合。
(2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。
步骤(1)的关键就是计算两个用户的兴趣相似度。这里,协同过滤算法主要利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v) 为用户v曾经有过正反馈的物品集合。那么,我们可以通过如下的Jaccard公式简单地计算u和v的 兴趣相似度:



或者通过余弦相似度计算:



下面以图2-6中的用户行为记录为例,举例说明UserCF计算用户兴趣相似度的例子。在该 例中,用户A对物品{a, b, d}有过行为,用户B对物品{a, c}有过行为,利用余弦相似度公式计算用 户A和用户B的兴趣相似度为:

同理,我们可以计算出用户A和用户C、D的相似度:

得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的 物品。如下的公式度量了UserCF算法中用户u对物品i的感兴趣程度:



其中,S(u, K)包含和用户u兴趣最接近的K个用户,N(i)是对物品i有过行为的用户集合,wuv 是用户u和用户v的兴趣相似度,rvi代表用户v对物品i的兴趣,因为使用的是单一行为的隐反馈数 据,所以所有的rvi=1。

表2-4通过MovieLens数据集上的离线实验来评测基础算法的性能。UserCF只有一个重要的参 数K,即为每个用户选出K个和他兴趣最相似的用户,然后推荐那K个用户感兴趣的物品。因此离 线实验测量了不同K值下UserCF算法的性能指标。同时可以发现参数K 是UserCF的一个重要参数,它的调整对推荐算法的各种指标都会产生一定的影响。
 准确率和召回率 可以看到,推荐系统的精度指标(准确率和召回率)并不和参数K成线 性关系。在MovieLens数据集中,选择K=80左右会获得比较高的准确率和召回率。因此选 择合适的K对于获得高的推荐系统精度比较重要。当然,推荐结果的精度对K也不是特别 敏感,只要选在一定的区域内,就可以获得不错的精度。
 流行度 可以看到,在3个数据集上K越大则UserCF推荐结果就越热门。这是因为K决定 了UserCF在给你做推荐时参考多少和你兴趣相似的其他用户的兴趣,那么如果K越大,参 考的人越多,结果就越来越趋近于全局热门的物品。
 覆盖率 可以看到,在3个数据集上,K越大则UserCF推荐结果的覆盖率越低。覆盖率的 降低是因为流行度的增加,随着流行度增加,UserCF越来越倾向于推荐热门的物品,从 而对长尾物品的推荐越来越少,因此造成了覆盖率的降低。

2.用户相似度计算的改变

首先,以图书为例,如果两个用户都曾经买过《新华字典》,这丝毫不能说明他们兴趣相似, 因为绝大多数中国人小时候都买过《新华字典》。但如果两个用户都买过《数据挖掘导论》,那可 以认为他们的兴趣比较相似,因为只有研究数据挖掘的人才会买这本书。换句话说,两个用户对 冷门物品采取过同样的行为更能说明他们兴趣的相似度。因此,John S. Breese在论文1中提出了 如下公式,根据用户行为计算用户的兴趣相似度:


3.实际在线系统使用UserCF的例子

Digg的推荐系统设计思路如下。用户在Digg中主要通过“顶”和“踩”(如2-8所示,最左侧 的两个手形按钮就是“顶”和“踩”的按钮)两种行为表达自己对文章的看法。

2.4.2基于物品的协同过滤算法

1.基础算法
ItemCF算法并 不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的 相似度。
基于物品的协同过滤算法主要分为两步。
(1) 计算物品之间的相似度。
(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。


这里,分母|N(i)|是喜欢物品i的用户数,而分子 N(i)N(j) 是同时喜欢物品i和物品j的用户 数。因此,上述公式可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。这个公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。

图2-11是一个根据上面的程序计算物品相似度的简单例子。图中最左边是输入的用户行为记 录,每一行代表一个用户感兴趣的物品集合。然后,对于每个物品集合,我们将里面的物品两两 加一,得到一个矩阵。最终将这些矩阵相加得到上面的C矩阵。其中C[i][j]记录了同时喜欢物品i 和物品j的用户数。最后,将C矩阵归一化可以得到物品之间的余弦相似度矩阵W。


图2-12是一个基于物品推荐的简单例子。该例子中,用户喜欢《C++ Primer中文版》和《编 程之美》两本书。然后ItemCF会为这两本书分别找出和它们最相似的3本书,然后根据公式的定 义计算用户对每本书的感兴趣程度。比如,ItemCF给用户推荐《算法导论》,是因为这本书和《C++ Primer中文版》相似,相似度为0.4,而且这本书也和《编程之美》相似,相似度是0.5。考虑到 用户对《C++ Primer中文版》的兴趣度是1.3,对《编程之美》的兴趣度是0.9,那么用户对《算 法导论》的兴趣度就是1.3 × 0.4 + 0.9×0.5 = 0.97。


表2-8列出了在MovieLens数据集上ItemCF算法离线实验的各项性能指标的评测结果。该表包 括算法在不同K值下的性能。根据表2-8中的数据我们可以得出如下结论。

  • 精度(准确率和召回率) 可以看到ItemCF推荐结果的精度也是不和K成正相关或者负相 关的,因此选择合适的K对获得最高精度是非常重要的。
  • 流行度 和UserCF不同,参数K对ItemCF推荐结果流行度的影响也不是完全正相关的。 随着K的增加,结果流行度会逐渐提高,但当K增加到一定程度,流行度就不会再有明显 变化。
  • 覆盖率 K增加会降低系统的覆盖率。

2. 用户活跃度对物品相似度的影响
ohn S. Breese在论文1中提出了一个称为IUF(Inverse User Frequence),即用户活跃度对数的 倒数的参数,他也认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加IUF 参数来修正物品相似度的计算公式:

3. 物品相似度的归一化
Karypis在研究中发现如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。1 其研究表明,如果已经得到了物品相似度矩阵w,那么可以用如下公式得到归一化之后的相似度 矩阵w':


一般来说,热门的类其类内物品相似度一般比较大。如果不进行归一化,就会推荐 比较热门的类里面的物品,而这些物品也是比较热门的。因此,推荐的覆盖率就比较低。相反, 如果进行相似度的归一化,则可以提高推荐系统的覆盖率。

2.4.3UserCF和ItemCF的综合比较

UserCF给用户推荐那些和他有共同兴 趣爱好的用户喜欢的物品,而ItemCF给用户推荐那些和他之前喜欢的物品类似的物品。从这个算 法的原理可以看到,UserCF的推荐结果着重于反映和用户兴趣相似的小群体的热点,而ItemCF 的推荐结果着重于维系用户的历史兴趣。换句话说,UserCF的推荐更社会化,反映了用户所在的 6 小型兴趣群体中物品的热门程度,而ItemCF的推荐更加个性化,反映了用户自己的兴趣传承。
UserCF适合用于新闻推荐的原因是在新闻网站中,用户的兴趣不是特别细化,另一个原因是从技术角度考量的。因为作为一种物品,新闻的更 新非常快,每时每刻都有新内容出现,而ItemCF需要维护一张物品相关度的表,如果物品更新很 快,那么这张表也需要很快更新,这在技术上很难实现。
表2-11从不同的角度对比了UserCF和ItemCF算法。同时,我们也将前面几节的离线实验结果 展示在图2-13、图2-14和图2-15中。从图中可见,ItemCF算法在各项指标上似乎都不如UserCF, 特别是其推荐结果的覆盖率和新颖度都低于UserCF,这一点似乎和我们之前讨论的不太符合。


哈利波特问题
亚马逊网的研究人员在设计ItemCF算法之初发现ItemCF算法计算出的图书相关表存在一个 问题,就是很多书都和《哈利波特》相关。


前面说过,如果j非常热门,那么上面公式的分子 N (i)  N ( j) 就会越来越接近 N (i) 。尽 管上面的公式分母已经考虑到了j的流行度,但在实际应用中,热门的j仍然会获得比较大的相 似度。
哈利波特问题有几种解决方案。
第一种是最容易想到的,我们可以在分母上加大对热门物品的惩罚,比如采用如下公式:


上面的问题换句话说就是,两个不同领域的最热门物品之间往往具有比较高的相似度。这个 时候,仅仅靠用户行为数据是不能解决这个问题的,因为用户的行为表示这种物品之间应该相似 度很高。此时,我们只能依靠引入物品的内容数据解决这个问题,比如对不同领域的物品降低权 重等。这些就不是协同过滤讨论的范畴了。

2.5隐语义模型

2.5.1基础算法

它的核心思想是通过隐含特征 (latent factor)联系用户兴趣和物品。
总结一下,这个基于兴趣分类的方法大概需要解决3个问题。
 如何给物品进行分类?
 如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度?
 对于一个给定的类,选择哪些属于这个类的物品推荐给用户,以及如何确定这些物品在
一个类中的权重?
隐含语义分析技术从诞生到今天产生了很多著名的模型和方法,其中和该技术相关且耳熟能 详的名词有pLSA、LDA、隐含类别模型(latent class model)、隐含主题模型(latent topic model)、 矩阵分解(matrix factorization)。这些技术和方法在本质上是相通的,其中很多方法都可以用于 个性化推荐系统。本章将以LFM为例介绍隐含语义分析技术在推荐系统中的应用。
LFM通过如下公式计算用户u对物品i的兴趣:



这个公式中 pu,k 和 qi,k 是模型的参数,其中 pu,k 度量了用户u的兴趣和第k个隐类的关系,而 qi,k 度量了第k个隐类和物品i之间的关系。那么,下面的问题就是如何计算这两个参数。

通过2011年的KDD Cup的Yahoo! Music推荐系统比赛,我们发现对负样本采样时应该 遵循以下原则。
 对每个用户,要保证正负样本的平衡(数目相似)。
 对每个用户采样负样本时,要选取那些很热门,而用户却没有行为的物品。
如表2-14所示,随着负样本数目的增加,LFM的准确率和召回率有明显提高。不过当 ratio>10以后,准确率和召回率基本就比较稳定了。同时,随着负样本数目的增加,覆盖率不 断降低,而推荐结果的流行度不断增加,说明ratio参数控制了推荐算法发掘长尾的能力。如果 将LFM的结果与表2-6、表2-9、表2-10中ItemCF和UserCF算法的性能相比,可以发现LFM在所有 指标上都优于UserCF和ItemCF。当然,这只是在MovieLens一个数据集上的结果,我们也发现, 当数据集非常稀疏时,LFM的性能会明显下降,甚至不如UserCF和ItemCF的性能。关于这一点 读者可以通过实验自己研究。


2.5.2

为了解决传统LFM不能实时化,而产品需要实时性的矛盾,雅虎的研究人员 提出了一个解决方案。
他们的解决方案分为两个部分。首先,他们利用新闻链接的内容属性(关键词、类别等)得 到链接i的内容特征向量yi。其次,他们会实时地收集用户对链接的行为,并且用这些数据得到链 接i的隐特征向量qi。然后,他们会利用如下公式预测用户u是否会单击链接i:



其中,yi是根据物品的内容属性直接生成的,xuk是用户u对内容特征k的兴趣程度,用户向量
xu可以根据历史行为记录获得,而且每天只需要计算一次。而pu、qi是根据实时拿到的用户最近
几小时的行为训练LFM获得的。因此,对于一个新加入的物品i,可以通过 xT  y 估计用户u对物 ui
品i的兴趣,然后经过几个小时后,就可以通过 pT  q 得到更加准确的预测值。

2.5.3LFM和基于邻域的方法的比较

LFM是一种基于机器学习的方法,具有比较好的理论基础。这个方法和基于邻域的方法(比 如UserCF、ItemCF)相比,各有优缺点。下面将从不同的方面对比LFM和基于邻域的方法。
 理论基础
 离线计算的空间复杂度
 离线计算的时间复杂度
 在线实时推荐
 推荐解释

2.6基于图的模型

2.6.1 用户行为数据的二分图表示

基于图的模型(graph-based model)是推荐系统中的重要内容。其实,很多研究人员把基于 邻域的模型也称为基于图的模型,因为可以把基于邻域的模型看做基于图的模型的简单形式。


2.6.2基于图的推荐算法

将用户行为表示为二分图模型后,下面的任务就是在二分图上给用户进行个性化推荐。如果 将个性化推荐算法放到二分图模型上,那么给用户u推荐物品的任务就可以转化为度量用户顶点 vu和与vu没有边直接相连的物品节点在图上的相关性,相关性越高的物品在推荐列表中的权重就 越高。



虽然PersonalRank算法可以通过随机游走进行比较好的理论解释,但该算法在时间复杂度上 有明显的缺点。因为在为每个用户进行推荐时,都需要在整个用户物品二分图上进行迭代,直到 整个图上的每个顶点的PR值收敛。这一过程的时间复杂度非常高,不仅无法在线提供实时推荐, 甚至离线生成推荐结果也很耗时。
为了解决PersonalRank每次都需要在全图迭代并因此造成时间复杂度很高的问题,这里给出 两种解决方案。第一种很容易想到,就是减少迭代次数,在收敛之前就停止。这样会影响最终的 精度,但一般来说影响不会特别大。另一种方法就是从矩阵论出发,重新设计算法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,603评论 5 465
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,422评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,478评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,116评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,037评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,832评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,075评论 3 389
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,685评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,976评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,028评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,830评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,584评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,101评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,229评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,521评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,121评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,314评论 2 339

推荐阅读更多精彩内容