初探机器学习之推荐系统的基础知识

 最近公司有意做一款机器学习的应用,主要集中于推荐系统这个方向,因此看了看一些基础知识,此篇是一个学习总结,不算是完整原创文章

一、推荐系统是神马

维基百科这样解释道:推荐系统属于资讯过滤的一种应用。推荐系统能够将可能受喜好的资讯或实物(例如:电影、电视节目、音乐、书籍、新闻、图片、网页)推荐给使用者。

  推荐系统的基本流程有哪些:

  Step1.首先收集用户的历史行为数据

  Step2.然后通过预处理的方法得到用户-评价矩阵

  Step3.利用机器学习领域中相关推荐技术(主要指算法)形成对用户的个性化推荐

  PS:有的推荐系统还搜集用户对推荐结果的反馈,并根据实际的反馈信息实时调整推荐策略,产生更符合用户需求的推荐结果。  

  常见的推荐系统应用场景实例:

  站在剁手党的视角 => 哎呀妈呀,都是俺喜欢的,剁手还是不剁手,This is a question!

  

  站在音乐发烧友的视角 => 额,这首歌好听,喜欢,那首歌好听,我也喜欢!尽给我推我喜欢的歌单!收藏了。

  

  站在社交达人的视角 => 热门话题,都是我关注的,赶紧去镇楼!

  

  推荐系统的作用何在:

  (1)帮助用户找到想要的 => 长尾理论

  经常点开淘宝时,面对眼花缭乱的打折活动我们不知道要买啥。

  在经济学中,有一个著名的理论叫做“长尾理论”,如下图所示:

  

长尾曲线模型

  在互联网领域中,指的就是最热的那一小部分资源将得到绝大部分的关注,而剩下的很大一部分资源却鲜少有人问津。这不仅造成了资源利用上的浪费,也让很多口味偏小众的用户无法找到自己感兴趣的内容。

  因此推荐系统的最重要作用就是,激活那些对客户真正有用却没有真正得到关注的内容。

  (2)降低信息过载

  互联网时代信息量已然处于爆炸状态,若是将所有内容都放在网站首页上用户是无从阅读的,信息的利用率将会十分低下。

  因此我们需要推荐系统来帮助用户过滤掉低价值的信息。

  (3)提高站点点击率/转化率

  好的推荐系统能让用户更频繁地访问一个站点,并且总是能为用户找到他想要购买的商品或者阅读的内容。

  (4)加深对用户的了解以便提供定制化服务

  每当系统成功推荐了一个用户感兴趣的内容后,我们对该用户的兴趣爱好等维度上的形象是越来越清晰的。当我们能够精确描绘出每个用户的形象之后,就可以为他们定制一系列服务,让拥有各种需求的用户都能在我们的平台上得到满足。

用户模型分析矩阵

二、推荐系统常见算法

2.1 推荐算法初窥

  推荐算法到底是个啥?我们可以把它简化为一个函数。函数接受若干个参数,输出一个返回值,如下图所示:

  

f(x) = y ?

  正如上图,在推荐算法中,输入参数是用户和item的各种属性和特征(包括年龄、性别、地域、商品的类别、发布时间等等),经过推荐算法处理后,返回一个按照用户喜好度排序的item列表。

2.2 常见推荐算法

  常见推荐算法大致可以分为以下几种:

  • 基于流行度的算法
  • 协同过滤算法
  • 基于内容的算法
  • 基于模型的算法
  • 混合算法

  下面一一来看看他们都是啥:

  (1)基于流行度的算法

  基于流行度的算法非常简单粗暴,类似于各大新闻、微博热榜等,根据PV、UV、日均PV或分享率等数据来按某种热度排序来推荐给用户。

  

  优点是简单,适用于刚注册的新用户。缺点很明显,它无法针对用户提供个性化的推荐。

PS:基于这种算法也可做一些优化,比如加入用户分群的流行度排序,例如把热榜上的体育内容优先推荐给体育迷,把政要热文推给热爱谈论政治的用户。

  (2)协同过滤算法

  这可能是我们最熟悉的一个推荐算法了,想想教科书上的案例:沃尔玛的尿布与啤酒...

  协同过滤(Collaborative Filtering, CF)算法在很多电商网站上都有用到,它主要包括基于用户的CF(User-based CF)和基于物品的CF(Item-based CF)。

  基于用户的协同过滤算法步骤如下:

  1. 分析各个用户对item的评价(通过浏览记录、购买记录等);

  2. 依据用户对item的评价计算得出所有用户之间的相似度;

  3. 选出与当前用户最相似的N个用户;

  4. 将这N个用户评价最高并且当前用户又没有浏览过的item推荐给当前用户。

  整个步骤如下图所示,具体原理与算法可以参考这一篇:《基于用户的协同过滤推荐算法原理与实现

  

  基于物品的协同过滤算法步骤如下:

  1. 分析各个用户对item的浏览记录。

  2. 依据浏览记录分析得出所有item之间的相似度;

  3. 对于当前用户评价高的item,找出与之相似度最高的N个item;

  4. 将这N个item推荐给用户。 

  整个步骤如下图所示:

  

  不管是基于用户还是基于物品,其关键都在于建立关联矩阵,首先会用余弦相似度/Jaccard 公式来计算用户与物品之间,物品与物品之间的相似度,其中值越接近1表示这两个用户越相似。最后,只需要找出与用户A或物品A相似度最高N个项(N>=2),去掉他们已经评价过的物品,剩下的就是最后的推荐结果,

  

  但是,协同过滤算法仍然存在一些问题:

  1. 依赖于准确的用户评分;

  2. 在计算的过程中,那些大热的物品会有更大的几率被推荐给用户;

  3. 冷启动问题:当有一名新用户或者新物品进入系统时,推荐将无从依据;

  4. 在一些item生存周期短(如新闻、广告)的系统中,由于更新速度快,大量item不会有用户评分,造成评分矩阵稀疏,不利于这些内容的推荐。

  对于问题4稀疏矩阵,可以通过把一个nm的矩阵分解为一个nk的矩阵乘以一个k*m的矩阵(即矩阵因子分解)来解决,这里的k可以是用户的特征、兴趣爱好与物品属性的一些联系,通过因子分解,可以找到用户和物品之间的一些潜在关联,从而填补之前矩阵中的缺失值。

  (3)基于内容的算法

  协同过滤算法看起来很好很强大,通过改进也能克服各种缺点。那么问题来了,假如我是个《指环王》的忠实读者,我买过一本《双塔奇兵》,这时库里新进了第三部:《王者归来》,那么显然我会很感兴趣。然而基于之前的算法,无论是用户评分还是书名的检索都不太好使,于是基于内容的推荐算法呼之欲出。

  For example,现在系统里有一个用户和一条新闻。通过分析用户的行为以及新闻的文本内容,我们提取出数个关键字,如下图所示:

  

  将这些关键字作为属性,把用户和新闻分解成向量,如下图所示:

  

  之后再计算向量距离,便可以得出该用户和新闻的相似度了。这种方法很简单,如果在为一名热爱观看英超联赛的足球迷推荐新闻时,新闻里同时存在关键字体育、足球、英超,显然匹配前两个词都不如直接匹配英超来得准确,系统该如何体现出关键词的这种“重要性”呢?这时可以引入词权的概念。在大量的语料库中通过计算,可以算出新闻中每一个关键词的权重,在计算相似度时引入这个权重的影响,就可以达到更精确的效果。

sim(user, item) = 文本相似度(user, item) * 词权

  那么,问题也来了:要是用户的兴趣是足球,而新闻的关键词是德甲、英超,按照上面的文本匹配方法显然无法将他们关联到一起。

  在此,可以引用话题聚类,如下图所示:

  

  利用word2vec一类工具,可以将文本的关键词聚类,然后根据topic将文本向量化。For example,可以将德甲、英超、西甲聚类到“足球”这个topic下,将LV、Gucci聚类到“奢侈品”这个topic下,再根据topic为文本内容与用户作相似度计算。

  综上,基于内容的推荐算法能够很好地解决冷启动问题,并且也不会囿于热度的限制,因为它是直接基于内容匹配的,而与浏览记录无关。然而它也会存在一些弊端,比如过度专业化(over-specialisation)的问题:这种方法会一直推荐给用户内容密切关联的item,而失去了推荐内容的多样性。

  (4)基于模型的算法

  基于模型的方法有很多,用到的诸如机器学习的方法也可以很深,这里只看看一个比较简单的方法——Logistics回归预测。

  举个例子,通过分析系统中用户的行为和购买记录等数据,可以得到如下表:

  

  表中的行是一种物品,x1~xn是影响用户行为的各种特征属性,如用户年龄段、性别、地域、物品的价格、类别等等,y则是用户对于该物品的喜好程度,可以是购买记录、浏览、收藏等等。通过大量这类的数据,我们可以回归拟合出一个函数,计算出x1~xn对应的系数,这即是各特征属性对应的权重,权重值越大则表明该属性对于用户选择商品越重要。

  在拟合函数的时候我们会想到,单一的某种属性和另一种属性可能并不存在强关联。比如,年龄与购买护肤品这个行为并不呈强关联,性别与购买护肤品也不强关联,但当我们把年龄与性别综合在一起考虑时,它们便和购买行为产生了强关联。比如(这里仅仅只是比如),20~30岁的女性用户更倾向于购买护肤品,这就叫交叉属性。通过反复测试和经验,可以调整特征属性的组合,拟合出最准确的回归函数。最后得出的属性权重如下:

  

  基于模型的算法由于快速、准确,适用于实时性比较高的业务如新闻、广告等,而若是需要这种算法达到更好的效果,则需要人工干预反复的进行属性的组合和筛选,也就是常说的Feature Engineering。而由于新闻的时效性,系统也需要反复更新线上的数学模型,以适应变化。

  (5)混合算法

  现实应用中,很少有直接单纯地用某一种算法来做推荐的系统。在一些大的网站如Netflix,就是融合了数十种算法的推荐系统。因此,我们也可以通过给不同算法的结果加权重来综合结果,或者是在不同的计算环节中运用不同的算法来混合,达到更贴合自己业务的目的。

三、推荐系统技术实现

3.1 基于开源技术自己搭建

  目前最为流行的就是基于Spark Streaming + Spark MLlib来实现,其架构图如下所示:

  

  具体介绍请参考:《推荐系统架构及流程说明

3.2 基于云服务平台搭建

  目前阿里云、腾讯云以及Azure等国外老牌云服务提供商也公开提供自己的机器学习平台云服务,大部分没有机器学习开发能力的企业可以选择基于云服务来实现自己的业务实践,而无须过多关注算法层面的实现。

  

  对于阿里云,它提供了完善的视频教程和文档,详细请参考阿里云《机器学习PAI快速入门与业务实战》。

四、后续学习任务

  后续我会学习一本领导推荐的参考书《推荐系统实践》,然后会进入微软大法好的ML.NET的学习,最后会尝试写一些机器学习的Demo来尝尝鲜。关于ML.NET的介绍和教程,大家可以参考这里《ML.NET 机器学习教程》。当然,我都会做一些学习总结,到时也会分享出来。

  

参考资料

(1)AnnieJ,《推荐系统介绍

(2)豆腐脑D,《推荐系统从入门到继续

(3)Micorosoft,《ML.NET 机器学习教程

(4)Bean.Hsiang,《ML.NET系列文章

(5)阿里云,《机器学习PAI快速入门与业务实战

(6)交大全栈工程师,《程序员必学的5类系统推荐算法总结

 

posted @ 2019-01-07 23:16 EdisonZhou 阅读(...) 评论(...) 编辑 收藏