推荐系统实践-char1

RS in Action-one

最近看下推荐系统的入门书籍《推荐系统实践》,\color{red}{项亮老师}的这本书应该是国内推荐系统中最受好评的。虽然有电子版,但是对于比较经典的书籍,还是会买纸质版的。

第一章主要介绍的是什么是RS系统、RS系统的分类、RS系统的应用、RS系统的评测指标等

image

思维导图

image

什么是推荐系统

如何买花生米

  • 到附近24小时营业的便利店,查看所有的货架,找到花生米

  • 到家附近的沃尔玛超市,按照分类指示牌,找到花生米

  • 打开淘宝,在输入框中输入花生米三个字,付费之后等待送货上门

上面的例子中用户是有明确地需求:买花生米。如果用户周六想看一部电影,面对电影网站上万部的电影,该如何抉择?用户会手足无措,不知道该看哪部电影

在互联网快速发展的时代,人们从信息匮乏的时代步入了一个信息过载的时代,信息量过大从而导致无法确定选择。

如果有一个自动化的工具,分析用户的历史兴趣,从庞大的电影库中找到几部符合用户习惯和口味的电影供其选择,就完美了,不用自己去抉择。

这个工具就是个性化推荐系统,解决信息过载问题

image

解决信息过载

解决信息过载的两个方法:

  • 分类目录:雅虎

  • 搜索引擎:谷歌

搜索引擎需要用户提供关键词来寻找信息;推荐系统不需要用户提供明确的需求,通过分析用户的历史行为给用户的历史行为建模,从而主动给他们推荐满足他们需求的信息。

物品长尾

主流商品满足绝大部分用户的需求,而长尾商品往往代表了一小部分用户的个性化需求。推荐系统通过发掘用户的行为,找到用户的个性化需求,从而将长尾商品准确地推荐给需要它的用户。

推荐方式

  1. 社会化推荐

  2. 基于内容的推荐

  3. 基于协同过滤的推荐

推荐算法的本质:通过一定的方式将用户和物品联系起来,而不同的推荐系统利用了不同的推荐方式

image

RS应用

RS组成

  • 前台的展示页面

  • 后台的日志系统

  • 推荐算法系统

RS应用

电子商务

个性化推荐系统之王:<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="5.245ex" height="3.033ex" viewBox="0 -887.4 2258.3 1306.1" role="img" focusable="false" style="vertical-align: -0.972ex;"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(52.083) matrix(1 0 0 -1 0 0)">亚</text></g></g></g><g fill="bule" stroke="bule" transform="translate(752,0)"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(52.083) matrix(1 0 0 -1 0 0)">马</text></g></g></g><g fill="bule" stroke="bule" transform="translate(1505,0)"><g fill="bule" stroke="bule"><g fill="bule" stroke="bule"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(52.083) matrix(1 0 0 -1 0 0)">逊</text></g></g></g></g></g></g></svg>​,下图是亚马逊的个性化推荐列表

image
  • 推荐结果的标题、缩略图以及其他内容属性

  • 推荐结果的平均分

  • 推荐理由

亚马逊的三种推荐方式:

  1. 基于物品的推荐算法:给用户推荐那些和他们之前喜欢的物品相似的物品

  2. 基于好友的个性化推荐:Facebook好友

  3. 相关推荐列表:打包销售

电影和视频网站
  • 最为成功的公司:Netflix,项亮老师也曾在该公司举办的比赛Netflix Prize中获得很好的名次

  • YouTube

  • 视频网站Hulu

个性化音乐网络电台
  • Pandora:音乐推荐算法,来自一个叫做音乐基因工程的项目

  • Last.fm:没有专家标注,而是主要利用用户行为计算歌曲的相似度

  • 豆瓣电台

image
社交网络

最为成功的是Facebook。最为重要的两个数据:

  1. 用户之间的网络关系:人与人之间

  2. 用户的偏好信息:个体信息

提供的API接口:Instant Personalization

image

开发EdgeRank算法对用户的每次会话(分享和评论)进行排序

个性化阅读
  • Google reader

  • 鲜果网

  • Zite、Flipboard

基于位置的服务
image
个性化邮件

第一个个性化邮件推荐系统:Tapestry。通过分析用户阅读邮件的历史行为和习惯来对新邮件进行排序,提高用户的工作效率。采用的是基于协同过滤筛选信息。

个性化广告

个性化广告投放技术分为3种:

  1. 上下文广告

  2. 搜索广告

  3. 个性化展示广告

RS系统评测

RS系统之3个组成

  • 用户

  • 物品提供者

  • 提供推荐系统的网站

image-20200913163723268

RS系统实验方法

主要是有3种方法来评测推荐系统效果的实验方法:

  • 离线实验

  • 用户调查

  • 在线实验

离线实验

重要的组成步骤

  1. 通过日子系统获得用户行为数据,按照一定的格式生成一个标准的数据集

  2. 将数据库按照一定的规则分成训练集和测试集

  3. 在训练集上训练用户兴趣模型,在测试集上进行预测

  4. 通过事先定义的离线指标来评估效果

离线方法的优缺点

image
用户调查

离线指标和实际的商业指标之间存在差距。一般的,高预测准确率不等于高用户满意度

很多离线时没有办法评测的与用户主观感受有关的指标都可以通过用户调查获得。用户调查的过程中需要注意的2点:

  • 控制成本

  • 保证结果的统计意义

在线实验

在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试。AB测试是常用的在线评估算法的实验方法:

  • 通过一定的规则将用户随机分成几组

  • 不同组的用户采用不同的算法

  • 通过统计不同组的评测指标比较不同的算法效果

优点 缺点
公平地获得不同算法实际在线时的性能指标</br>包含商业上的指标 周期长,必须进行长期的实验才能获得可靠的结果

做AB测试的时候注意切分流量

image

评测指标

用户满意度

主要是通过问卷调查的方式来获得

预测准确度

最重要的推荐系统离线评测指标

  • 评分预测:预测用户对物品评分的行为,主要是通过两个指标

    • 均方根误差MASE

    • 平均绝对误差MAE

      image

      利用Python实现上面的两个指标:

      <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="python" cid="n203" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> # records列表存放用户评分数据,records[i] = [u, i, rui, pui]

      rui:用户u对物品i的实际评分,pui:是算法预测出来的评分


      import numpy
      import math

      def RMSE(records):
      return math.sqrt(sum([(rui - pui) ** 2 for u, i, rui, pui in records]) / float(len(records))) # (实际分数 - 算法得出的分数)的平方除以总长度

      def MAE(records):
      return sum([abs(rui - pui) for u, i, rui, pui in records]) / float(len(records)) # (实际分数 - 算法得到的平均分数)的绝对值除以总长度
      </pre>

      <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="python" cid="n216" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> def PrecisionRecall():
      hit = 0
      n_recall = 0
      n_precision = 0
      for user, items in test.items():
      rank = Recommand(user,N)
      hit += len(rank & items)
      n_recall += len(items)
      n_precision += N
      return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)]</pre>

      <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="python" cid="n229" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-color: rgb(51, 51, 51); font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 10px 10px 0px; width: inherit; background-position: initial initial; background-repeat: initial initial;"> def Gini(p):
      j = 1
      n = len(p)
      G = 0
      for item, weight in sorted(p.items(), keys = itemgetter(1)):
      G += (2 * j - n -1) * weight
      return G / float(n - 1)</pre>

      1. 用户维度:主要包含用户的人口统计学信息、活跃度以及是不是新用户等

      2. 物品维度:属性信息、流行度、平均分等

      3. 时间维度:季节,是工作日还是周末等

      评测维度分为3种:

      评测维度

      image

      各种指标的获取途径

      • 给定一个数据集和算法,利用它们生成用户的推荐列表

      • 用常用的攻击方法注入噪声数据

      • 利用算法在注入噪声数据的数据集上再次给用户生成推荐列表

      • 比较前后推荐系统的相似度来评测算法的健壮性;如果没有什么变化,说明算法具有很好的健壮性

      健壮性(robust,鲁棒性),是衡量一个推荐系统抗击作弊能力的重要指标,主要是利用模拟攻击:

      健壮性
      1. 实时地更新推荐列表来满足用户新的行为变化

      2. 推荐系统要能够将新加入的物品推荐给用户

      推荐系统的实时性包含2个方面:

      实时性
      • 增加RS系统的透明度transparency

      • 考虑用户的社交信息,利用用户的好友信息给用户做推荐,并且用好友进行推荐解释

      RS的信任度只能是通过问卷调查的方式来获取,提高信任度的两种方法:

      信任度

      令用户惊喜的推荐结果是和用户历史上喜欢的物品不相似,但是用户却觉得满意的推荐。

      惊喜度serendipity

      评测新颖性的最简单方法就是利用推荐结果的平均流行度,因为越不热门的物品,用户越觉得新颖

      新颖性

      不同的物品相似度度量函数​可以定义不同的多样性

      推荐系统整体多样性可以定义为所有用户推荐列表多样性的平均值:

      image

      多样性描述的是物品两两之间的不相似性。多样性和相似性是对应的

      多样性

      如果G2>G1,则说明推荐算法具有马太效应

      • G1:从初始用户行为中计算出来的物品流行度的基尼系数

      • G2:从推荐列表中计算出来的物品流行度的基尼系数

      关于马太效应:强者更强,弱者更弱。推荐系统的初衷是消除马太效应。评测推荐系统是否具有马太效应的简单办法就是使用基尼系数

      image
      • 信息熵

      • 基尼系数

      两个评测指标:

      image

      推荐系统能够推荐出来的物品占总物品集合的比例

      覆盖率是描述一个推荐系统对物品长尾的发掘能力,定义为:

      覆盖率

      利用Python实现召回率和准确率:

      image

      网站在提供服务时,一般是给用户一个个性化的推荐列表,这种方式叫做TopN推荐。推荐结果召回率和准确率的定义:

      • TopN推荐

        • 准确率precision

        • 召回率recall

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