打kaggle比赛有一段时间了,有幸拿到Kaggle Master,也算是一种肯定。最好成绩4/4128,进入绿牌区,共收获3金5银,5次top 1%。整个过程付出很多,收获更多,需要阶段性总结一下。对我来说,kaggle就是一个非常不错的学习交流平台,在这里我通过比赛加深了对各种数据和模型的认识,掌握了许多可以迁移到实际工作中的数据挖掘技巧。在这里还结识了非常优秀的队友,和他们协作非常愉快。
Trust CV
比赛一般分为public board和private board,第一阶段显示的都是public board,最终成绩以private board为准。许多同学都被public board诱惑,陷入过拟合的境地,在终榜遭到shake up。我经过这段时间的熏陶,Trust CV已经成为我的准则,它代表着泛化能力的强弱。
公榜往往只有总体数据的10%~20%,而给出的训练数据往往数倍于公榜数据量。通过设置合理的CV交叉验证,我们可以通过训练数据来给予模型合理的判断,其可信度以数据量而论,往往高于公榜score。在talking data比赛中,我们就因为迷恋public board而错失金牌,从此之后基于Trust CV理念,在最后提交的选择中,我们的选择都还不错。
机器学习有个理念是bias-variance tradeoff,它是指模型复杂度的影响,其目的也是追求模型更强的泛化能力,其实在这里有异曲同工之妙。
特征 VS 模型
我一般只挑选表格和nlp比赛参加,因为这些知识对我工作有所帮助。对于传统表格比赛,模型的选择基本趋向于lightgbm和xgboost等boost tree模型,在融合的时候也会加入FM,Ridge等弱模型作为锦上添花。因为模型大家使用的都差多,所以可以说特征为王,优秀的特征工程是重中之中,通过学习优秀的top解法,可以看到大量细致、琐碎的特征工程穿插其中,把数据的细节挖的清清楚楚。
在特征的时候,除了一些固定的套路外,可以通过直觉来嗅出特征的味道。在普遍场景下,我们需要对用户进行画像建模,有时候也需要对物品进行画像建模。我们可以把自己代入到这个场景中,比如信用违约预测,我们可以想象当这个用户有什么异常行为后会在接下来更有可能违约呢,比如他历史上有多次违约记录,他最近开销很大,甚至超过了收入等等。发现数据规律的过程是充满乐趣的。
对于模型,在nlp比赛中往往比较重要,随着DNN模型在nlp领域占据主导地位,特征工程的作用不再那么重要,往往聚焦于字符的清洗处理,以期命中更多的Embedding。网络结构的探索成为主要发力方向,这也是可以理解的,因为DNN本身就暗含特征工程,削弱了传统特征工程的作用。不过在一些场景下,在网络中加入统计特征还是有不错的收益的。
比赛与算法落地的区别
打比赛的pipeline和工作中的算法落地还是有区别的,我觉得比赛的pipeline其实是工作模型落地的一个子集。
- 在比赛中,有预清洗好的数据和明确的离线拟合指标,然后通过特征工程、模型参数优化和模型融合来不断拟合,整个过程都是离线和静态的。
- 在工作中,我们要拟合的却是线上,这个过程和目标都是在线和动态的,不过特征工程和模型参数优化这两个极为关键的模块和打比赛是具有共通性的。此外,在工作中,我们需要先从数仓中进行数据清洗,然后基于线上目标定义与之契合的离线metric,通过特征工程、模型离线训练、模型线上部署、ABTest不断提高线上指标数据。在这个过程中:
- 数据清洗和离线指标定义非常重要,离线指标和线上指标不同步也是经常遇到的问题
- 模型需要有严格的效率控制,打比赛的花式Ensemble宣告失效,耗时的模型结构需要商榷,我们需要进行模型精度和效率的trade-off。
- 比赛中的数据量往往不大,一般在百万级左右,而工业界的数据量至少亿级别以上了。就需要用到spark、hadoop等分布式框架了。
打比赛就像读论文一样,也是学习提高方式。在工作中进行排序模型的落地中,就用到了一些在比赛中学到的特征工程和调参技巧,获得了不错的收益。
Team Work
对我来说,打比赛获得学习经验的意义大于最后成绩,当然二者也不矛盾。我会倾向于团队协作完成一场比赛,在一个优秀团队里往往能学习到更多。这个协作过程中尽全力是我的原则,大家能力有高低,但负责任、靠谱的协作态度是必须的。
在这个过程中,我们一般会先独自进行特征工程,以期保持各自的模型差异性,并保持特征模型等相关交流,然后在后期进行模型差异性融合,往往能取得不错的boost。
团队交流也是充满乐趣的,比赛中后期往往会有一段疲乏期,这时候进展开始变缓,团队交流能有效缓解这种情况,有时还能激发灵感。
总结
总之,虽然打比赛占用了空闲和假期时间,但收获良多。kaggle的知识分享做的是非常优秀的,它提供了另外一种学习视野,收获良多。Kaggle比赛不能锻炼我们的每一块肌肉,对于工业界的算法落地,还是需要从更多细致的方面进行设计和考量。