《推荐系统实践》 第三章 推荐系统冷启动问题 读书笔记

如何在没有大量用户数据的情况设计个性化推荐系统并且让用户对推荐结果满意从而愿意使用推荐系统,就是冷启动问题

冷启动问题简介

  • 用户冷启动 用户冷启动主要解决如何给新用户做个性化推荐的问题。当新用户到来时,我们没有他的行为数据,所以也无法根据他的历史行为预测其兴趣,从而无法借此给他做个性化推荐。
  • 物品冷启动 物品冷启动主要解决如何将新的物品推荐给可能对它感兴趣的用户这一问题。
  • 系统冷启动
    系统冷启动主要解决如何在一个新开发的网站上(还没有用户,也没有用户行为,只有一些物品的信息)设计个性化推荐系统,从而在网站刚发布时就让用户体验到个性化推荐服务这一问题。

解决方案如下:

  • 提供非个性化的推荐 非个性化推荐的最简单例子就是热门排行榜,我们可以给用户推荐热门排行榜,然后等到用户数据收集到一定的时候,再切换为个性化推荐。
  • 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化。
  • 利用用户的社交网络账号登录(需要用户授权),导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品。
  • 要求用户在登录时对一些物品进行反馈,收集用户对这些物品的兴趣信息,然后给用户推荐那些和这些物品相似的物品
  • 对于新加入的物品,可以利用内容信息,将它们推荐给喜欢过和它们相似的物品的用户。
  • 在系统冷启动时,可以引人专家的知识,通过一定的高效方式迅速建立起物品的相关度表。

利用用户注册信息

用户的注册信息分3种。

  • 人口统计学信息 包括用户的年龄、性别、职业、民族、学历和居住地。
  • 用户兴趣的描述 有一些网站会让用户用文字描述他们的兴趣。
  • 从其他网站导入的用户站外行为数据 比如用户通过豆瓣、新浪微博的账号登录,就可以在得到用户同意的情况下获取用户在豆瓣或者新浪微博的一些行为数据 和社交网络数据。

基于注册信息的个性化推荐流程基本如下:

  1. 获取用户的注册信息;
  2. 根据用户的注册信息对用户分类;
  3. 给用户推荐他所属分类中用户喜欢的物品。

**基于用户注册信息的推荐算法其核心问题是计算每种特征的用户喜欢的物品。**也就是说,对于每种特征f,计算具有这种特征的用户对各个物品的喜好程度p(f, i)。

在这里插入图片描述
上面这种定义可以比较准确地预测具有某种特征的用户是否喜欢某个物品。但是,在这种定义下,往往热门的物品会在各种特征的用户中都具有比较高的权重。也就是说具有比较高的权重|N(i)|.给用户推荐热门物品并不是推荐系统的主要任务,推荐系统应该帮助用户发现他们不容易发现的物品。因此,我们可以将p(f,i)定义为喜欢物品i的用户中具有特征f的比例:
在这里插入图片描述

这里分母中使用参数α的目的是解决数据稀疏问题。比如有一个物品只被1个用户喜欢过,而这个用户刚好就有特征f,那么就有p(f,i)=1。但是,这种情况并没有统计意义,因此我们为分母加上一个比较大的数,可以避免这样的物品产生比较大的权重。

有两个推荐系统数据集包含了人口统计学信息,一个是BookCrossing数据集”,
另一个是Lastfm数据集。

BookCrossing数据集包含用户对图书的行为信息,包含3个文件。

  • BX-Users.csv,包含用户的ID、位置和年龄。
  • BX-Books.csv,包含图书的ISBN、标题、作者、发表年代、出版社和缩略。
  • BX-Book-Ratings.csv,包含用户对图书的评分信息。

Lastfm数据集包含了更多的用户人口统计学信息,包括用户的性别、年龄和国籍。

我们准备用该数据集对比一下使用不同的人口统计学特征预测用户行为的精度。
步骤如下:
1.将数据集划分成10份,9份作为训练集,1份作为测试集。
2.我们在训练集上利用p(f,i)=|N(i)nU(f)|计算每一类用户对物品的兴趣程度p(f,i)。
3.在测试集中给每一类用户推荐p(f,i)最高的10个物品,并通过准确率和召回率计算预测准确度。同时,我们也会计算推荐的覆盖率来评测推荐结果。

我们按照不同的粒度给用户分类,对比了4种不同的算法。

  • MostPopular 给用户推荐最热门的歌手。
  • GenderMostPopular 给用户推荐对于和他同性别的用户最热门的歌手,这里我们将用户分成男女两类。
  • AgeMostPopular 给用户推荐对于和他同一个年龄段的用户最热门的歌手,这里我们将10岁作为一个年龄段,将用户按照不同的年龄段分类。
  • CountryMostPopular 给用户推荐对于和他同一个国家的用户最热门的歌手。
  • DemographicMostPopular 给用户推荐对于和他同性别、年龄段、国家的用户最热门的
    歌手。

从算法的描述可见,这4种算法具有不同的粒度,其中MostPopular粒度最粗,而DemographicMostPopular算法的粒度最细。一般说来,粒度越细,精度和覆盖率也会越高。
表3-3给出了实验结果。如结果所示,DemographicMostPopular算法的准确率、召回率和覆盖率更高。这说明,利用的用户人口统计学特征越多,越能准确地预测用户兴趣。同时,结果显示:
DemographicMostPopular > CountryMostPopular > AgeMostPopular > GenderMostPopular > MostPopular

在这里插入图片描述

选择合适的物品启动用户的兴趣

解决用户冷启动问题的另一个方法是在新用户第一次访问推荐系统时,不立即给用户展示推荐结果,而是给用户提供一些物品,让用户反馈他们对这些物品的兴趣,然后根据用户反馈给提供个性化推荐。很多推荐系统采取了这种方式来解决用户冷启动问题。以Jinni为例,当新用户访问推荐系统时,它会给出一条提示语,表示用户需要给多部电影评分才能获取推荐结果(如图3-7所示)。当用户选择给多部电影评分后,Jinni会首先展示一个页面让用户选择他喜欢的电影类别,当用户选择了某一个类别后,Jinni会展示第三个界面让用户对电影进行反馈。

对于这些通过让用户对物品进行评分来收集用户兴趣,从而对用户进行冷启动的系统,它们需要解决的首要问题就是如何选择物品让用户进行反馈。

一般来说,能够用来启动用户兴趣的物品需要具有以下特点:

  • 比较热门 如果要让用户对一个物品进行反馈,前提是用户知道这个物品是什么东西。以电影为例,如果一开始让用户进行反馈的电影都很冷门,而用户不知道这些电影的情节和内容,也就无法对它们做出准确的反馈。

  • 具有代表性和区分性 启动用户兴趣的物品不能是大众化或老少咸宜的,因为这样的物品对用户的兴趣没有区分性。还以电影为例,用一部票房很高且广受欢迎的电影做启动物品,可以想象的到的是几乎所有用户都会喜欢这部电影,因而无法区分用户个性化的兴趣。

  • 启动物品的集合需要有多样性 在冷启动时,我们不知道用户的兴趣,而用户兴趣的可能性非常多,为了匹配多样的兴趣,我们需要提供具有很高覆盖率的启动物品集合,这些物品能覆盖几乎所有主流的用户兴趣。Jinni在让用户反馈时没有直接拿电影让用户反馈,而是给出了12个电影类型,让用户先选择喜欢哪种类型,这样就很好地保证了启动物品集合的多样性。

上面这些因素都是选择启动物品时需要考虑的,但如何设计一个选择启动物品集合的系统呢?Nadav Golbandi在论文Adaptive Bootstrapping of Recommender Systems Using Decision Trees中探讨了这个问题,提出可以用一个决策树解决这个问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

利用物品的内容信息

物品冷启动需要解决的问题是如何将新加入的物品推荐给对它感兴趣的用户。

第2章介绍了两种主要的推荐算法——UserCF和ItemCF算法。

UserCF算法对物品冷启动问题并不非常敏感。因为,UserCF在给用户进行推荐时,会首先找到和用户兴趣相似的一群用户,然后给用户推荐这一群用户喜欢的物品。在很多网站中,推荐列表并不是给用户展示内容的唯一列表,那么当一个新物品加入时,总会有用户从某些途径看到这些物品,对这些物品产生反馈。那么,当一个用户对某个物品产生反馈后,和他历史兴趣相似的其他用户的推荐列表中就有可能出现这一物品,从而更多的人就会对这个物品产生反馈,导致更多的人的推荐列表中会出现这一物品,因此该物品就能不断地扩散开来,从而逐步展示到对它感兴趣用户的推荐列表中。

但是,有些网站中推荐列表可能是用户获取信息的主要途径,比如豆瓣网络电台。那么对于UserCF算法就需要解决第一推动力的问题,即第一个用户从哪儿发现新的物品。只要有一小部分人能发现并喜欢新的物品,UserCF算法就能将这些物品扩散到更多的用户中。解决第一推动力最简单的方法是将新的物品随机展示给用户,但这样显然不太个性化,因此可以考虑利用物品的内容信息,将新物品先投放给曾经喜欢过和它内容相似的其他物品的用户

ItemCF算法来说,物品冷启动就是一个严重的问题了。因为ItemCF算法的原理是给用户推荐和他之前喜欢的物品相似的物品。ItemCF算法会每隔一段时间利用用户行为计算物品相似度表(一般一天计算一次),在线服务时ItemCF算法会将之前计算好的物品相关度矩阵放在内存中。因此,当新物品加入时,内存中的物品相关表中不会存在这个物品,从而ItemCF算法无法推荐新的物品。解决这一问题的办法是频繁更新物品相似度表,但基于用户行为计算物品相似度是非常耗时的事情,主要原因是用户行为日志非常庞大。而且,新物品如果不展示给用户,用户就无法对它产生行为,通过行为日志计算是计算不出包含新物品的相关矩阵的。为此,我们只能利用物品的内容信息计算物品相关表,并且频繁地更新相关表(比如半小时计算一次)。

在这里插入图片描述

一般来说,物品的内容可以通过向量空间模型①表示,该模型会将物品表示成一个关键词向量。如果物品的内容是一些诸如导演、演员等实体的话,可以直接将这些实体作为关键词。但如果内容是文本的形式,则需要引入一些理解自然语言的技术抽取关键词,生成关键词向量。
在这里插入图片描述

在这里插入图片描述

如果物品是电影,可以根据演员在剧中的重要程度赋予他们权重。向量空间模型的优点是简单,缺点是丢失了一些信息,比如关键词之间的关系信息。不过在绝大多数应用中,向量空间模型对于文本的分类、聚类、相似度计算已经可以给出令人满意的结果。

在给定物品内容的关键词向量后,物品的内容相似度可以通过向量之间的余弦相似度计算:
在这里插入图片描述

在具体计算物品之间的内容相似度时,最简单的方法当然是对两两物品都利用上面的余弦相似度公式计算相似度,如下代码简单实现了这种方法:
在这里插入图片描述
在实际应用中,可以首先通过建立关键词—物品的倒排表加速这一计算过程,计算代码:

在这里插入图片描述
得到物品的相似度之后,可以利用上一章提到的ItemCF算法的思想,给用户推荐和他历史上喜欢的物品内容相似的物品。

也许有读者认为,既然内容相似度计算简单,能频繁更新,而且能够解决物品冷启动问题,那么为什么还需要协同过滤的算法。为了说明内容过滤算法和协同过滤算法的优劣,本节在MovieLens和GitHub两个数据集上进行了实验。为了对比,我们同时加入了Random和MostPopular两个非个性化的推荐算法作为基准。
在这里插入图片描述

从MovieLens数据集上的结果可以发现,ContentItemKNN的准确率和召回率仅仅优于Random算法,明显差于ItemCF算法,甚至比MostPopular算法还要差。不过在覆盖率和流行度指标上ContentItemKNN却优于ItemCF。这主要是因为内容过滤算法忽视了用户行为,从而也忽视了物品的流行度以及用户行为中所包含的规律,所以它的精度比较低,但结果的新颖度却比较高。

不过,事情不是绝对的。如果看GitHub数据集的结果,我们会发现完全相反的现象——Content-ItemKNN在所有指标上都优于ItemCF。这主要是因为GitHub提供了一个非常强的内容特征,就是开源项目的作者。在GitHub中,程序员会经常会关注同一个作者的不同项目,这一点是GitHub数据集最重要的特征。而协同过滤算法由于数据稀疏的影响,不能从用户行为中完全统计出这一特征,所以协同过滤算法反而不如利用了先验信息的内容过滤算法。这一点也说明,如果用户的行为强烈受某一内容属性的影响,那么内容过滤的算法还是可以在精度上超过协同过滤算法的。不过这种强的内容特征不是所有物品都具有的,而且需要丰富的领域知识才能获得,所以很多时候内容过滤算法的精度比协同过滤算法差。不过,这也提醒我们,如果能够将这两种算法融合,一定能够获得比单独使用这两种算法更好的效果向量空间模型在内容数据丰富时可以获得比较好的效果。以文本为例,如果是计算长文本的相似度,用向量空间模型利用关键词计算相似度已经可以获得很高的精确度。但是,如果文本很短,关键词很少,向量空间模型就很难计算出准确的相似度。

向量空间模型在内容数据丰富时可以获得比较好的效果。以文本为例,如果是计算长文本的相似度,用向量空间模型利用关键词计算相似度已经可以获得很高的精确度。但是,如果文本很短,关键词很少,向量空间模型就很难计算出准确的相似度。

LDA话题模型

引入

假设有两篇论文,它们的标题分别是“推荐系统的动态特性”和“基于时间的协同过滤算法研究”。如果读者对推荐系统很熟悉,可以知道这两篇文章的研究方向是类似的,但是它们标题中没有一样的关键词。其实,它们的关键词虽然不同,但却是相似的。“动态”和“基于时间”含义相似,“协同过滤”是“推荐系统”的一种算法。换句话说,这两篇文章的关键词虽然不同,但关键词所属的话题是相同的。在这种情况下,首先需要知道文章的话题分布,然后才能准确地计算文章的相似度。如何建立文章、话题和关键词的关系是话题模型(topic model)研究的重点。代表性的话题模型有LDA。

LDA模型假设

任何模型都有一个假设,LDA作为一种生成模型,对一篇文档产生的过程进行了建模。话题模型的基本思想是,一个人在写一篇文档的时候,会首先想这篇文章要讨论哪些话题,然后思考这些话题应该用什么词描述,从而最终用词写成一篇文章。因此,文章和词之间是通过话题联系的。

LDA模型构成

LDA中有3种元素,即文档、话题和词语。每一篇文档都会表现为词的集合,这称为词袋模型(bag of words)。每个词在一篇文章中属于一个话题。令D为文档集合,D[i]是第i篇文档。w[i][j]是第i篇文档中的第j个词。z[i][j]是第i篇文档中第j个词属于的话题。

LDA模型计算过程

LDA的计算过程包括初始化和迭代两部分。首先要对z进行初始化,而初始化的方法很简单,假设一共有K个话题,那么对第i篇文章中的第j个词,可以随机给它赋予一个话题。同时,用NWZ(w, z)记录词w被赋予话题z的次数,NZD(z, d)记录文档d中被赋予话题z的词的个数。

在这里插入图片描述
在初始化之后,要通过迭代使话题的分布收敛到一个合理的分布上去。伪代码如下所示:
在这里插入图片描述
LDA可以很好地将词组合成不同的话题。这里我们引用David M. Blei在论文中给出的一个实验结果。他利用了一个科学论文摘要的数据集,该数据集包含16 333篇新闻,共23 075个不同的单词。通过LDA,他计算出100个话题并且在论文中给出了其中4个话题排名最高(也就是p(w| z)最大)的15个词。从图3-12所示的聚类结果可以看到,LDA可以较好地对词进行聚类,找到每个词的相关词。
在这里插入图片描述
在使用LDA计算物品的内容相似度时,我们可以先计算出物品在话题上的分布,然后利用两个物品的话题分布计算物品的相似度。比如,如果两个物品的话题分布相似,则认为两个物品具有较高的相似度,反之则认为两个物品的相似度较低。计算分布的相似度可以利用KL散度(参见http://en.wikipedia.org/wiki/Kullback-Leibler_divergence):
在这里插入图片描述
其中p和 q是两个分布,KL散度越大说明分布的相似度越低。

发挥专家的作用

比如,Jinni在电影基因工程中采用了半人工、半自动的方式。首先,它让专家对电影进行标记,每个电影都有大约50个基因,这些基因来自大约1000个基因库。然后,在专家标记- -定的样本后,Jinni会使用自然语言理解和机器学习技术,通过分析用户对电影的评论和电影的一些内容属性对电影(特别是新电影)进行自己的标记。同时,Jinni也设计了让用户对基因进行反馈的界面,总之,Jinni通过专家和机器学习相结合的方法解决了系统冷启动问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值