评估主要分两种:
● 部署前的离线评估。关于这部分的指标大家可以参考我的另外两篇博客:
1)http://blog.csdn.net/allenalex/article/details/51318270
2)http://blog.csdn.net/allenalex/article/details/78161915
● 部署后的在线评估。通常在离线评估达到基本满意的指标后,就可以部署到线下执行线上评估。通常考虑到效果的不确定性,以免对用户体验造成伤害,会随机抽取部分用户实验。也就是通常说的A/B test。
数据切分
线下评估很重要的一点是将数据划分为训练集和测试集。划分数据的方法通常有以下几种:
● 随机划分。这种很好理解,就是将我们的数据取一个比例(比如7:3),随机划分为训练集和测试集;好处是,我们可以多次切分,也就是可以实现交叉验证。缺点是,没有考虑时间,存在用新数据训练,老数据评测的问题。尤其在时间顺序非常明显的场景。
● 按时间划分。
● 基于用户的划分。前面的两种方法,划分的单位是一条记录(比如用户对物品的一次行为,一个评分),这种基于用户的划分是把一部分用户划分为训练集,一部分划分为测试集。比如,训练集是有过历史评分记录的,而测试集是没有任何历史评分记录的用户。这样就可以评估这种方法对于新用户的效果。
● 基于物品的划分。和基于用户的划分规则一样。只是把用户换位物品
调参集
通常来说,有少部分可调参数是算法无法估计的。比如正则化参数、矩阵因式分解的隐式维数以及SGD种的步长等。通常,通过在测试集上获得的准确度来选择最佳的可调参数并不好。这会过高的估计了在未知数据上,模型的准确性。当然,如果测试集本身很大,而可调参数很小,那这种过高估计也没多大关系。但是在实际中,我们最好再将训练集划分成两部分,一部分还叫做训练,另一部分叫做调参集。训练集用来确定模型参数,而调参集用来选择一个好的可调参数值集。最后在等测试集上验证。具体步骤如下:
1、对于每一个可调参数集s:
1)用户s很训练集训练模型;
2)在调参集上验证模型的准确性。
2、用s*表示获得的最好参数集;用s*和训练集(或者训练集加调参集)训练模型;
3、在测试集上评估第2步得到的模型的准确性。
关于离线中的准确性评估和排序评估。大家参考本文开头的两篇博客就差不多了。
在线分桶测试
线上评估采用“线上分桶实验”方法。
分桶通常有两种分法:基于用户的分桶和基于请求的分桶。
基于用户的分桶,大家应该都清楚。我们常说的A/B Test就是这种。而基于请求的分桶,就是随机的将请求分到不同的桶去测试。这样的话,一个用户的请求就可能分到不同的桶上实验了。
显然,基于用户的分桶,分界要更清晰。而基于请求的分桶,对于同一个用户,(模型)A和(模型)B会同时影响他。这也是我们更偏向基于用户分桶的原因。但是,基于用户的分桶会出现一些用户的推荐一直是效果更差的模型推荐的。这样肯定会影响用户的体验。
还有一点要注意,分桶的指标对于所有“桶”的标准必须一致。比如A是活跃用户,B选择的是新激活用户。那这样的分桶就没有意义。比较就是错误的。比如,推荐中,协同过滤只针对活跃用户。另一种方法针对全局用户。如果这是两组测试。比较就没有意义。
关于分桶测试,以下这个实践建议比较好。至少自己之前在实践中,A/B test的时候,没有考虑到。这个实践也称之为A/A test。也就是在不同的桶上采用同一个模型。这样就可以排除因为不同的桶的数据分布不同造成的影响。基于此,我觉得在实践中,做A/B test。也可以尝试下交换。比如,对于两个组:A,B 第一周,A组部署模型1,B组部署模型模型2,然后第二周,将部署调换一下。这种跟A/A test的意思是类似的。 分桶测试的这个时间不能太短。一般至少要一到两周。这个一方面是因为用户的行为;另一方面,通常一个新的模型的结果会和之前的不一样。用户可能会受新鲜度影响。所以,有时候会把部署后的前面几天的效果忽略掉的。
线上性能指标
对于大多数系统来说,最重要的目的是提高用户的参与度。以下是几个常用的参与度评估指标:
● CTR(点击率)。统计点击率要注意去掉那些无效的点击。下面是几种常见的无效点击情况:
1) 机器人或者其他形式的恶意点击;
2)点击后,快速退出的;
3) 某个用户反复点击某个产品,需要考虑去掉太多重复的。
● 每个用户的平均点击次数。与CTR的区别就是,分母不再是访问次数,而是访问的用户总数。
● 点击用户占比。也就是点击用户占全部访问用户的比例
● 点击之外的行为。比如分享,喜欢和评论等。
● 停留时长
评估前检查项
在对Test评估前,我们通常还需要进行一些检查:
● 用户属性的直方图。每个桶的用户的属性等在不同的桶上的分布要相同。
● 不同的桶,系统对用户的展示次数至少是要相似的。
● 每个点随时间变化的展现量,点击量以及用户量。这些值能指示这个分桶是否一直正常。如果出现异常,可能说明有问题,需要检查。
● 用户访问的频次。不同桶上的用户访问频次要相同
监控系统的这些指标非常重要,只有这样我们才能对我们的线上实验结果有信心。毕竟大多数的端对端的推荐系统是非常复杂的。
分块评估指标:
有时候在整个系统上,对全部可能的用户进行效果评估并不能完全验证一个模型的好坏。所以有时候可以采用分块评估。大致有以下几种:
1)基于用户的属性划分。也就是把用户,按属性分为不同的类别,在不同的类别上评估效果。比如男女。也许模型对男士很有效,而对女士没效果.
2)基于用户的活跃等级。这个也好理解。活跃用户,沉默用户。对任何一个活跃层级用户有效的模型,对其他的层级用户不一定有效。
3)按时间划分。也就是统计不同的时间段。比如早上和上午。周末和工作日等。
4.3 Offline Simulation 和4.4 Offline Replay没弄明白。后续搞懂后再补充一篇