CTR评估中的穿越问题

什么是评估穿越?

在拿到样本数据之后,做了必要的清洗和采样之后,我们会将样本分为训练集(train)和测试集(test)(有时还会再分一份作为validation),我们会在训练集上训练出模型,然后在测试集上对模型的效果进行评估,具体来说,我们会计算各种指标出来,例如准确率、召回率、AUC,MAP等等。我们之所以要将样本划分为训练集和测试集,主要目的就是希望在测试集上做评估,而不是在训练集上做评估,防止发生过拟合,进而使得评估结果更加准确。

评估穿越,指的就是由于样本划分不当,导致测试集中的信息“穿越”到了训练集中,导致评估结果会更偏爱过拟合的模型,从而导致评估结果不够准确。这么说比较抽象,下面我们以最常见的两种穿越为例,认识一下穿越究竟是怎么发生的。

时间穿越

拿到数据集后,需要将其按照一定比例分割为训练集和测试集,训练集用来训练模型,而测试集用来评测效果。要实现这个目的,最简单的实现方法,就是对于每条样本做一次随机选择,来判断将其放到训练集还是测试集。

但是这种实现方法,会导致一个问题,就是我们称之为“时间穿越”的问题。假设我们的样本数据包含了七月份和八月份的用户行为,按照上面的方法进行划分的话,划分的结果就是训练集和测试集中都可能含有七月和八月的数据,这样的数据在训练时没有问题,但是在预测评估时,会导致数据指标优于实际情况,例如,真的的AUC应该是0.7的话,那么在这样的数据集上评估出的结果就会大于0.7。

为什么呢?大家都知道训练集上训练出来的模型是不能在训练集上进行评估的,因为训练集上的评估结果会更偏好过拟合的模型,导致我们错误评估了模型的泛化能力。这就好比用来练习的试卷不能用来考试,因为这样会导致死记硬背的学生分数更高,而不是学习能力强的学生。类似的,在上面的例子中,由于训练集和测试集中都包含了七月和八月的数据,这就好像考试卷子中虽然没有包含练习试卷的题目,但是包含了非常相似的题目,也会导致我们错误判断一个学生的学习能力。究其根本原因,是因为在实际场景中,数据行为都是在快速变化的,相近时间内的行为存在一定的相似性,时间相差越远行为差异越大。这一点和一个稳定数据分布场景是完全不同的,如果数据分布在时间维度上是相对稳定的,那么时间因素就不是一个那么重要的因素,相互穿越带来的问题就会比较小。

会话穿越

以电商网站的推荐为例,用户在浏览一个商品时,某个推荐模块会为他推荐多个商品进行展现,用户可能会点击其中的某几个,其他的则不会点击。为了描述方便,我们将这些一次展现中产生的点击和未点击数据合起来称为一次会话(不同于计算机网络中会话的概念)。

在上面描述的样本划分方法中,一次会话中样本可能有部分被划分到训练集,另外部分会划分到测试集。这样的行为,我们称之为会话穿越。会话穿越的问题在于,由于一个会话对应的是一个用户在一次展现中的行为,所以是存在较高相关性的,穿越会带来类似上面提到的用练习题考试的问题;此外,会话本身是不可分割的,也就是说,在线上使用模型时,不可能让你先看到一次会话的一部分,然后让你预测剩余的部分,因为会话的展现结果是一次性产生的,一旦产生后,模型已经无法干预展现结果。这就好比说模拟考试时老师告诉你说是开卷的,于是你很开心地考了90分,但是到了真实考场上时,考试却是闭卷的,那么你可能只能得到70分。原因就在于你在模拟考试时利用了你在真实考试时无法利用到的信息。

穿越的本质

上面我们用两种类型的穿越,向大家介绍了穿越问题,但是这两种穿越,以及我们没有介绍到的其他类型的穿越,里面的核心问题是什么呢?

首先是一个信息泄露的问题。无论是时间穿越,还是会话穿越,其核心问题都在于在训练数据中的信息以不同方式、不同程度泄漏到了测试数据中。我在其他文章中也简单介绍过,机器学习本质上就是信息的游戏,信息的泄露必然会导致评估结果发生偏差。

其次是场景真实性的问题。上面的两种穿越问题中,线下训练测试的场景,都和线上真正预测未知数据的场景有着偏差,从而导致了评估结果的偏差。举个极端的例子,就好比慈溪在颐和园风平浪静的昆明湖训练水兵,然后去波涛汹涌的大海上和敌人打仗,焉有不败之理。

所以大家无论是在处理样本时,还是在处理特征时,需要对信息泄露和场景真实性问题加以注意,这两个问题可能会以各种形态出现在机器学习系统中,稍不留神可能就会被捉弄。

 

 

  1. 浅谈机器学习评估中的穿越问题
上一篇:三层交换机之Flex Counter


下一篇:[mmu/cache]Cache Type Register(CTR)寄存器介绍–InProgress