本文只保留了重要的信息,泛泛之谈全部予以删除。(在知乎中分别搜索kaggle、Kaggle stack之后所有信息的摘录)

刚参加一个比赛,需要花点时间了解这个比赛的领域背景,甚至需要查一些资料或阅读一些文献,这对后面构建特征和选择模型很重要。我看到有很多 winners 分享经验说自己构建的大多数特征都是从商业(领域)层面思考得到的,所以领域的先验知识很重要。

另一需要注意的是比赛的时间线。比赛有一个开始时间,一个组队截止时间和一个最终提交时间。一般一个比赛会持续几个月,最终提交时间就是比赛结束的标志。组队截止时间一般是比赛结束前一周,过了这个时间点就不允许再组队了。留意好这些时间点,对你把握比赛的进度至关重要,尤其是用业余时间打比赛的上班族。很多比赛的数据量比较大,模型跑下来很耗时,如果到最后半个月才开始发力,会发现时间不够用,很多想法都没机会尝试。有大牛分享自己的时间安排是:在比赛刚开始的时候会多花点时间做探索,把pipeline 搭起来,接下来可以少花点时间,平时有什么想法可以直接测试,最后一个月或半个月再做集中冲刺。

Data

介绍数据,提供数据下载。

这个模块需要认值阅读,它介绍数据的产生方式、存储形式、每个字段的含义等。我们很多时候是通过对数据规模或形式的判断来决定要不要参加这个比赛。比如,数据规模很大,你没有内存足够大的服务器可以hold住,可能就没法打这个比赛;再比如,是图像数据,那就得用深度神经网络,如果对这方面不熟或者没有GPU可用,可能也没法打这个比赛对新手而言,该开始可能更倾向于择一些表格类、数据量适中的数据集。

为方便大家打比赛,kaggle 提供了一些运算资源。kaggle 用户的每个 kernel 可以有 16G 的内存和 4 核CPU,这足够打多数比赛了。另外,最近还提供了 GPU,在新建 kernel 的时候可以选择开启 GPU,但当打开 GPU 时,CPU 和内存资源会少一些,大家可以根据情况选择使用。

如果不设置 Private LB(即所有的测试数据都用于计算 Public LB),选手不断地从 Public LB(即测试集)中获得反馈,进而调整或筛选模型。这种情况下,测试集实际上是作为验证集参与到模型的构建和调优中来。Public LB上面的效果并非是在真实未知数据上面的效果,不能可靠地反映模型的效果。划分 Public LB 和 Private LB 这样的设置,也在提醒参赛者,我们建模的目标是要获得一个在未知数据上表现良好的模型,而并非仅仅是在已知数据上效果好。

(这段话我自己的理解是,因为public LB上面有得分,选手会根据这个来改进,所以这种方式等于变相告诉了参赛者测试集的未知类别标签是什么),知乎上一位网友的说法是这样的,我很认同.

国内用户可能会存在一个延迟或连接不稳定的问题,有时候甚至刷不出,这个应该是因为墙的原因,最好自己花钱搞个翻墙的代理。

Leaderboard

排名区,分 public LB 和 private LB。比赛方会将 test 数据集中一部分(比如 30%)拿出来做为 public LB 评分和排名,剩下的部分作为 private LB(也就是最终结果)的评分和排名。

这个意思是,你下载到的测试集,其实分为两部分,但是是怎么分的,故意不让你知道,而是混在一起的,当你把所有测试数据的的结果提交以后,Kaggle服务器会根据事先的划分方法,以private LB的结果作为你的最终排名.而Public LB的则只是比赛过程中的排名.

你每天都可以提交并查看自己的答案在 public LB 的得分和排名情况,在比赛结束前需要选择两个提交作为自己的最终答案,比赛结束后,平台会计算你的答案的 private LB 得分并自动挑选得分高的一个作为你的最终成绩。

在讨论区你会经常听到大家讨论 CV score、LB score,指的就是你模型本地交叉验证的得分和提交后的 public LB 得分。

需要注意的是,public LB 得分可能会和 private LB 得分差别很大,比赛结果公布前你可能排名前十,比赛结果公布后发现自己跌到上千名了,这就是所谓的 shake up,很吓人的。这次的 Elo 比赛因为异常值的原因也有很大的 shake up,大家很早就预料到了,好在我们组做了一定的准备,抗住了 shake up,从第 8 名跌倒 14 名,还算是比较幸运的。

引用kaggle上面的一段话:

Competition scoring and ranking are based on two leaderboards : public and private. These two leaderboards are created by randomly splitting the test dataset. Public leaderboard is based on a subset of 30% of observations in test dataset you are submitting while the private leaderboard is based on the remaining 70% of data. The private leaderboard remains secret until the end of the competititon. It will determine the final competition ranking!So far, all your submissions are based on the public leaderboard dataset. Using it, you are receiving a feedback about your performance. It can tell you how good you model is and how it is generalizing on unseen data.However, the final leaderboard (70% of test dataset) will determine final result. Before the end of competition ranking (Submissions dead line : 02 April 2019, 23:59), you will have to select your two favorite submissions. By default, Kaggle chooses the two submissions that have performed the best on public leaderboard. However you are free to select the two submissions you want.Finally, these two submissions will result in the private leaderboard and so final ranking. In a Kaggle competition, the purpose of this division is to prevent people from winning by overfitting to the public leaderboard. Participants then are motivated to make sure their models will generalize well to the private leaderboard test set.Therefore, your results on public and private leaderboard could be slightly different. There are multiple ways to explain this difference including :Making a lot of submissions on Kaggle can result in an overfitting situation on public leaderboard. When making dozens of submissions, you could "learn" some imperfection in dataset that would promote a configuration towards an other.

什么意思呢?就是本地模型最优的情况下,你的public越低,你的private才能越高

Rules

比赛规则。这个很容易被新手忽略,因为都是讲一些条款。很多新手甚至是大牛都在这个上面吃过亏。讲两个需要注意的地方。

一是提交次数,这里会写明每天允许的最大提交次数,一般是 5次,也有比赛时 3次的。假如一个比赛持续时间是三个月,那么总提交次数差不多就是 5×90=450 次,即便组队,你们队的总提交次数也是这个值假如你们队的三个成员,在比赛最后一个月打算组队,大家已经各自提交了200、100、50 次,是没法组队的(),必须10天不提交,等提交次数达到 350(5×70天)。

很多人为了躲过提交次数的限制或者“节省提交次数”,专门注册了小号,这是很危险的,这被称为 multiple accounts,是会被 kaggle 的反作弊系统侦察出来的。在比赛结束后,会先公布初步排名,然后 kaggle 平台反作弊系统开始运行,大约两三天后,凡是被判为作弊的队伍直接从排名中移除,几个月的努力就打水漂了!

另一个是组外私自分享代码和结果,这也是明令禁止的。组队之后队员之间可以分享,或者通过公开的 kernel或discussion区分享。同样,如果被检测出不同队伍或个人间有相似的结果,也会被移除最终榜单。

Team

这里管理你的队伍。可以向别人发起组队邀请,或者接受别人的邀请,当然,也可以时不时给自己队伍改一个骚气的名字。我们队伍最后集齐四人之后,改名为 skynet,是电影《终结者》里人类创造的一个人工智能防御系统,本来是想通过这个霸气的名字“终结”其他人的,后来发现我们还是 too young too simple, sometimes naive,差点被别人终结。

2. 挑选比赛

对于新手而言,我觉可以从一下几个方面考虑

比赛类型

借用 Eureka 大牛的观点,可将 kaggle 平台上的比赛分成挖掘、图像、语音和 NLP 四类。其中挖掘类主要面对的是结构化数据,也就是表格数据,包括了各式各样的预测问题(预测销量、点击率、推荐排序等)。主要的共性就是理解数据,理解问题,从数据中找到有用的信息用来预测,这类问题胜负更多的是在特征上。

对于图像问题,可能就较少涉及到特征了。图像问题现在主要用到深度学习的相关技术,基于深度学习做了很多改进或者演绎,已经完全不需要在特征层面上去做什么了。

对于新手而言,挖掘类问题可能更容易上手。

数据规模

新手尽量选择中等规模的数据,这样数据处理和模型训练的时间更短,方便尝试尽可能多的方法。新手缺乏经验,可以通过多尝试来弥补,但如果选择的数据集太大,尝试的时间成本和计算成本都很大,不管从时间还是精力层面考虑,都是很大的障碍。

数据尽可能有丰富多样的特征,太完美的数据集不要选。这个大家可能会比较费解,完美的数据集不是更方便吗?没有缺失值,都是数值特征,多方便。其实不然,越是这样的数据集,可供新手发挥的余地就越小,你会发现你唯一能做的就是把数据喂给模型,结果是怎样就是怎样了,甚至不知道如何改进、提升。所以,尽量选择有缺失值、有很多类别特征的数据集,这样你可以借鉴前人经验对这些特征做各种变换、尝试,时不时能收获一些小惊喜,甚至最后还能取得一个不错的成绩。

3. 如何打好一个比赛

起这样一个标题有点大言不惭,可能需要一个身经百战的 Grand Master 来回答这个问题。我这里想分享的是作为一个菜鸟,怎么一步步通过学习和尝试拿到自己的第一个奖牌。我就以这次参加的 Elo Merchant Category Recommendation 为例讲讲自己的经历和感悟。

比赛早期加入

我是在比赛开始后不久就加入的,对于新手而言,早点加入比赛有好处,因为刚开始人不多,大牛更少(他们都是最后一个月强势加入然后霸占榜首的),这样你每天的尝试都是有排名上的收获,这对自己是一个很大的鼓舞。

理解背景、探索数据与验证

比赛的背景我看了很多遍:Elo是一家信用公司,它提供了信用卡用户的一些信息和历史交易记录,想通过这些数据预测用户忠诚度。根据它的描述,我通过数据逐条验证,发现有疑问的地方就会在 discussion区里提,也会发布一些公开的 kernel 验证自己的猜测。其中有两个比较重要的是 ① target 的预测偏差90%是异常值贡献的,② hist_trans 和 new_trans 的一些基本信息的验证。这些都很简单,但对后面的模型起到了很大的帮助。

零模型和基模型

这算是比赛的套路了,先训练一个baseline model, 然后在这个基础上不断优化、提升。我这里要补充的一个点是“零模型”,就是不用模型去做预测,一般就用全零或者全均值去做提交。比如这次的Elo比赛,用全零提交,public LB 得分3.9x,而基模型也只有 3.8x。通过这个对比可以看到模型的效果是很差的,这其实是太多异常值导致的。这些信息对后续的处理或模型评估都很有用。

GBDT已成为挖掘类比赛的主流算法,现成的包有xgboost、lightgbm、catboost,lightgbm因为速度快、准确度高脱颖而出。所以这次比赛,lightgbm 仍是主流的工具。

当然,前期也需要尽可能多地尝试其他模型,机器学习领域有一个“没有免费午餐定律”,是说没有那种模型要比其他模型都好,不同的数据集可能适合不同的模型,这个只用通过尝试才知道。所以,打 kaggle 比赛,其实更像是不断地做数据实验。我早期也试了libffm、RandomForest、LinearRegression、DeepNN等。

本地评估体系

模型评估体系没建起来,其他任何探索都是盲目的,因为你没法确定好坏。这个很有讲究,你得判断 public LB 和 private LB 的得分是不是一致的或高度相关的。否则你可能在接下来的几个月中“一直努力拟合public LB”,结果却偏离了 private LB,这就是为何大牛一直告诫我们“Trust your CV”的原因。

这次Elo比赛,我早起发现了可以通过手动矫正异常值来提高 public LB 得分,后面通过统计分析与验证,发现原来是 public Lb 中异常点比随机水平高,这是很危险的,后来就采用了保守的做法,比赛结果公布后证实了这个想法。

特征重要性和特征工程

前期适当做一些调参,获取一组相对可以的参数就可以了,不用太花太多时间调参,因为它起得作用很有限。用这组参数和基模型来输出特征重要性。挑选重要的特征(比如top10)进行分析和构建新特征,然后测试,然后扩大范围(比如top20)重复以上过程。

这一步是拉开差距的关键,也是花最多精力的地方。在这个过程中需要不断地关注discussion和kernel区,多看别人时怎么提取特征的,多看别人的 EDA,多尝试,说不定就有启发你的地方。

对于Elo比赛,前期大家模型输出的top importance特征都是时间相关的,虽然难以解释,但方向有了,所以我们也构建了很多时间相关的特征,事实证明,这些特征起到了重要的作用。直到后期,有位Grand Master利用他对数据神乎奇迹的转换和惊人的洞察力揭开了忠诚度的商业含义,时间相关特征为何如此重要才得到了解释。

组队

对于新手而言,你的排名就是你组队的筹码。我前期发现异常值矫正后,排名飙升到top20,就有很多人联系我组队了,我在discussion区与北京一个小伙伴组队了,没过多久又邀请了一名在新加坡读书的小伙伴,之后我们一直维持在top10的水平,一度长时间位于top5,差点迷失自己,直到后期大牛进入把我们挤出了top10,我们开始紧张起来,又吸收了一名韩国的朋友,慢慢回到了top10。

我们都是第一次打比赛,不过配合得挺好的,建了微信群用英文交流,几乎无障碍。

模型融合

特征工程和模型融合是打 kaggle 比赛的两大利器,比赛后期基本就是尝试各种模型融合了。对于模型融合,大牛的观点:真正重要的是要有两三个强模型和很多相关性很小的弱模型,模型多样性很重要,弱一点也没关系。幸运的是我们每个人手里都有一个不错的模型,然后我又批量生成了一些弱模型,融合起来,取得了不错的效果。

补充:

比赛类型

从 Kaggle 提供的官方分类来看,可以划分为以下类型(如下图1所示):

◆ Featured:商业或科研难题,奖金一般较为丰厚;

◆ Recruitment:比赛的奖励为面试机会;

◆ Research:科研和学术性较强的比赛,也会有一定的奖金,一般需要较强的领域和专业知识;

◆ Playground:提供一些公开的数据集用于尝试模型和算法;(这个优胜者是不给奖牌的)

◆ Getting Started:提供一些简单的任务用于熟悉平台和比赛;(这个优胜者是不给奖牌的)

◆ In Class:用于课堂项目作业或者考试。

图1. Kaggle 比赛类型

从领域归属划分:包含搜索相关性,广告点击率预估,销量预估,贷款违约判定,癌症检测等。

从任务目标划分:包含回归,分类(二分类,多分类,多标签),排序,混合体(分类+回归)等。

从数据载体划分:包含文本,语音,图像和时序序列等。

从特征形式划分:包含原始数据,明文特征,脱敏特征(特征的含义不清楚)等。

比赛流程

一个数据挖掘比赛的基本流程如下图2所示,具体的模块我将在下一章进行展开陈述。

图2. 数据挖掘比赛基本流程

#--------------------------------------------------------其他问题-----------------------------------------------------------------

常见的缩写:

EDA:exploratory data analysis

https://zhuanlan.zhihu.com/p/52244024

这篇文章中提到pytorch的cuDNN存在不稳定的问题。

另外kaggle中使用的最主流的框架是keras

 kaggle 平台上的比赛分成挖掘、图像、语音和 NLP 四类
 kaggle既要通过内容来选择比赛,又要通过shake up来选择比赛

triplet loss 主要用于人脸识别

往届公开的比赛解决方案:
http://ndres.me/kaggle-past-solutions/

当然,基本的ML知识还是有的。
在比赛中,最常用的分类器一般是Gradient Boosting Tree(GBDT)和Random Forest
(对,你没看错,不是那个在教科书中推Dual时让很多人痛不欲生的SVM)
一些常见的预处理技巧,比如PCA,KMeans,TF/IDF,Hashing等等都还是必须的。
这里就不展开讲了。最后,但是非常关键的一点是Ensemble 从KDD Cup到Imagenet,
我从来没见过ensemble不会改善结果的情况,只是多与少的问题。不做ensemble就意味着你自己告别了一大块宝藏。
作者:Naiyan Wang
链接:https://www.zhihu.com/question/24533374/answer/34631808
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

magrittr,对于R来说革命性的Pipeline

下面是知乎上两个争锋相对的回答。

比如说图像分割,现在大家都用很长很长的网络,像resnet101来达到最佳的性能。
而实际上如果你要把网络部署在移动端,resnet18都已经不合格了

这个时候我们会考虑使用传统的卷积网络,例如FCN,是不是感觉一下子回到了2015年以前?
所以现在很多文章发出来很吊,但实际上不被工业界采纳,人们还在用着很早的成果。

作者:陈大宝
链接:https://www.zhihu.com/question/295475618/answer/527181753
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

至于说无法deploy和实际生产的,无非是不敢掀开自己只是个重复性搬砖工的遮羞布,
靠经验和ppt来掩饰自己根本不敢真刀实枪拼精读的事实。
因为其实在金融时间序列等领域,不同的data science精读能相差很多的。
在金融领域,特征工程和工程上线落地的时间占90+%。
更糟糕的是数据缺失率很高。(来自知乎)

另外NLP中关于推荐算法最知名的是FFM,不再是SVD了。

Netflix 网飞公司网飞公司组织和推广了第一个数据科学比赛。
在电影推荐的挑战比赛中,整合创造真的推动了最新的成果,
也许是因为过于复杂,网飞公司决定不在生产中使用获胜的算法。
那是一个简单而复杂的算法。然而,许多的论述和新奇的算法,从这场比赛中产生:
- 堆放线性权重特征 [Feature-Weighted Linear Stacking]-  
针对精确推荐系统的混合预测 [Combining Predictions for Accurate Recommender Systems]-  
针对Netflix Prize的混合算法 [The BigChaos Solution to the Netflix Prize]
作者:HaoHao
链接:https://zhuanlan.zhihu.com/p/37106935
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这个链接提到了在比赛中制造数据

https://zhuanlan.zhihu.com/p/62773597

提到了以label分布进行数据分割。(我觉得这个的意思应该是会按照特征分布来进行数据分割。)

https://zhuanlan.zhihu.com/p/33740042

特真工程的本质不就是还原线性或者还原分段线性

https://zhuanlan.zhihu.com/p/62773597

Kaggle上面有人提到了这个,说是自己没看懂。

https://www.kaggle.com/ogrellier/feature-selection-with-null-importances

关于 pubilc LB以及private LB:

@cpmpml is very much correct. We always split time-based data by time for Train/Test, and Public/Private. If we didn't do that, the Public leaderboard score would provide feedback (leakage) for future time points.

所以kaggle的数据分割方式是,希望你的模型能够预测未来。

kaggle 相关知识汇总(转载+自己整理)相关推荐

  1. 【LWIP】LWIP协议|相关知识汇总|LWIP学习笔记

    这里作为一个汇总帖把,把以前写过的LWIP相关的博客文章汇总到一起,方便自己这边查找一些资料. 收录于: [LWIP]LWIP协议|相关知识汇总|LWIP学习笔记 LWIP协议 [LWIP]LWIP网 ...

  2. ODBC管理器相关知识汇总

    ODBC管理器相关知识汇总 最近,在使用终端应用程序调用数据库文件时,发生了:ODBC问题之驱动程序和应用程序之间的体系结构不匹配等问题,通过查阅资料,小有收获,汇总如下: ODBC:开放数据库互连, ...

  3. NOIP知识汇总及模板整理

    排序 求逆序对 NOIP2013火柴排队 洛谷 P2309 loidc 卖卖萌 二分 牢记二分姿势 前缀和及差分优化 NOIP2012借教室差分优化 贪心 洛谷 P3093 牛奶调度 HDU 5500 ...

  4. session相关知识的收集于整理

    Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间以及如果需要的话,可能还有一定的操作空间.具体到Web中的Session指的就是用户在浏览 ...

  5. 磁盘阵列相关知识汇总

    RAID基本知识 RAID 磁盘阵列(Redundant Array of Independent Disks)简单的解释,就是将N台硬盘透过RAID Controller(分Hardware,Sof ...

  6. xserver相关知识汇总

    本文主要是从以下几个方面介绍xorg-xserver 相关的知识  1.linux系统图形界面框架 2.xserver 和x client启动过程 3.图形2d,3d加速原理简介 4.xserver主 ...

  7. 自定义注解 相关知识汇总(转)

    之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注 ...

  8. CSP-J CSP-S初赛相关知识汇总

    [计算机科学速成课][40集全/精校] - Crash Course Computer Science [计算机科学速成课][40集全/精校] - Crash Course Computer Scie ...

  9. Mybatis相关知识汇总

    1.#{}和${} 在mybatis中#{}与${}的区别 先来看两个例子,假设在数据库中有一个name字段,它的类型是varchar,当通过这个字段进行查询语句时,在xml文件中可以使用where ...

最新文章

  1. 经典C语言程序100例之四七
  2. jq关于对象类型的判断
  3. ASP .NET MVC 之Entity Framework入门教程及源码
  4. getline()函数
  5. 监控openfire数据
  6. 蓝桥杯2014c++真题:扑克序列(next_permutation)
  7. linux安装java、配置 jmeter
  8. 软件测试常见Bug清单
  9. 【游戏】[C++] 贪吃蛇控制台版
  10. hua图软件 mac_10款Mac上设计师必备的设计绘图工具推荐和下载 | 玩转苹果
  11. Wps开发工具-宏的使用
  12. web前端开发面试题(七)
  13. 计算机应用基础(实践)(00019),自学考试公共实践课程《00019计算机应用基础(实践)》上机考核大纲...
  14. echarts 饼图文字图例多种颜色
  15. 自适应辛普森(Simpson)积分
  16. 启动Activity的流程(Launcher中点击图标启动)
  17. 数据库原理 头歌实训 数据库常用对象
  18. jy-12-SPRINGMYBATIS02——云笔记09-刘苍松
  19. ASP.NET程序设计教程(C#版)——学习心得
  20. WLAN——一篇让你从0到1了解无线局域网的文章

热门文章

  1. HTML的相关路径与绝对路径的问题---通过网络搜索整理
  2. (读书随笔)接口和抽象类的一些区别总结
  3. C# 2.0 锐利体验
  4. XCTF-Web-高手区-easytornado
  5. Windows同时安装Python2和Python3
  6. android点击按钮底部暗影,android – 圆形按钮,像5.0 FAB一样的阴影
  7. python mock_Python中使用mock.Mock()进行mock测试
  8. 获取URL中 后面的参数值
  9. nodejs模块导入导出
  10. JavaScript排序算法——插入排序算法