炼丹知识点:模型评估里的陷阱
在实践中,做推荐系统的很多朋友思考的问题是如何对数据进行挖掘,大多数论文致力于开发机器学习模型来更好地拟合用户行为数据。然而,用户行为数据是观察性的,而不是实验性的。这里面带来了非常多的偏差,典型的有:选择偏差、位置偏差、曝光偏差和流行度偏差等。如果不考虑固有的偏差,盲目地对数据进行拟合,会导致很多严重的问题,如线下评价与在线指标的不一致,损害用户对推荐服务的满意度和信任度等。
在《流量为王:ABTest流量分层分桶机制》一文中,我们介绍了什么是A/B Test和怎么做A/B测试,本文介绍线下模型评估的几种方法。
在交叉校验方法里,又有两种验证形式,一种是K-Flod交叉验证,另一种是留一验证。
K-Flod交叉验证
首先,将全部样本划分为大小相等的K份;
然后,依次遍历K个子集,将第i个子集作为验证集,其他子集作为训练和评估;
最后,将k次评估的结果的平均值作为最终评估结果。
留一验证
每次留下1个样本作为验证集,N个数据,验证时产生N个模型。最后计算N个模型评估的平均值作为最终评估结果。
从上述描述中我们能看到,留一验证法的时间开销极大,真实场景使用较少。
没错,Holdout检验就是最简单的最直接的验证方法,比如我们在做排序模型时,我们把样本按照80%和20%的比例分成两部分,80%样本用作模型训练,20%样本用作验证。
这种方法简单,但是缺点也很明显,即随机得到的20%得到的评估结果也具有一定的随机性。
自助法对于总数为N的样本,进行n次又放回的随机抽样,n次采样有的样本重复,有的从未被抽中过,最后将没有被抽中的部分作为验证集。验证集的评估指标作为最终的评估指标。
这时候,你可能会问,没抽中的样本有多少呢?根据n次抽样均未被抽中的概率为(1-1/n)的n次方,根据重要极限定理解之,当样本足够多的时候,大约有36.8%的样本未被抽中过。
目前业界应用最多的,是可重叠分层分桶方法。具体来说,就是将流量分成可重叠的多个层或桶。因为很多类实验从修改的实验参数到观察的产品指标都是不相关的,完全可以将实验分成互相独立的多个层。例如推荐算法召回层、推荐算法排序层、打散层,或者首页、业务页、详情页等。
流量分桶原理
采用如下步骤将流量分配到具体模型上面去:
把所有流量分成N个桶。
每个具体的流量Hash到某个桶里面去。
给每个模型一定的配额,也就是每个策略模型占据对应比例的流量桶。
所有策略模型流量配额总和为100%。
当流量和模型落到同一个桶的时候,该模型拥有该流量。
举个栗子来说,所有流量分为32个桶,A、B、C三个模型分别拥有37.5%、25%和37.5%的配额。对应的,A、B、C应该占据12、8和12个桶。为了确保模型和流量的正交性,模型和流量的Hash Key采用不同的前缀。
首先,线下评估无法消除模型过拟合历史数据的问题。
其次,线下评估没法模拟线上真实环境,包括但不限于数据丢失、特征延迟等问题。
而且,线下评估没法真实的再现线上类似 用户点击率、用户完播率、用户停留时长等指标。因为这些指标只有真实发生时,才是真实的数据。
最后,从系统偏差角度,我们在《推荐系统Bias大全》一文中介绍了,由于用户交互的数据是观察性的,而不是实验性的,因此很容易在数据中引入偏差。它们通常来自不同的数据分组,并使推荐模型捕捉到这些偏差,甚至对其进行缩放,从而导致系统性种族主义和次优决策。本文将数据偏差分为四类:外显反馈中的选择偏差和从众偏差,内隐反馈中的暴露偏差和位置偏差。
现实世界中的推荐系统通常会产生一个有害的反馈回路。前面的小节总结了在循环的不同阶段发生的偏差,随着时间的推移,这些偏差可能会进一步加剧。以位置偏差为例,排名靠前的项目通常会从更大的流量中受益,这反过来又会增加排名的显著性和它们所接收的流量,从而形成一个“富起来越富”的情景。许多研究者还研究了反馈回路对流行偏差的影响。他们的模拟结果显示,反馈回路会放大流行偏差,流行的商品变得更加流行,而非流行的商品变得更不受欢迎。这些放大的偏差也会降低用户的多样性,加剧用户的同质化,从而产生所谓的 “echo chambers”或“filter bubbles”。