1. 初识推荐系统
所谓推荐系统,简言之就是根据用户的偏好推荐其最有可能感兴趣的内容。
以新闻平台为例,过去主要以新浪新闻这类中心化内容平台为代表;
而现在,以今日头条为代表的新闻APP 均在首页根据用户偏好推送不同内容的定制化新闻,推动了整个行业向个性化推荐转型。
在淘宝、京东、亚马逊等电商网站的首页都设有“猜你喜欢”专区,根据用户最近浏览和购
买的行为记录推荐商品。
在新兴的短视频领域,以抖音和快手为代表的APP 以推荐为流量分发的主要手段。
在互联网金融领域,各大平台也开始主打针对个人定制化的千人千面投资推荐。
毫无疑问,个性化推荐己成为所有新闻、视频、音频、电商、互联网金融等相关平台的标配。
推荐系统,
对用户来说,在用户需求并不十分明确的情况下进行信息的过滤,与搜索系统相比,推荐系统更多的利用用户的各类历史
信息猜测其可能喜欢的内容;
对公司而言,解决产品能够最大限度地吸引用户,留存用户,增长用户黏性,提高用户转化率,从而达到公司商目标连续增长
的目的;
- 个性化推荐的成功应用需要两个条件:
- 信息过载,因为用户如果可以很容易地从所有物品中找到喜欢的物品,就不需要个性化推荐了。
- 用户大部分时候没有特别明确的需求,因为用户如果有明确的需求,可以直接通过搜索引擎找到感兴趣的物品。
推荐系统的基本任务是联系用户和物品,解决信息过载的问题。本质上是一种实现将用户-商品-公司之间利益最大化的手段.
2. 推荐系统的常用评测指标
2.1. 用户满意度
用户作为推荐系统的重要参与者,其满意度是评测推荐系统的最重要指标。但是,用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
用户调查获得用户满意度主要是通过调查问卷的形式。用户对推荐系统的满意度分为不同的层次。
在在线系统中,用户满意度主要通过一些对用户行为的统计得到,比如,利用购买率度量用户的满意度;
此外,有些网站会通过设计一些用户反馈界面收集用户满意度。比如,电商、外卖的app收货后弹出的评价提示;
外卖的用户满意调查2.2 预测准确度
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标,从推荐系统诞生的那一天起,几乎99%与推荐相关的论文都在讨论这个指标。因为该指标可以通过离线实验计算。
下面是不同的研究方向的预测准确度指标:
2.2.1 评分预测
很多网站都有一个让用户给物品打分的功能,那么,如果知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测。
某外卖收集用户评分的界面评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。
对于测试集中的一个用户u和物品i,令是用户u对物品i的实际评分,而是推荐算法给出的预测评分,那么RMSE的定义为:
MAE采用绝对值计算预测误差,它的定义为:
假设我们用一个列表records存放用户评分数据,
令records[i]= [u,i,rui,pui],其中rui是用户u对物品i的实际评分,pui是算法预测出来的用户u对物品i的评分,
那么下面的代码分别实现了RMSE和MAE的计算过程。
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))
关于RMSE和MAE这两个指标的优缺点,
Netflix认为RMSE加大了对预测不准的用户物品评分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻。
研究表明,如果评分系统是基于整数建立的(即用户给的评分都是整数),那么对预测结果取整会降低MAE的误差②。
2.2.2. TopN推荐
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。
TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量。
令R( u)是根据用户在训练集上的行为给用户作出的推荐列表,而T( u)是用户在测试集上的行为列表。那么,
- 精确率(precision):
分类正确的正样本个数占分类器判定为正样本的样本个数比例(这里 R(u)R(u) 相当于是模型判定的正样本)
即:精确率 = 分类正确的正样本个数 / 所有判定为正样本的样本个数
- 召回率(recall):
分类正确的正样本个数占真正的正样本个数的比例(这里的相当于真正的正样本集合)
即:召回率 = 分类正确的正样本个数 / 所有真正的正样本的样本个数
为了全面评测TopN推荐的准确率和召回率,一般会选取不同的推荐列表长度N,计算出一组准确率/召回率,然后画出准确率/召
回率曲线(precision/recall curve)。
补充知识点:
-
精确率( Precision) (也叫查准率)
TP / TP+ FP
精准率反应的是预测准确的数量,即预测为正的样本中有多少是真正的正样本,
预测准确的次数越多,这个数值就越大。精准率是针对我们预测结果而言的,
它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,
一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),
-
召回率( Recall)
TP / TP+ FN
召回率反应的是预测准确的概率,它表示的是样本中的正例有多少被预测正确了,
如果预测百分之百地准确,那这个数值就会很高。
召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。
也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。
-
AUC(Area Under Curve)
AUC 即ROC曲线下的面积,ROC曲线下与坐标轴围成的面积,显然这个面积的数值不会大于1。
又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。
AUC越接近1.0,检测方法真实性越高;
等于0.5时,则真实性最低,无应用价值。
roc.png
精确率和召回率的代码实现:
from sklearn import metrics
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score
from sklearn.metrics import accuracy_score
#分类结果
y_pred = [0, 1, 0, 0]
y_true = [0, 1, 1, 1]
print("precision_score:", metrics.precision_score(y_true, y_pred))
print("recall_score:", metrics.recall_score(y_true, y_pred))
auc代码实现:
# auc
import numpy as np
from sklearn import metrics
y = np.array([1, 1, 2, 2])
pred = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = metrics.roc_curve(y, pred, pos_label=2)
metrics.auc(fpr, tpr)
# 当类别满足{0, 1}时,可直接使用metrics.roc_auc_score(y,pred)
metrics.roc_auc_score(y,pred)
0.75
ROC曲线代码实现:
## ROC曲线
from sklearn.metrics import roc_curve
y_pred = [0, 1, 1, 0, 1, 1, 0, 1, 1, 1]
y_true = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1]
FPR,TPR,thresholds=roc_curve(y_true, y_pred)
plt.title('ROC')
plt.plot(FPR, TPR,'b')
plt.plot([0,1],[0,1],'r--')
plt.ylabel('TPR')
plt.xlabel('FPR')
roc曲线
小知识点:
- 关于评分预测和 TopN 推荐的讨论
指出电影推荐的目的是找到用户最有可能感兴趣的电影,而不是预测用户看了电影后会给电影什么样的评分。因此,TopN推荐更符合实际的应用需求。也许有一部电影用户看了之后会给很高的分数,但用户看的可能性非常小。因此,预测用户是否会看一部电影,应该比预测用户看了电影后会给它什么评分更加重要。
因此,后面的重点也是在TopN推荐。
2.2.3 覆盖率
覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。定义为推荐系统能够推荐出来的物品占总物品集合的比例。
假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率的公式:
即:覆盖率 = 推荐出来的商品数量 / 总商品数量
为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。
因此,可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。
如果这个分布比较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。
在信息论和经济学中有两个著名的指标可以用来定义覆盖率。
第一个是信息熵:
其中 p(i)p(i) 是物品 ii 的流行度除以所有物品流行度之和;
第二个指标是基尼系数(Gini Index):
其中 ijij 是按照物品流行度p从小到大排序的物品列表中第 jj 个物品;
2.2.4 多样性
为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴趣领域,即推荐结果需要具有多样性。
尽管用户的兴趣在较长的时
间跨度中是一样的,但具体到用户访问推荐系统的某一刻,其兴趣往往是单一的,那么如果推荐列表只能覆盖用户的一个兴趣点,而这个兴趣点不是用户这个时刻的兴趣点,推荐列表就不会让用户满意。反之,如果推荐列表比较多样,覆盖了用户绝大多数的兴趣点,那么就会增加用户找到感兴趣物品的概率。因此给用户的推荐列表也需要满足用户广泛的兴趣,即具有多样性。
多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。
假设定义了物品i和 j之间的相似度,那么用户u的推荐列表R(u)的多样性定义如下:
推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
不同的物品相似度度量函数s(i,j)可以定义不同的多样性;
如果用内容相似度描述物品间的相似度,我们就可以得到内容多样性函数,
如果用协同过滤的相似度函数描述物品间的相似度,就可以得到协同过滤的多样性函数。
2.2.5 新颖性
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。在一个网站中实现新颖性的最简单办法是,把那些用户之前在网站中对其有过行为的物品从推荐列表中过滤掉。
比如在一个视频网站中,新颖的推荐不应该给用户推荐那些他们已经看过、打过分或者浏览过的视频。
但是,有些视频可能是用户在别的网站看过,或在电视上看过,因此仅仅过滤掉本网站中用户有过行为的物品还不能完全实现新颖性。
有研究表明,评测新颖度的最简单方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。因此,如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。
但是,用推荐结果的平均流行度度量新颖性比较粗略,因为不同用户不知道的东西是不同的。要准确地统计新颖性需要做用户调查。
2.2.6 惊喜度
简单来说,惊喜度(serendipity)就是,如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。
即:令用户惊喜的推荐结果是和用户历史上喜欢的物品不相似,但用户却觉得满意的推荐
因此,提高推荐惊喜度,需要提高推荐结果的用户满意度,同时降低推荐结果和用户历史兴趣的相似度。
2.2.7 信任度
度量推荐系统的信任度只能通过问卷调查的方式,询问用户是否信任推荐系统的推荐结果。
提高推荐系统的信任度主要有两种方法。
-
首先需要增加推荐系统的透明度(transparency ),而增加推荐系统透明度的主要办法是提供推荐解释。只有让用户了解推荐系统的运行机制,让用户认同推荐系统的运行机制,才会提高用户对推荐系统的信任度。
-
其次是考虑用户的社交网络信息,利用用户的好友信息给用户做推荐,并且用好友进行推荐解释。这是因为用户对他们的好友一般都比较信任,因此如果推荐的商品是好友购买过的,那么他们对推荐结果就会相对比较信任。
2.2.8 实时性
在很多网站中,因为物品(新闻、微博等)具有很强的时效性,所以需要在物品还具有时效性时就将它们推荐给用户。
比如,给用户推荐昨天的新闻显然不如给用户推荐今天的新闻。
推荐系统的实时性包括两个方面。
-
首先,推荐系统需要实时地更新推荐列表来满足用户新的行为变化。
比如,当一个用户购买了iPhone,如果推荐系统能够立即给他推荐相关配件,那么肯定比第二天再给用户推荐相关配件更有价值。
-
第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。这主要考验了推荐系统处理物品冷启动的能力。关于如何将新加入系统的物品推荐给用户。
2.2.9 健壮性
健壮性(即robust,鲁棒性)指标衡量了一个推荐系统抗击作弊的能力。
最著名的就是行为注入攻击(profile injection attack)。众所周知,绝大部分推荐系统都是通过分析用户的行为实现推荐算法的。
比如,亚马逊有一种推荐叫做“购买商品A的用户也经常购买的其他商品”。主要计算方法是统计购买商品A的用户购买其他商品的次数。
那么,我们可以很简单地攻击这个算法,让自己的商品在这个推荐列表中获得比较高的排名,比如可以注册很多账号,用这些账号同时购买A和自己的商品。
还有一种攻击主要针对评分系统,比如豆瓣的电影评分。这种攻击很简单,就是雇用一批人给自己的商品非常高的评分,而评分行为是推荐系统依赖的重要用户行为。
算法健壮性的评测主要利用模拟攻击。
在实际系统中,提高系统的健壮性,除了选择健壮性高的算法,还有以下方法:
- 设计推荐系统时尽量使用代价比较高的用户行为。比如,如果有用户购买行为和用户浏览行为,那么主要应该使用用户购买行为,因为购买需要付费,所以攻击购买行为的代价远远大于攻击浏览行为。
- 在使用数据前,进行攻击检测,从而对数据进行清理。
2.2.10 商业目标
网站评测推荐系统更加注重网站的商业目标是否达成,不同的网站具有不同的商业目标。
比如电子商务网站的目标可能是销售额,基于展示广告盈利的网站其商业目标可能是广告展示总数,基于点击广告盈利的网站其商业目标可能是广告点击总数。
因此,设计推荐系统时需要考虑最终的商业目标,而网站使用推荐系统的目的除了满足用户发现内容的需求,也需要利用推荐系统加快实现商业上的指标。
2.3 评测维度
一个推荐算法,虽然整体性能不好,但可能在某种情况下性能比较好,而增加评测维度的目的就是知道一个算法在什么情况下性能最好。
一般来说,评测维度分为如下3种:
- 用户维度 主要包括用户的人口统计学信息、活跃度以及是不是新用户等。
- 物品维度 包括物品的属性信息、流行度、平均分以及是不是新加入的物品等。
- 时间维度 包括季节,是工作日还是周末,是白天还是晚上等。
3. 召回和排序
推荐系统要根据已有的用户画像和内容画像去推荐,涉及到两个关键问题:召回和排序。
召回(match)”指从全量信息集合中触发尽可能多的正确结果,并将结果返回给“排序”。
召回的方式有多种:协同过滤、主题模型、内容召回和热点召回等,
而“排序(rank)“则是对所有召回的内容进行打分排序,选出得分最高的几个结果推荐给用户。
推荐系统的算法流程图召回策略的评估:
主要根据两个评价指标:召回率和准确率。
下面是召回层与排序层的特点
- 召回层: 待计算的候选集合大、计算速度快、模型简单、特征较少,尽量让用户感兴趣的物品在这个阶段能够被快速召回,即保证相关物品的召回率;
- 排序层: 首要目标是得到精准的排序结果。需要处理的物品数量少,可以利用较多的特征,使用比较复杂的模型。
设计召回层时,“计算速度”和“召回率”其实是矛盾的两个指标,为提高“计算速度”,需要使召回策略尽量简单一些;而为了提高“召回率”,要求召回策略尽量选出排序模型所需要的候选集,这也就要求召回策略不能过于简单。在权衡计算速度和召回率后,目前工业界主流的召回方法是采用多个简单策略叠加的“多路召回策略”。
3.1 多路召回
指采用不同的策略、特征或简单模型,分别召回一部分候选集,然后把候选集混合在一起供后续排序模型使用,
其中,各种简单策略保证候选集的快速召回,从不同角度设计的策略保证召回率接近理想的状态,不至于损伤排序效果。
在多路召回中,每个策略之间毫不相关,所以一般可以写并发多线程同时进行,这样可以更加高效。
多路召回针对不同的任务就会有对于该业务真实场景下需要考虑的召回规则。例如视频推荐,召回规则可以是“热门视频”、“导演召回”、“演员召回”、“最近上映“、”流行趋势“、”类型召回“等等。
- 多路召回存在的问题:
对于每一路召回都会从商品集合中拉回K个商品,这里的K是一个超参数,对于K的选择一般需要通过离线评估加线上的A/B测试来确定合理的K值。
除此之外,对于不同的任务具体策略的选择也是人工基于经验的选择,选择的策略之间的信息是割裂的,无法总和考虑不同策略对一个物品的影响。
3.2 Embedding召回
Embedding召回是一个综合性强且计算速度也能满足需求的召回方法。
Embedding其实是一种思想,主要目的是将稀疏的向量(如one-hot编码)表示转换成稠密的向量,
下图直观的显示了one-hot编码和Embedding表示的区别于联系,
one-hot编码和Embedding即Embedding相当于是对one-hot做了平滑,而onehot相当于是对Embedding做了max pooling。
目前主流的Embedding技术主要可以分为三大类。
- text embedding
- image embedding
- graph embedding
在推荐系统领域,text embedding技术是目前使用最多的embedding技术,
-
对于文本特征可以直接使用该技术,
-
对于非文本的id类特征,可以先将其转化成id序列再使用text embedding的技术获取id的embedding再做召回。
常见的text Embedding的技术有:
- 静态向量:word2vec, fasttext, glove
- 动态向量:ELMO, GPT, BERT
对于image embedding其实主要是对于有图或者视频的特征,对于图像与视频的识别都有效果比较好的模型,大部分都是卷积模块通过各种连接技巧搭建的高效模型,可以使用现有的预训练模型提取图像或者视频的向量特征,然后用于召回。
对于社交网络相关的推荐,进行推荐的用户与用于之间或者商品之间天然的存在某种复杂的图结构的关系,如何利用图中节点与节点之间的关系对其进行向量化是非常关键的,在这种场景下基于序列的text embedding和基于卷积模型的image embedding都显得力不从心,在这样的背景下Graph Embedding逐渐在推荐系统中流行起来。
经典的Graph Embedding模型有, Deep Walk, Node2Vec,LINE以及比较新的阿里巴巴2018年公布的EGES graph Embedding模型。
参考链接;
《推荐系统实践》
推荐策略中的“召回
网友评论