第1章 初见竞赛
随着互联网时代的到来,以及计算机硬件性能的提升,人工智能在近几年可以说是得到了爆发式的增长。互联网时代带来了大量的信息,这些信息是名副其实的大数据。另外,性能极佳的硬件也使得计算机的计算能力大大增强,这二者结合到一起,人工智能的蓬勃兴盛就变成了自然而然的事情。机器学习作为一种传统的、可解释性较强的算法,在人工智能三驾马车之算法中也占有一席之地。本书几经商榷,最终定名为《机器学习算法竞赛实战》,意在帮助机器学习初学者通过实战的方法从虽然优美但是略显枯燥的各种公式和理论当中脱离出来,感受机器学习在实际应用中的奥秘,而竞赛则是一种最特殊的实战。
之所以强烈推荐用竞赛作为机器学习实战的重要方式,是因为它实在是一个快速入门机器学习的极佳方式。对于初学者来说,他们的水平并不足以支撑他们直接进到企业接触实际的应用场景,而从书里得来的知识终究有些浅薄。提起竞赛,大家总是不免会想起高中时期的各种数学、物理、化学竞赛,这些竞赛门槛极高且国内国外都有,能拿到好名次的同学甚至能够直接保送国内外知名院校,因此竞赛二字总有一种令人望而生畏的感觉。但是近几年,人工智能的兴起催生出的各种算法竞赛则相对友好许多,也有意思许多。在时代的洪流之下,各行各业都在寻求生存之道,利用先进的技术完成转型则是一个很好的办法,有些企业就开始寻求人工智能的助力,开始向社会征求优秀的算法解决方案;此外,在学术领域的研究者们也渴望获得企业的场景和数据用于算法研究,这就催生出了各种竞赛平台。本书主要给读者介绍机器学习相关算法的竞赛经验。
对于有志于进军机器学习相关领域从事研究或者相关工作的初学者来说,竞赛是性价比极高的一个实战选择,可以说是零门槛,任何人都能参加。当然,一般主办方自己的员工是不允许参赛的,即使参赛,也不能参与排名。各种各样的竞赛可以说能够覆盖很多行业的典型应用场景,让参赛者不仅能够得到实战的锻炼,也能体会到机器学习在各个行业下沉应用带来的魔力,甚至还能在竞赛中见到很多行业大佬,结交一些志同道合的朋友。
本章主要从竞赛平台、竞赛流程以及竞赛类型这三个部分给大家做竞赛的相关介绍。1.1 节旨在介绍国内外知名的算法竞赛平台,以帮助读者快速了解竞赛渠道。1.2 节则讲述了完成一次机器学习算法竞赛的大致流程,以及每个模块的功能和作用,更详细的内容会在第2章到第6章中给出。1.3 节则会为读者介绍常见的竞赛类型,帮助读者了解机器学习算法竞赛适用的场景以及业界需求。
1.1 竞赛平台
我们参加的各种竞赛都是由大大小小的竞赛平台发布的,如国际的 Kaggle 和国内的阿里云天池竞赛平台,你可以在这些平台上找到自己擅长或喜欢的赛题。
1.1.1 Kaggle
机器学习领域的大牛吴恩达老师曾经讲过,机器学习在大多数时候就只是数学统计,数据相关的特征工程直接决定了模型的上限,而算法只是不断地去逼近这个上限而已。在机器学习领域,有一个十分生动的比喻,建模的过程就好比做饭,数据代表食材,算法则代表烹饪过程,最终饭菜的可口程度就是模型的效果。观看众多的美食影像,比如央视著名的美食纪录片《舌尖上的味道》《风味人间》等可以发现,这些影像都用众多的篇幅来讲述如何获取新鲜食材,而且古话里也讲巧妇难为无米之炊,由此可见食材的重要性。类比到机器学习算法竞赛,数据的重要性不言而喻,这也就是下面将介绍的国际竞赛平台 Kaggle 对自身的定位:数据科学之家。
打开 Kaggle 的网站首页,点击上方的 Compete,出现的界面如图1.1所示,左侧边栏除 Home和More 外有 5 个主要部分,即 Compete(竞赛单元)、Data(数据集)、Code(代码笔记)、Communities(社区讨论)以及 Courses(在线课程)。作为全世界最受欢迎的数据科学竞赛网站,其首页也介绍了这里你可以找到完成数据科学工作需要的所有数据与代码。截至 2020年10月5 日,这里已经有 50 000 份以上的数据集以及超过 400 000 个公开代码笔记。本书将着重介绍 Kaggle 的竞赛单元。点击 Compete,这里从上到下罗列着历史上所有进行过的竞赛,最上面那部分永远都存在着正在进行的各种竞赛,随便点开其中一个,同样可以看见竞赛的相关信息,大致有 Overview(概况)、Data(数据)、Code(代码笔记)、Discussion(社区讨论)、Leaderboard(排行榜)、Rules(竞赛规则)等。接下来,我们将以竞赛 Microsoft Malware Prediction 为例介绍一场竞赛的主要内容,其赛题主页见图1.2。
图1.1 Kaggle 页面
图1.2 Microsoft Malware Prediction 赛题主页
- Overview。即概况,这里会简要介绍这场竞赛,其中包括四个部分:Description(描述)、Evaluation(评分)、Prizes(奖项)和 Timeline(时间轴)。
- Description:竞赛的背景介绍以及主办方信息。竞赛 Microsoft Malware Prediction 中写到,恶意软件致力于规避传统的安全措施。一旦计算机受到恶意软件的感染,犯罪分子就会从很多方面伤害消费者和企业。微软拥有超过 10 亿的企业和消费者客户,所以非常重视这个问题,并且投入了大量资金来提高安全性。作为其整体安全策略的一部分,微软正在挑战数据科学界开发技术,以预测一台机器是否很快会受到恶意软件的攻击。与之前的恶意软件挑战(Malware Challenge,2015)一样,微软正在向 Kaggle 提供一个前所未有的恶意软件数据集,以鼓励其在预测恶意软件的有效技术方面取得开源进展。你能帮助保护超过 10 亿台机器不受损害吗?
- Evaluation:这里会列出本次竞赛的评判标准以及提交文件的格式,竞赛 Microsoft Malware Prediction 采用的是预测概率与真实标签的 ROC 曲线下面积(即 AUC)作为模型得分,因此本次竞赛是一个二分类问题。
- Prizes:这里展示了本次竞赛的总奖金是25 000美元,其中冠军的奖励 12 000美元几乎占了一半。通常来说,25 000美元是Kaggle 有奖竞赛里面比较常见的金额,多的能有 100 000美元。需要注意的是,这个竞赛对获奖者会有一定的要求,竞赛结束后获奖者需要在规定时间内提交建模方案文档,且不允许微软内部员工参赛。这些基本上也是大多数竞赛会要求的。
- Timeline:主要对竞赛的时间线进行介绍,比较关键的是组队截止时间和提交截止时间。一般竞赛周期在两个月到三个月之间,合理安排时间是非常必要的。
Data。了解了竞赛的背景与任务之后,参赛者就可以开始熟悉数据了,通常的数据格式都会是CSV 宽表形式。Data 部分有个单独的 Data Description,这里通常会给出所有表格的数据信息,包括采集来源、任务说明以及详细的各个字段含义等。以竞赛 Microsoft Malware Prediction 为例,其 Data Description 如下。
这场竞赛的目标是根据一台 Windows 机器的不同特性,预测它被各种恶意软件家族感染的概率。主办方结合微软的端点保护解决方案——Windows Defender 收集的心跳和威胁报告,生成包含相关属性和机器感染的遥测数据集。此数据集中的每一行各对应一台机器,由
MachineIdentifier
唯一标识。HasDetections
则是机器的标签,表明是否在机器上检测到了恶意软件。参赛者需要利用 train.csv 中的信息和标签训练集,预测 test.csv 中每台计算机的HasDetections
值。用于创建此数据集的采样方法旨在满足某些业务限制,包括用户隐私以及机器运行的时间段。检测恶意软件本质上是一个时间序列预测问题,但由于引入新机器、在线和离线机器、接收补丁的机器、接收新操作系统的机器等,它变得更加复杂。而这里提供的数据集已经大致按时间划分好,以上提到的复杂性和抽样要求意味着你可能会看到自己的交叉验证、公开榜和私人榜单分数不完全一致!此外,这个数据集并不能代表微软客户的机器,因为它是经过抽样的,包含更大比例的恶意软件机器。参赛者在参加竞赛时首先应该做到的就是熟悉题目与数据,这里面往往会包含很多重要的细节信息。拿上面的题目为例,数据看上去非常简单,主办方已经分清楚了训练集与测试集、标准的特征字段与标签字段。赛题任务也很明确,就是预测机器是否会被恶意软件感染。但不可忽视的一点是介绍中提到的,这个题目本质上是一个时间序列预测问题,训练集与测试集只是大致按照时间进行了划分,而为了突出恶意软件,机器更是对正样本进行了一定的升采样。因此,这种复杂性与抽样性会给建模带来极大的不确定性,导致交叉验证、公开榜和私人榜单分数的上下波动不会完全一致,这一点在竞赛结束后的私人榜单上就有所体现,相比公开榜单,其排名波动异常剧烈。
Code。这部分是本次竞赛的开源社区所在,Kaggle 能成为全球最大的数据竞赛平台之一,其开源的特性与讨论的氛围功不可没。在这里,你可以看到各式各样的数据探索(EDA)、特征工程、建模方法以及截然不同的代码风格与个人偏好,有的代码标题下方甚至会显示本代码在榜单上的得分成绩。在这里,参赛者可以尽情学习各种工具和代码写法,为了达成同样的目的,参赛者也会在这里发现更为简洁、优雅、快速的实现方式,同时可以将各种建模方法进行融合,博采众长。甚至竞赛圈里流传着:只要开源融合得好,得一块银牌不是问题。
- Discussion。和承担代码笔记功能的 Code 不同,Discussion 是参赛者之间真正交流讨论的地方,这里代码很少,有各种 QA(问答)以及对赛事的理解、发现。在这里参赛者可以自由地和全世界的数据科学爱好者共同讨论竞赛的相关心得,甚至是对理论的探索验证,可以见到各种 Master 乃至 Grandmaster 的身影,他们之间的互动也十分精彩。
- Leaderboard。用于展示排行榜,所有成功提交过结果文件的参赛者都可以在这里找到自己的位置。榜单实时刷新,对于争分夺秒挠破头皮的参赛者来说,可以说十分刺激。Kaggle 的竞赛通常分为 Public Leaderboard和Private Leaderboard,即竞赛圈子里常说的 A 榜和 B 榜。这也展现了机器学习领域中非常重要的一个概念,就是模型泛化性。实时榜单的存在虽然方便了参赛者,使他们可以不停地验证自己的想法,并对比出不同方案的得分,但这只是在公开榜上的成绩。机器学习建模很注重的一点就是模型的泛化性能,也可以说是它的健壮性,健壮性强的模型才可以在未来的预测中始终保持良好的效果,这对于实际应用来说非常重要,因此才有了 A 榜、B 榜这样的划分。一般来讲,把同一批数据切分成两份,一份用来评估 A 榜分数,另一份用来评估 B 榜分数。参赛者通常需要在竞赛的第一阶段不断根据 A 榜的得分来修正并改善建模方案,最后有两次机会可以选择用于计算 B 榜得分的结果文件,最终排名依据的是B 榜得分。机器学习建模的泛化性往往是一个难点、痛点,对于有些竞赛,其 A 榜、B 榜的排名可以说会发生翻天覆地的变化,经常会有参赛者的模型过拟合 A 榜,也就是模型会对 A 榜以外的数据表现得十分差劲,这也是大家有时会将机器学习等人工智能建模称为丹炉炼丹或者玄学的原因所在。
- Rules。这部分给出了本次竞赛的相关规则,是比 Overview 部分更加详细的补充,通常需要关注其中几个重要的时间点,比如竞赛开始时的 A 榜评测开放时间、队伍合并的截止时间以及 B 榜的切换时间。此外,还有对队伍人数、队伍提交总次数的限制,关于竞赛作弊方式的判定以及其他不允许发生的行为等。建议参赛者不仅要熟悉竞赛背景、竞赛内容,更要对竞赛规则了如指掌,以免不小心违反竞赛规则而导致努力白费。
1.1.2 天池
天池是国内较大的大数据众智平台,面向社会开放高质量脱敏数据集(阿里数据及第三方授权数据)和计算资源,吸引全球高水平人才创造优秀解决方案,有效帮助行业、政府解决业务痛点,并为企业招聘输送人才。作为中国 AI 产业的排头兵,天池提供集品牌、生态、人才、算力为一体的数据智能解决方案,为产业创造价值。2014 年至今,天池已成功运作 400 余场高规格数据类竞赛,覆盖全球 98 个国家和地区的 60 万数据开发者。天池平台上的竞赛课题以解决实际场景中的业务痛点为主,实战性和应用性极强,除了本书涉及的机器学习算法竞赛外,还有创新应用大赛、程序设计大赛等,奖励也非常丰厚。天池大数据竞赛平台见图1.3。
图1.3 天池大数据竞赛平台
注册
和大多数的竞赛网站一样,为了防止建立小号等作弊行为,保证比赛公平、公正,天池等平台都需要通过邮箱或者手机号注册,并且需要上传个人证件进行实名认证。
赛制
天池同样由赛题介绍、开源社区等板块组成,也都设有 A 榜、B 榜。和 Kaggle 不同的是,天池通常会设置初赛和复赛,且各自有 A 榜、B 榜。天池的 B 榜通常是换数据测试,并且会持续几天,因此相比于 A 榜,它只是时间上有所缩短,而 Kaggle 的测试数据是预先全部给出,只是在评分的时候只计算 A 榜部分,最后选定两个作为 B 榜计算的结果文件。此外,天池在初赛,也就是离线赛阶段,是固定时间点评测;在复赛,也就是平台赛阶段,选手在本地调试算法并完成模型训练,提交推断过程的 Docker 镜像,由镜像产生预测结果,将会进行实时评测。天池也会限制参赛者每一天的提交次数,限制次数一方面是为了缩短不同参赛者的资源配置之间的差距,防止有些参赛者凭借其强大的计算资源获取不当优势,另一方面是为了避免参赛者过多地依赖于测试结果进行建模,导致模型陷入过拟合的泥沼,使得模型的泛化性较弱,做许多无用功。
积分
天池设计有积分规则,根据积分或者条件为参赛者设计了五个等级称号,从低到高分别是数据新手、数据极客、数据大神、数据科学家以及数据大师,天池会显示出积分排名前一百的选手,这也是天池的一个特别做法。其他各个竞赛平台基本只显示排行榜的前一百名。
1.1.3 DF
DF(DataFountain)是CCF(即中国计算机学会)指定的专业大数据及人工智能竞赛平台,与学术界联系紧密。DF 平台按照技术(比如数据挖掘、自然语言处理和计算机视觉等)以及行业(比如金融、医疗、互联网、安全、电力、娱乐、交通、智慧城市、通信、工业、零售、社会、汽车、教育、物流、地产、大数据等)对竞赛进行区分,将学术界和工业界紧密联系在一起,虽然奖金金额可能比不上大平台,但其对行业的细分理解以及落地场景的多样化还是非常诱人的。
1.1.4 DC
DC 竞赛平台的全名为 DataCastle,即数据城堡,是一家坐落于成都的公司。其网站架构和竞赛举办方式与 Kaggle、天池相似,独特的一点在于其专门设有政企办赛的部分。通常,参赛者可以在 DC 平台上看见许多由政府、国企、央企扶持的相关创业竞赛项目。除了本书专注的算法竞赛之外,还有创意赛等。
1.1.5 Kesci
Kesci 的中文名为和鲸社区,是每年中国高校计算机大赛——大数据挑战赛的战略合作平台。相比于 DF 平台和 DC 平台,Kesci 还能提供在线的 notebook 训练环境,这点对一些没有足够硬件资源的参赛者来说比较友好。
1.1.6 JDATA
JDATA 智汇平台是京东旗下的竞赛平台,其板块设置大多和天池、Kaggle 类似,只是细节方面有所不同。每年的春季是京东自家出赛题的高峰时段。有意思的是,京东的竞赛主要涉及电商以及物流,它们通常会自定义一些评价指标,参赛者在拿到宽表数据之后需要自行考虑建模方案,包括搭建训练集与测试集、选取样本标签等,数据质量和赛题难度都极高。当然,奖金也不少,而且在校大学生还有获得校招绿色通道的机会。
1.1.7 企业网站
除了上述列举的国内外主流竞赛平台外,有些企业会自己举办竞赛,他们不与平台合作,而是自己单独建立一个简易网站,比如腾讯的社交广告算法大赛,虽然只是有个网站,但此竞赛依然十分火爆。此外,还有 FlyAI、AI Challenger 等。参赛者不必面面俱到地了解,可以通过关注一些公众号来了解赛事的最新相关信息,如 Coggle 数据科学、Kaggle 竞赛宝典、麻婆豆腐 AI 等。
1.2 竞赛流程
要想成功完成一次竞赛,一共需要几个步骤呢?答案是3 个。首先下载数据,其次用代码运行出结果,最后提交结果。当然,这只是仿照把大象关进冰箱需要几步编的一个笑话,搏君一笑而已。机器学习算法竞赛也逃脱不了所谓的套路,我们通过总结大量的实战经验后,将完成一次竞赛的整个流程大致分为 5 个部分,即问题建模、数据探索、特征工程、模型训练、模型融合,如图1.4所示。当然,赛前还有一些准备工作要做,比如注册账号、完善个人信息甚至实名认证,然后点击想参加的竞赛进行报名。本节只简单介绍各个竞赛流程,详细内容会在本书第2章到第6章中讲到。
图1.4 竞赛流程
1.2.1 问题建模
我们相信大家都还记得高考前期,老师们耳提面命地强调审题的重要性,理解题目永远是最先也是最重要的一步。准确理解题目想要表达的意思能够避免我们走许多弯路。在机器学习的问题建模中,并不是所有数据都是特征加标签这种已经可以直接加入模型训练的形式,很多时候还需要分析数据进而抽象出建模目标与方案。虽然通常来说竞赛的目标明确,但也不是所有竞赛的数据都是那种可以直接加入训练的形式。有些竞赛(如 JDATA 智汇平台)就常常会有一些不同于一般分类和回归评价指标的评估方式,参赛者往往需要根据对赛题的理解自行利用主办方提供的数据构造训练集与测试集,这种竞赛极大地考验参赛者的问题建模水平,这也是这类竞赛的难点所在。此时问题建模方式的选取在很大程度上影响着参赛者的成绩好坏。
1.2.2 数据探索
数据探索是机器学习领域最重要的概念之一,习惯上被大家称为 EDA(Exploratory Data Analysis,探索性数据分析)。在理解赛题并大致知道了问题建模的方式之后,就需要结合对赛题背景业务的理解去看看数据长什么样子、数据是否和描述相符、数据包含哪些信息、数据质量如何等。首先,要对数据有一个清晰的认知,主要是宽表中各个字段的取值含义、范围和数据结构等。然后更深层次的是要结合标签分析特征的分布状态、训练集与测试集的同分布情况、特征之间的业务关联以及隐含信息表征等。总的来说,数据探索是承上启下的一步,可以帮助参赛者更好地理解问题建模,并为接下来将进行的特征工程做好准备。
1.2.3 特征工程
同 EDA 一样,特征工程(Feature Engineering)也是机器学习领域一个重要的概念,由其命名就可以看出这是一项可以被称为工程的模块。机器学习泰斗吴恩达老师在他著名的斯坦福大学 CS229 机器学习课程上曾经说过,机器学习大多数时候是在进行特征工程,特征决定了机器学习预测效果的上限,而算法只是不断地去逼近这个上限而已,由此可见特征工程的重要性。事实上,无论是在竞赛中还是在实际应用中,特征工程都是花费时间最多的模块,会占去建模者的大部分精力。
1.2.4 模型训练
根据问题建立好模型方案后,根据业务理解进行相关的数据探索,继而逐步完善特征工程,就可以得到标准的训练集与测试集结构,接下来就可以考虑如何进行模型训练了。在一般的机器学习算法竞赛中,参赛者大多偏爱 GDBT 类的树模型。当然,这也是由于它们的效果确实好,常使用的树模型主要有 XGBoost和LightGBM,这两种模型都有 scikit-learn 的接口函数,非常便于使用。此外,有时参赛者需要用到 LR、SVM和RF 等算法,有时需要用到 DNN、CNN、RNN 等深度学习模型以及它们的衍生模型,以及广告领域流行的 FFM 等。如果说之前的步骤花费的是参赛者本人的时间与精力,那么这一步则主要依赖于参赛者的计算资源。当然,如果不是特别大量级的数据,模型训练一般会很快。模型训练这个模块除了选择合适的模型之外,还有一部分需要花时间的就是参数调优。虽然只要参数不是设置得很离谱,效果都差别不太大,但对于众多参赛者来说,即使是一点点的成绩提升,也可能意味着排名的上升。
1.2.5 模型融合
经过前期烦琐艰辛的各种尝试之后,终于可以来到喜闻乐见的模(寻)型(觅)融(队)合(友)阶段了。每一种算法都有其自身的优势和局限性,扬长避短,综合各个算法的优势可以使得模型的效果更好。模型融合有许多种办法,诸如 Stacking、加权投票等,第6章会详细介绍这部分内容。之所以将模型融合称作寻觅队友,是因为在竞赛当中,不同参赛者之间的个人差异很大,涉及问题建模、特征工程、模型训练等流程时都会有差异,这就导致不同参赛者之间的方案存在着巨大差异,而差异带来的模型融合效果却是极佳的,并且差异越大,效果提升就越大。这里也建议各位参赛者如果没有特别熟悉的队友,可以先自己做,一个人走完全部流程,这也是对自己的一种锻炼,到后期实在没有想法了,就可以考虑找成绩相近的参赛者进行组队。团队力量在竞赛当中的重要性不言而喻,而且后期组队相当于队伍前期是各自提交结果的,变相意味着多了验证思路的机会。合理地利用规则进行竞赛是被允许和提倡的。
1.3 竞赛类型
各种眼花缭乱的竞赛令人跃跃欲试,门类众多的数据竞赛可以满足众多参赛者的不同需求,同时也促进 AI + 行业的发展,让社会各界积极探索人工智能。因此,有必要介绍一下当今常见的数据竞赛类型。下面将分别从数据类型、任务类型以及应用场景这三个方面展开。
1.3.1 数据类型
人工智能领域大致可以分为计算机视觉(CV)、自然语言处理(NLP)和数据挖掘(DM)三个主要方向。从数据类型的角度看,又可以对三者进行简单区分,计算机视觉领域多是处理图像方面的数据,当然这其中也包括视频;自然语言处理多是文本数据,涉及各种语言的分词等。这二者都是近几年随着计算机硬件性能的不断提升,以及宽带网络的快速发展而得到了学术界以及工业界的共同关注。Kaggle 上面的竞赛会在题目下方给出数据类型,如图片数据、音频数据、文本数据、宽表数据等,本书将着重介绍传统宽表数据类型的相关竞赛。在传统宽表的数据中,通常匹配有样本的唯一 id 索引以及特征列。根据含义,特征又可分为类别特征(如用户性别)和数值特征(如年龄、身高、体重等)。上述这些特征的形式都是单值特征,此外还有多值特征,如用户的兴趣爱好这列可以同时包含健身、跑步和摄影等。针对这种特殊的多值特征,我们有特别的处理技巧,这部分也将在第13章中为大家进行详细讲解。
1.3.2 任务类型
机器学习相关竞赛以算法为主,偶尔也有方案创新设计赛等,本书将专注于讲解机器学习算法相关竞赛,主要是监督学习的相关内容,即根据任务要求,通过已有的、带标签的训练集数据进行建模,从而对测试集数据进行预测并给出相应标签的结果,从而进行得分评价。任务类型按照问题类型大致可分为分类以及回归,第2章会具体给出相应任务的评价指标。
1.3.3 应用场景
提起应用场景,我们自然而然想到的是机器学习在各个行业的应用、行业的需求和痛点。纵观各大竞赛平台,涉及的主要有医学、制造业产品线、金融、电商、互联网等。其中互联网行业用户数据的丰富性和多样性,以及较少遇到的如医学方面的伦理道德等挑战产生出了很多应用场景,如广告、搜索和推荐等,都是当今人工智能涉足较多的场景。
1.4 思考练习
- 请在 Kaggle、天池、DF、DC、Kesci 以及 JDATA 等网站分别注册账号并浏览,体会本章介绍的内容。
- 完整的竞赛流程包括哪几个主要部分,每个部分在流程中的角色是怎么样的?
- 以日常生活接触到的场景为例,列举 5 项可能使用了机器学习算法的应用。