结构化数据的迁移学习:嫁接学习

1.data的重要性

  先从八月份的home credict说起,这个比赛的数据集是由六个数据源的七张表约两百个特征组成,我当时为了提升feature engineering迭代效率,在基本表的基础上逐个表添加进入模型来做特征。这个过程的最大感受是,可能给定表特征工程花很大功夫也才提升几个万分点,而每往模型添加一个表,就会有几个千分点的提升。根据最后leaderboard的差距,一个GM+五张表可能还做不过一个master+六张表,真是模型再好不如多join一张表,。

  再说到去年八月的instacart,这是一个让大家通过用户前N次的购买预测第N+1次的购买选择的题目,主办方非常的贴心的帮我们前N次的train和第N+1次train的label都给处理好了,直接做特征就行了,于是我就老老实实的花大力气做特征,结果金牌擦肩而过,后来一直以为是自己的特征工程还做的不够好,直到今年四月做talkingdata回头看这个比赛的时候,才发现前面的所有队伍几乎都自己又划分了N-x-1为train和N-x作为label的新样本数据增强,而我如果用了数据增强并配我自己的特征本可以solo进前十的(流泪)。所以说样本比人家少一大截,特征再好也没法和人比呀。

  接着上次的kaggle的比赛真的靠ensemble吗?的文章里的model>feature engineering>ensembel,从这两个例子让我深刻体会到data>model>feature engineering>ensembel, 如果有人要问我机器学习工作内容和kaggle竞赛有什么区别? 我可能会回答实际工作中,在model没有颠覆性的突破的情况下,比起调参和特征工程,可能去搜集更多样本和更多表收益更大。

2.植物的嫁接学习

前面做了那么多铺垫,现在就是要引入植物(注:比赛选手ID)的嫁接学习了。我作为一个NN小白的粗浅理解,大概知道cv通过预训练模型,nlp通过词向量来实现迁移学习,那么对于结构化数据呢?

  在实际工作中,我们可能会得到很多由于时间演化或者采样造成的分布产生变化的同源数据,怎么充分利用这些分布不同的数据来扩增我们的data量。在今年的IJCAI2018比赛中,大家发现前六天和最后一天数据分布不同,大部分人于是用同分布的第七天上半天的数据预测下半天,而植物在这个基础用前六天训练了一个模型,预测第七天得到的probability作为第七天模型的feature,再用第七天上半天的数据预测下半天,使最后的分数遥遥领先,轻松得到solo冠军,事后植物都说这是他玩的最容易的比赛,毕竟人家用半天数据,植物用的可是六天半的数据。因为这种迁移学习方法在比赛圈是植物最先分享的,所以大家都把这个方法戏称为“嫁接学习”。

相关github:plantsgo/ijcai-2018

3.关于嫁接学习的试验

相比于kaggle,国内的比赛喜欢搞初赛、复赛赛制。由于有意无意的原因,经常会出现初赛复赛不同源,分布不一致的情况,因此嫁接学习在国内比赛有很多用武之地。凑巧我也在某沟内比赛顺手做了些试验。分享一下我们的试验结果。

  在这里我们设定和test不同分布的数据为A,和test同分布的数据为B,我们的目标是预测和数据B同分布的test。

近期的三个比赛:

在IJCAI2018里,数据A就是前六天的数据,数据B就是第七天上半天的数据。

在Ogeek里,数据A有两百万数据,数据B只有五万数据。

在联通个性化推荐比赛,数据A有初赛约70W数据,数据B有复赛约35W数据。

(注:前两个比赛没参加,数据量不一定准确)

这些比赛都有一个共同特点,就是和test不同分布的数据比和同分布还要多很多(摊手)

为此,我们试验过以下模型:

model1  单数据集

model1.1 数据B训练的模型

优点:保证了同分布。缺点:浪费了数据A。这也是大部分人用的baseline。

model1.2 数据A训练的模型

优点:数据量上来了。缺点:不同分布。

model2 两数据集拼接

model2.1 数据A和数据B简单拼接训练的模型

优点:数据量全部利用上了。缺点:不同分布,而且数据A占主导,可能最后还不如model1.1,主要看优缺点谁影响更大。另外的坏处是不同分布,会导致cv线上线下不稳定。

model2.2 数据A和数据B拼接后,再加一列特征,标明样本是数据A还是数据B

优点:数据量全部利用上了,而且通过新加的一列特征保证了预测test是能和B同分布的,这时候会相对于model1.1有显著的提升

注:model2这里还有个小trick,k-fold的valid只用B数据,尽管不能完全同分布,起码可以让early stop在拟合到对B最好的round

model3 嫁接

model3.1 数据B+model1.2输出的概率训练的模型

这个也就是我理解植物的嫁接学习标准版,相对于model1.1有显著的提升

model4 拼接+嫁接(引导学习)

model4.1  数据B+model2.1输出的概率训练的模型

这个是我们的改进版本,因为嫁接在我们的联通数据集效果不好,我于是尝试用model2.1的输出的概率训练模型,万万没想到线上线下分数暴涨,后来和队友一讨论,拼接以及valid只用B这两个操作相当于给原模型加了两个正则项,因此得到的概率要比model1.2更有价值,因此嫁接后效果好。

model4.2 数据B+model2.2输出的概率训练的模型

同上

我们也给模型4取一个好听的名字:引导学习

联通这个数据集我们没调参,特征加起来可能就做了一天半时间不到,也没做特征筛选,但是很容易就比其他队伍做的好,但就像第一节说的一样,data>model>feature engineering>ensembel。对data的利用效率决定了一切。

4.留下的疑问

1.嫁接/引导学习在分类-f1score上表现不错,在logloss或者回归题上还能表现好吗?分享后希望参加国内比赛的选手能够去尝试这些方法并将结果分享给大家。

2.嫁接/引导学习在cv和nlp上有没有用过,效果如何,有没有机会推广呢,或许说不准论文早有这些套路了只是竞赛圈不知道呢?

3.model2.2 ,model3,model4.1 ,model4.2在我看来都应用全部数据并保证了同分布,但是线上却是model4.1>model4.2>model2.2>model3并且A/B榜都很稳定,这个规律是这个数据集的自身特点还是可以普遍适用?跟A和B的比例、差异性是否有关系,也期待在大家在以后的国内比赛里将比较结果分享出来。(在比赛里我是简单粗暴的把所有模型都融合了)

4.直接用probability做嫁接还是比较简单粗暴的,感觉丢失不少信息,未来会不会有更好的方法出现?

5.业务上的应用

比赛嘛,kaggle基本用不上这玩意,但是国内比赛还是有很多机会可以应用的,辛辛苦苦花了很多时间做数据分析特征工程,结果被别人花了三两天做比赛就因为data利用的好就超了肯定会很憋屈。接下来说说我设想的业务方面的应用

1.以IJCAI18的场景为例,我们在平时可以用较多时长产生的样本、较多的特征以及较长的时间代价离线训练一个模型,然后用近期产生的较少的样本,经过筛选的重要的特征加上离线模型嫁接的概率训练一个实时快速更迭并适应近期线上分布的模型,既保证了精度又保证了效率。

感谢NaiveLamb 指出这个其实FB的著名论文gbm leaf信息喂给lr有一定的相似之处,fb也有嫁接思想在里面,可能kaggle的数据集质量都太好了,以前大家都只注意到速度的提升了。

2.在数据源多,但是各数据源数据相对较少的情况且分布不一致的情况下,实际部署的时候可以部署嫁接模型,即用全数据源得到的数据训练模型后,再嫁接到各个部署环境对应数据源训练得到的模型。(注:这里要求model3或model4好于拼接的model2.2,否则就没意义)

6.致谢

以上就是这么多了,最后想说说我的一些感想,虽然我们常说kaggle分享多,但是愿意分享代码的其实主要是排名2%~3%的Olivier,andy harless这样的选手。在GM这个层次愿意给出代码的人还是挺少的(只说tabular比赛),所以一直一来我都非常敬服plantsgo、蛙哥、sjv、chengchenglong、ondera等一批大佬,尽管代码开源提升了潜在的金牌/奖金对手的竞争力,但是他们还是自信和非常高尚的分享了代码。(如果植物不分享嫁接方法的话,可能这次Ogeek会像IJCAI2018一样easy,当然最后还是凭借硬实力拿到了第一)。所以要感谢这些愿意分享代码大佬,让我们在未来的比赛中能在同一个起点开始(虽然最后不免还是要被大佬虐)。也非常建议在kaggle kernel学到瓶颈的选手多去看看他们的代码,必然会收益匪浅。

编辑于 2018-12-22

文章被以下专栏收录