今天刷知乎的时候无意看到cvr 预估中的转化延迟反馈问题概述 这一篇文章,了解到了"转化延迟"这个概念,让我想起了去年kaggle一个不成功的比赛.随便写写.
转化延迟
首先看看原文转化延迟的概念:
点击行为可能在用户浏览后的很短时间内就发生并被广告系统收集不同,广告后续所产生的转化conversion很可能延时发生(更可能是通过不同的方式延迟上传的,如需要广告主回传的深度转化行为),比如看过一个商品广告,当时有些心动但并没有马上去买,过了几天按捺不住又去购买(Delayed Feedback),给建模带来困难。
比赛简介
再看去年kaggle的比赛Microsoft Malware Prediction
这是一个由微软举办的比赛,预测一台机器是否很快会受到恶意软件的攻击。是由2015年Microsoft Malware Classification Challenge (BIG 2015) 比赛的延伸,而2015年比赛已经成为恶意软件检测领域小有影响力的数据集,little boat 和jiwei liu的冠军solution 对应的网页还被不少论文引用了,因此这次2019年的比赛吸引了不少高手参加.
关于这个数据集,是有八百万台机器样本组成,每个样本包含了诸如操作系统,版本号,是否安装杀毒软件,杀毒软件版本号等八十多列关于该机器样本的信息,虽然feature里没有直接的时间特征,但是通过对版本号这种暗含时间信息的特征做EDA分析,可以看到,train和test其实按照time 做split 的.test集里的机器基本都是比较新的版本号.
通常我们知道涉及到时间分割的比赛由于分布不一致模型很容易不稳定,但是这次比赛样本很多(八百万),而且使用的AUC做为metric,数据特征比较丰富,容易拉开区分度.在过去时间split+auc的比赛里,比如talkingdata-adtracking-fraud-detection 以及 home-credit-default-risk 均未发生特别大的shake.因此大家都预期这次比赛不会发生shake,这也是同期还有别的比赛(ELO),但是大部分高手都参加Microsoft Malware Prediction比赛的原因.
令人震惊的shake up
令人意想不到,到开榜那天,巨大的shake up的让所有投入巨大时间精力都愤怒了.首先在这里说,kaggle有两种shake up,一种是合理的,被shake down的是由于新手过拟合造成的,另一种是不合理的,被shake down是由于数据集质量不足造成的.通常我是通过"奖金区","金牌区","非折叠区(top50)"里保留多少GM,master来判定shake是否合理的,比如下图,shake的都是kaggle expert及以下的,而保持名次都是GM和master,就是合理的shake.
而在Microsoft Malware Prediction比赛的private榜里,top10居然只有一只队伍高过master,剩下的都是expert以下的,可见这次比赛的shake是非常不合理了.说明这个比赛的数据很可能有问题.
shake up的原因:转化延迟
开放private榜后,愤怒的kaggler开始通过提交来测试private 数据寻找原因,很快原因就被kaggle的著名EDA高手Chris Deotte找出来了找出来了, 他只用七行代码就在private榜上比第一名还高的成绩,其代码仅仅是把最新的操作系统版本的被恶意软件感染的概率全部手动设置为0,其它的设置为0.5就行了.
之所以会出现这种情况,是因为老的电脑机器都已经运行了足够的时间,经过了恶意软件的考验,包括train里和public的数据的label都是正常,而private里一部分最最新的机器,离制作数据集的时间太近,还没来的及被恶意软件入侵,转换为正样本,因此其label就几乎全标注为0了,这也是Chris Deotte 简单的写个规则就超过了第一的原因,因为模型并不能去预测这些错误标注的outlier label.具体可见Summary of Microsoft Malware Shakeup
小结
总的来说,这场比赛就是出题方没有注意到转化延迟问题,在离制作数据时间最近的样本中制作了一堆outlier,最终比赛结果毫无意义.不顾也正如很多人所说的一样,对于一个算法工程师来说,定义一个好问题,制作一个好的数据,很多时候比给出一个好的solution更困难,更重要.连微软都不小心在这里翻车了.
小结2
在我遇到的比赛数据集里,数据质量可分为三类
- 1.完美的数据集
- 2.不完美的数据集,有小瑕疵但是不影响比赛进行的,比如出现了home-credit 和ieee-fraud-detection duplicate id leak,但前者8000只队伍仅有1只发现,后者最后基本都发现了,因此没有影响到比赛的结果.
- 3.失败的数据集,如本次比赛,可以通过赛后不成功的shake up看出来.
做出完美,没有瑕疵的数据集是很不容易的事情,上述三者大概是1:1:1的样子吧,去翻过往kaggle比赛的leaderboard shake 记录,失败的比赛还不少.当出现失败的数据集的时候,比的就不是谁模型好,而是谁能够拟合到test集.在kaggle这就是看运气了,放在某些平台private开放几天的,就可能出现Chris Deotte那种测出test分布而刻意过拟合的方法,这时就是比谁小号多,谁更能private share了.而这些平台跪舔评委的答辩制度导致参赛者不会指出出题方的错误.所以在失败数据集不可避免的情况下,我还是倾向于kaggle这种形式,毕竟RP好的人不可能永远RP好,但是人品差的却可能永远人品差.kaggle这种比赛形式虽然不能挽救比赛的失败,起码可以让没有参加比赛的人在复盘的时候知道这是一个失败的比赛.