1.1 什么是推荐系统
- 电商公司APP就是帮助用户找到自己所需要的信息/物品;如果用户知道自己需要什么,就通过搜索框【检索系统】或自己的经验浏览货架;如果提供的商品数量/信息量太大,就利用商品的类目或者属性信息来做初步过滤;如果用户自己也不知道需要什么样的,就要利用推荐系统来给用户推荐出商品。
- 推荐系统产生的条件:1、用户自己也不清楚自己的购买需求;2、商品数量过多,存在信息过载。 此时,需要一个自动化的“专家”,分析你的历史兴趣,找到符合你兴趣的商品。
- 推荐系统的任务:1、帮助用户发现自己有价值的信息;2、让信息能够展现在对它感兴趣的用户面前,实现消费者和生产者的双赢,使用户和物品联系的一种工具。
- 推荐系统和搜索引擎的关系
框架 | 特点 | 关系 |
推荐系统 | 有明确目的时的主动查找需求 | 互补 |
搜索引擎 | 没有明确目的帮助他们发现自己感兴趣的东西 |
|
- 从物品的角度出发,推荐系统可以更好地发掘物品的长尾。 推荐系统通过发掘用户的行为,找到用户的个性化需求,从而将长尾商品推荐给需要他的用户,帮助用户发现那些他们感兴趣却很难发现的物品。
- 常见的推荐方式
方式 | 实现过程 | 特点 |
社会化推荐 | 利用社交网络,好友信息进行推荐 | 既要考虑兴趣度又要考虑亲密度 |
内容推荐 | 商品的 类目,生产信息,属性信息 |
|
协同过滤 | 如果能找到和自己兴趣相似的用户,看看他们对那些商品感兴趣 |
|
1.2 个性化推荐系统的应用
个性化推荐系统主要来分析用户的行为日志,给不同用户提供不同个性化页面展示,来提高网站点击率和转化率。普遍的个性化系统包括: 前端的展示界面---->后天的日志系统---->推荐算法系统。
1.2.1 电子商务网站
- 主要的应用:个性化推荐列表,相关商品推荐列表。
- 主要组成部分:
推荐结果的标题,缩略图以及其他的内容属性----->告诉推荐的是什么?
推荐结果的平均分----> 推荐结果的总体质量,推荐的结果怎么样?
推荐理由----> 为什么这么推荐?
- Amazon的推荐方式
- 基于物品的推荐:推荐出和用户喜欢的物品 相似的物品。
- Amazon 基于用户的推荐,调用的是facebook的好友关系。
- 相关推荐列表:买了又买,看了又看【利用曝光数据】,点了有点【利用点击数据】,打包销售【outfit】
- 推荐销售占据亚马逊销售额的20%~30%。
1.2.2 电影和视频网站
- 代表性公司:Netflix,Hulu,YouTube
- Netflix 推荐结果展示页面的组件:
- 电影的标题和和海报
- 用户反馈模块,包括:Play,评分和Not Intersted
- 推荐理由:因为用户曾经喜欢过别的电影。
- Netflix 的基于物品的推荐算法,给用户推荐和他们曾经喜欢的电影相似的电影。
1.2.3 个性化音乐网络电台
- 代表公司:Pandora, Last.fm,豆瓣电台
- 前端界面特点
- 不允许用户点歌
- 反馈方式:喜欢,不喜欢和跳过。
- 音乐视频推荐的特点:
特点 | 说明 |
物品空间很大 | 音乐的数据量很大 |
消费每首歌的代价很小 | 和电商的不同,不一定是听了就兴趣度最大 |
物品种类丰富 |
|
听一首歌消耗很少 |
|
物品重用率很高 | 和电商不同,电商一般只购买一次 |
用户充满激情 |
|
上下文相关 | 用户所需要的心情和所处的环境。 |
次序很重要 |
|
很多播放列表资源 | 推荐场景比较多,需要深刻理解业务 |
不需要用户全神贯注 |
|
高度社会化 | 社交推荐占据的权重比较大 |
1.2.4 社交网络
- 代表的公司:Facebook 和 Twitter,最宝贵的资源是:用户之间的社交网络信息和用户的偏好信息。
- 个性化推荐的主要应用场所:
- 利用用户的社交网络信息对用户进行个性化的物品推荐;
- 信息流的会话推荐;
- 给用户推荐好友。
- FaceBook的个性化推荐API:instance personaliation
1.2.5 个性化阅读网站
- 个性化阅读代表的公司:Google Reader,Zite和Flipboard,Digg
- 使用个性化推荐系统前后,用户的好友数,评论数,活跃程度是否增加了
1.2.6 基于位置的服务
- 代表公司:美团,大众点评,FourSqaure
- 位置是一种很重要的上下文信息,基于位置给用户推荐离他近且他感兴趣的服务。【因此,要同时考虑距离和兴趣度】
1.2.7 个性化邮件
- 代表公司:Tapestry----> 通过用户阅读邮件的历史行为和习惯对新的邮件重新进行排序。
- 2010年,google通过分析用户对邮件的历史行为,找到用户感兴趣的邮件
1.2.8 个性化广告
- 个性化广告与个性化推荐的区别
| 过程 | 核心 |
个性化广告 | 帮助广告找到令他们感兴趣的用户 | 广告为核心 |
个性化推荐 | 帮助用户找到令他们感兴趣的物品 | 用户为核心 |
- 个性化广告投放技术
- 上下文广告:通过分析用户正在浏览的网页内容,投放和网页内容相关的广告----》提取网页的关键词
- 搜索广告:通过分析用户在当前会话中的搜索记录,判断用户的搜索目的,投放和用户目的相关的广告;
- 个性化展示广告:根据用户的兴趣,不同的用户投放不同的广告。
- FaceBook拥有大量的用户个人资料,也就是拥有大量的用户兴趣标签,然后广告商可以圈人。
1.3 推荐系统的评测
- 推荐系统的一般组成:用户,物品提供者,提供推荐系统的网站,因此好的推荐系统必须考虑这三方面的利益。
- 早期将“好”得推荐系统定义为:能够做出准确预测的推荐系统【比如:预测这个物品是否会购买】。 好的推荐系统不仅仅能够准确预测用户的行为,而且能够扩展用户的视野,帮助用户发现那些他们可能会感兴趣但是却不那么容易发现的东西。同时,推荐系统还要能够帮助商家将那些埋没在长尾中的商品推荐给用户。
1.3.1 推荐系统的实验方法
- 三种评测推荐系统效果的试验方法:离线实验(offline experiment),用户调查(user study) 和在线实验(online experiment)
- 离线实验,主要由以下步骤完成:
- 通过日志系统获取用户的行为日志,并按照一定的格式生成一个标准的数据集。
- 将数据集按照一定的规则生成训练集和测试集;
- 在训练集上训练用户的兴趣模型,在测试集上进行测试。
- 通过事先定义的离线指标评测算法在测试集上的预测结果;
- 离线指标的优缺点
优点 | 缺点 |
不需要对实际系统的控制权 | 无法计算商业上关心的指标 |
不需要用户参与实验 | 离线指标和商业指标存在差距 |
速度快,可以测试大量算法 |
|
- 用户调研
- 定位:离线指标和线上指标之间存在差距,因此在上线测试前,要做一次称为用户调查的测试。
- 步骤: 真实用户在推荐系统上完成一些任务,然后记录他们的行为和答案,最后分析统计用户的行为和答案了解测试系统的性能;
- 优缺点:
优点 | 缺点 |
获得很多体现用户主观感受 | 招募测试用户成本高 |
比离线评估分析低 | 设计双盲实验非常困难 |
出错后容易弥补 | 测试环境下的行为和真实用户下的行为不一致 |
- 在实际上线的过程中,会有测试人员体验,也有产品,业务,运营同事去体验验收。
3. 在线实验
- 采用AB分流系统,网站:Abtests.com ,设计实验,如何设计出合理的AB测试;
- AB测试的优缺点
优点 | 缺点 |
能够公平地获得不同算法实际在线的性能表现 | 周期比较长,一般只对离线性能较好的算法上AB测试 |
|
|
切分流量是AB测试中的关键是不同层之间的流量是正交的 |
|
- AB测试过程的流程:
- 一般来说,一个新算法上线的流程如下:
Step1:通过 离线实验证明他在很多离线指标上都超过现有的算法;
Step2:需要通过用户调查确定他的用户满意度不低于现有的算法。
Step3:通过在线的AB测试确定他在我们关心的指标上是否优于现有的算法;
1.3.2 评测指标
- 用户满意度【最重要的指标】
- 评估方式:只能通过用户调研和在线评估;
- 用户调查的方式:设计调查问卷,然后进行问卷调查;
- 在线实验的方式:通过一些用户行为统计得到,比如点击率,用户停留时间,转化率等指标;
- 其他一些方式:双击,小红心。。。。
- 预测准确度【最重要的指标】
- 评估模型预测用户行为的能力;
- 评估方法:
Step1:收集用户的历史行为记录;
Step2:通过时间将记录分成训练集和测试集;
Step3:在训练集上建立行为和兴趣模型,并预测用户在测试集上的行为;
Step4:计算预测行为和测试集上实际的重合度作为预测准确度;
3. 针对不同的问题,有不同的评估指标
1.0 评分预测问题
预测用于对物品评分的问题:评分预测问题
import numpy as np
def make_records():
rsd = np.random.RandomState(10)
strs = 'abcdefghigklmnopqrstuvwxyz'
users = list(strs)
items = list(strs.upper())
real_score = [_ for _ in range(2, len(strs) + 2)]
noise = rsd.randn(len(strs))
pre_score = [real_score[_] + noise[_] for _ in range(len(strs))]
record = {}
for u, i, r, p in zip(users, items, real_score, pre_score):
record[u] = [u, i, r, p]
return record
def RMSE(record):
T = len(record)
if T == 0:
return 0.0
error_list = []
for item in record.values():
error = item[2] - item[3]
error_list.append(error)
score = np.sqrt(np.sum(np.square(error_list))) / T
return score
def MAE(record):
T = len(record)
if T == 0:
return 0.0
error_list = []
for item in record.values():
error = item[2] - item[3]
error_list.append(np.abs(error))
score = np.sum(error_list) / T
return score
datas = make_records()
print('rmse:{}'.format(round(RMSE(datas), 4)))
print('mae:{}'.format(round(MAE(datas), 4)))
1.1 TopN 推荐问题
TopN推荐的预测准确率一般通过准确率(precision) 和召回率(recall)来度量。R(u)是根据用户在训练集上的行为给用户做出的推荐列表,T(u)是用户在测试集上的行为列表,那么推荐结果的召回率一般定义为:
def PrecisionRecall(test, N):
hit = 0
n_recall = 0
n_precision = 0
for user, items in test.items():
rec_rank = Recommend(user, N)
cover_goods = tuple(set(items) & set(rank))
hit += len(cover_goods)
n_recall += len(items)
n_precision += len(rank)
recall_rate = hit / n_recall
precision_rate = hit / n_precision
return recall_rate, precision_ratecision_rate
3. 覆盖率
描述推荐系统对物品长尾的发掘能力。简单的定义:推荐系统推荐出来的物品占总物品集合的比例。那么推荐系统的覆盖率定义为:
更加细致的描述方式:信息熵和基尼系数,需要统计推荐列表中不同物品出现次数的分布,如果所有的物品都出现在推荐列表中,并且出现次数差不多,那么推荐系统挖掘长尾的能力就很好。也就是商品分布比较均匀,越均匀表示表示挖掘长尾的能力较强,否则表示越差。
信息熵:
推荐系统应该避免马太效应,通过基尼系数来评测。
4. 多样性
为了满足用户广泛的兴趣,推荐列表需要覆盖用户的不同兴趣领域,因此推荐列表应该具有多样性。
多样性描述了推荐列表中,物品两两之间的不相似性。假设s(I,j)表示物品i和j之间的相似性,那么用户u的推荐列表R(u)的多样性定义如下:
推荐系统整体的多样性可以定义为:所以用户推荐列表多样性的平均值。
5. 新颖性
- 新颖性指的是给用户推荐那些他们以前没有听说过的物品。在一个网站中,实现新颖性最直接的方案就是:把用户之前在 网站中有过行为的物品从推荐列表中过滤掉。
- 可以用推荐列表的平均热门程度【可以用销量的平均值或者点击uv的平均值】,平均热门程度越低,表示新颖性越强;
- 最精确的方法是需要做用户调研;
6. 惊喜度【serendipity】
推荐结果和用户的历史兴趣不相似,但却让用户觉的很满意,那么算比较好的惊喜度。首先给出一个热门推荐列表,将给用户曝光过的商品直接过滤掉。
7. 信任度
- 推荐系统的信任度只能通过:问卷调查的方式,询问用户是否信任推荐系统的推荐结果;
- 提高推荐系统信任度的方法:
- 增加推荐系统的透明度,而增加推荐系统透明度的主要方法是提供推荐解释;
- 考虑用户的社交网络信息,利用用户的好友信息给用户做推荐,并且用好友进行推荐。
- 典型应用:Epinion
8. 实时性
- 对于一些物品实时性比较强的网站(新闻,微博等),推荐系统的实效性至关重要。【kafka,storm】
- 推荐系统的实时性包括两个方面:
- 推荐系统需要实时地更新推荐列表来满足用户的新的行为变化【Recently Viewed】把点击过商品排列出来。或者用户点击过的商品进行加权,排到最前面。可以根据推荐列表的变化速率或者变化情况来评估实时性。
- 将新加入系统的物品推荐给用户【冷启动问题,利用商品的属性相似度】。
9. 健壮性
- 健壮性是衡量一个推荐系统抗击作弊的能力,特别是搜索引擎的作弊和反作弊能力。【如果自己的商品称为热门搜索词,会带来极大的商业利益】
- 常见的作弊方法:行为注入攻击,亚马逊的买了又买,豆瓣的评分系统。【用水军,刷单】
- 健壮性评测方法:模拟攻击
Step1: 给定一个训练数据集D和推荐算法model,生成用户的推荐列表R(u);
Step2:给训练数据集D注入噪声称为D1,然后利用推荐算法model在D1上给用户u进行推荐,推荐列表为R(u)1;
【噪声怎么注入?这种对于评分预测问题影响比较大】
Step3:通过比较攻击前后推荐列表的相似度来评测算法的健壮性;【TopN】的重复率。
- 在实际的系统中,提高系统健壮性的方法:
- 选择健壮性比较高的算法【主要应该是特征处理过程】;
- 设计推荐系统时,尽量使用代价比较高的用户行为,【攻击代价比较高的行为成本较大】,比如说使用购买行为,加车行为等。
- 在使用数据前,进行攻击检测,从而对数据进行清理。
10. 商业目标
- 最本质的商业目标:平均一个用户给公司带来了多大的盈利;【bauv 和vpm】
1.3.3 总结
- 如何通过优化离线指标来提高在线指标;
- 获取各种评测指标的途径
| 离线实验 | 问卷调查 | 在线实验 |
用户满意度 |
| √ | √ |
预测准确度 | √ | √ |
|
覆盖率 | √ | √ |
|
多样性 | √ | √ |
|
新颖性 |
| √ |
|
惊喜度 |
| √ |
|
3. 离线指标优化的目标:
最大化预测准确率,使得覆盖率>A, 多样性>B,新颖性>C;
1.3.4 评测维度
- 增加评测维度的目的就是知道一个算法在什么情况下效果最好,这样可以为融合不同算法取得较好的整体性能带来参考。
- 常见的三种评测维度:
维度 |
|
用户维度 | 人口统计学信息,活跃度,是否是新用户 |
物品维度 | 物品的属性信息,流行度、平均分以及是不是新加入的物品。 |
时间维度 | 季节、是工作日还是周末,是白天还是晚上。 |
- 评测不同算法的优势,所以应该先对两个线上的算法进行良好的评测;