Kaggle-之书-一-

98 阅读1小时+

Kaggle 之书(一)

原文:annas-archive.org/md5/ef46492e324ad2e4ffd771274a9405da

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

在 Kaggle 上竞争了超过十年,我们俩在许多竞赛中都经历了高潮和低谷。我们经常发现自己将精力重新集中在与 Kaggle 相关的不同活动上。随着时间的推移,我们不仅致力于竞赛,还致力于根据数据科学市场的需求和我们的职业抱负创建内容和代码。在我们旅行的这个阶段,我们觉得我们共同的经验和对竞赛的热情真的可以帮助那些刚刚开始或希望获得灵感的参与者,帮助他们掌握他们需要的核心专业知识,以便他们可以开始自己的数据科学竞赛之旅。

我们随后决定有目的地编写这本书:

  • 在一个地方提供成为竞争者并解决您在 Kaggle 和其他数据科学竞赛中可能遇到的大部分问题的最佳建议。

  • 提供足够的建议,使任何人在任何 Kaggle 学科(竞赛、数据集、笔记本或讨论)中至少达到专家级别。

  • 提供关于如何从 Kaggle 中学习最多,并利用这一经验在数据科学领域实现职业发展的建议。

  • 通过采访 Kaggle 大师和特级大师,收集关于参与竞赛经验的最多视角,并将他们的故事汇集在一个来源中。

简而言之,我们编写了一本展示如何成功参与竞赛并充分利用 Kaggle 提供的一切机会的书籍。本书还旨在作为一本实用的参考书,通过其精选的许多难以在互联网或 Kaggle 论坛上学习和找到的竞赛技巧和窍门,为您节省时间和精力。然而,本书不仅限于提供实际帮助;它还希望帮助您了解如何通过参与竞赛来提升您的数据科学职业生涯。

请注意:本书不会从基础知识教授数据科学。我们不详细解释线性回归、随机森林或梯度提升如何工作,而是如何以最佳方式使用它们,并在数据问题中获得最佳结果。我们期望读者具备扎实的基础和至少对数据科学主题和 Python 使用的基本熟练度。如果您仍然是数据科学初学者,您需要用其他关于数据科学、机器学习和深度学习的书籍来补充本书,并在在线课程上进行培训,例如 Kaggle 本身提供的课程或 edX 或 Coursera 等 MOOCs 提供的课程。

如果您想以实际的方式开始学习数据科学,如果想要挑战自己解决棘手和有趣的数据问题,并同时建立一个与您一样对数据科学工作充满热情的杰出数据科学家网络,这本书确实适合您。让我们开始吧!

本书面向的对象

在本书完成时,有 96,190 名 Kaggle 新手(刚刚在网站上注册的用户)和 67,666 名 Kaggle 贡献者(刚刚填写了个人资料的用户)参加了 Kaggle 竞赛。本书是为他们所有人以及任何想要打破僵局并开始参加 Kaggle 竞赛并从中学习的人所写的。

本书涵盖的内容

第一部分:竞赛简介

第一章介绍 Kaggle 和其他数据科学竞赛,讨论了竞技编程如何演变为数据科学竞赛。它解释了为什么 Kaggle 平台是这些竞赛最受欢迎的网站,并为您提供了关于其工作方式的想法。

第二章使用数据集组织数据,向您介绍 Kaggle 数据集,这是平台上的标准数据存储方法。我们讨论了设置、数据收集以及在 Kaggle 上的工作中的应用。

第三章使用 Kaggle 笔记本工作和学习,讨论了 Kaggle 笔记本,这是基准编码环境。我们谈论了笔记本使用的基础知识,以及如何利用 GCP 环境,以及如何使用它们来构建您的数据科学作品集。

第四章利用讨论论坛,使您熟悉 Kaggle 上的主要沟通和思想交流方式——讨论论坛。

第二部分:提高竞赛技能

第五章竞赛任务和指标,详细说明了某些类型问题的评估指标如何强烈影响您在数据科学竞赛中构建模型解决方案时的操作方式。本章还讨论了 Kaggle 竞赛中可用的各种指标。

第六章设计良好的验证方法,将向您介绍数据竞赛中验证的重要性,讨论过拟合、震荡、泄露、对抗验证、不同类型的验证策略以及最终提交的策略。

第七章表格竞赛建模,讨论了表格竞赛,主要关注 Kaggle 的最新现实——表格游乐场系列。表格问题是大多数数据科学家的标准实践,从 Kaggle 中可以学到很多东西。

第八章超参数优化,探讨了如何在 Kaggle 竞赛的压力和资源稀缺的情况下,如何将交叉验证方法扩展到寻找模型的最佳超参数——换句话说,那些在私有排行榜上以最佳方式泛化的参数。

第九章使用混合和堆叠解决方案进行集成学习,解释了针对多个模型(如平均、混合和堆叠)的集成技术。我们将为您提供一些理论、一些实践和一些代码示例,您可以在 Kaggle 上构建自己的解决方案时作为模板使用。

第十章计算机视觉建模,我们讨论了与计算机视觉相关的问题,这是人工智能中最受欢迎的主题之一,在 Kaggle 上尤其如此。我们展示了构建图像分类、目标检测和图像分割挑战解决方案的完整流程。

第十一章自然语言处理建模,专注于与自然语言处理相关的 Kaggle 挑战中经常遇到的问题类型。我们展示了如何构建针对开放域问答等流行问题的端到端解决方案。

第十二章模拟与优化竞赛,概述了模拟竞赛,这是一类在 Kaggle 上近年来逐渐流行起来的新型比赛。

第三部分:利用竞赛为你的职业生涯助力

第十三章创建你的项目和想法组合,探讨了通过在 Kaggle 本身和其他网站上以适当的方式展示你的工作来脱颖而出的方法。

第十四章寻找新的职业机会,通过讨论如何利用你在 Kaggle 上的所有经验来寻找新的职业机会,总结了 Kaggle 如何积极影响你的职业生涯。

为了充分利用本书

本书中的 Python 代码已被设计为在 Kaggle 笔记本上运行,无需在本地计算机上进行安装。因此,无需担心你有什么可用的机器或应该安装哪个版本的 Python 包。

你只需要一台可以访问互联网的电脑和一个免费的 Kaggle 账户。实际上,要在 Kaggle 笔记本上运行代码(你将在第三章中找到关于该过程的说明),你首先需要在 Kaggle 上开设一个账户。如果你还没有,只需访问www.kaggle.com并遵循网站上的说明即可。

我们在本书中链接到了许多我们认为你会觉得有用的不同资源。当被提及链接时,请探索它:你将找到可在公共 Kaggle 笔记本上重用的代码,或进一步的材料来阐述我们在书中讨论的概念和想法。

下载示例代码文件

本书代码包托管在 GitHub 上,网址为github.com/PacktPublishing/The-Kaggle-Book。我们还有其他来自我们丰富图书和视频目录的代码包,可在github.com/PacktPublishing/找到。查看它们吧!

下载彩色图像

我们还提供了一个包含本书中使用的截图/图表彩色图像的 PDF 文件。您可以从这里下载:static.packt-cdn.com/downloads/9781801817479_ColorImages.pdf

使用的约定

本书使用了一些文本约定。

CodeInText: 表示文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称。例如:“数据集将被下载到Kaggle文件夹中,作为一个.zip存档 – 解压后即可使用。”

代码块设置如下:

from google.colab import drive
drive.mount('/content/gdrive') 

任何命令行输入或输出都如下所示:

I genuinely have no idea what the output of this sequence of words will be - it will be interesting to find out what nlpaug can do with this! 

粗体: 表示新术语、重要词汇或您在屏幕上看到的词汇,例如在菜单或对话框中。例如:“写作时的具体限制是每个私有数据集100 GB,以及100 GB的总配额。”

进一步的说明、参考资料和链接到有用的地方如下所示。

技巧和窍门如下所示。

联系我们

我们欢迎读者的反馈。

一般反馈: 请发送电子邮件至feedback@packtpub.com,并在邮件主题中提及书籍标题。如果您对本书的任何方面有疑问,请通过questions@packtpub.com发送电子邮件给我们。

勘误: 尽管我们已经尽最大努力确保内容的准确性,但错误仍然可能发生。如果您在这本书中发现了错误,如果您能向我们报告,我们将不胜感激。请访问www.packtpub.com/submit-errata,选择您的书籍,点击勘误提交表单链接,并输入详细信息。

盗版: 如果您在互联网上以任何形式发现我们作品的非法副本,如果您能提供位置地址或网站名称,我们将不胜感激。请通过copyright@packtpub.com与我们联系,并提供材料的链接。

如果您有兴趣成为作者: 如果您在某个领域有专业知识,并且您有兴趣撰写或为书籍做出贡献,请访问authors.packtpub.com

分享您的想法

一旦您阅读了*《Kaggle 书籍*》,我们非常希望听到您的想法!请点击此处直接访问此书的亚马逊评论页面并分享您的反馈。

您的评论对我们和科技社区都至关重要,并将帮助我们确保我们提供高质量的内容。

第一部分

竞赛简介

第一章:介绍 Kaggle 和其他数据科学竞赛

数据科学竞赛已经存在很长时间了,随着时间的推移,它们经历了不断增长的成功,从一个小众的充满热情的竞争者社区开始,吸引了越来越多的关注,并达到了数百万数据科学家的更大受众。作为最受欢迎的数据科学竞赛平台 Kaggle 上的长期竞争者,我们多年来亲眼目睹并直接体验了所有这些变化。

目前,如果你在寻找有关 Kaggle 和其他竞赛平台的信息,你很容易找到大量的聚会、讨论小组、播客、访谈,甚至在线课程,这些课程解释了如何在这样的竞赛中获胜(通常建议你使用不同比例的毅力、计算资源和投入的时间)。然而,除了你现在正在阅读的这本书之外,你不会找到任何关于如何导航这么多数据科学竞赛以及如何从中获得最大利益的系统指南——不仅是在分数或排名方面,还包括专业经验。

在这本书中,我们不仅仅是要打包一些关于如何在 Kaggle 和其他数据科学竞赛中获胜或获得高分的提示,我们的意图是为你提供一份如何在 Kaggle 上更好地竞争并获得竞赛体验最大可能的指南,尤其是从你职业生活的角度。此外,书中还附有 Kaggle 大师和特级大师的访谈。我们希望他们能为你提供一些关于在 Kaggle 上竞争的具体方面的不同视角和见解,并激励你以测试自己和学习竞技数据科学的方式。

到这本书结束时,你将吸收我们从自己的经验、资源和竞赛中学到的知识,以及你需要为自己铺路学习和成长的一切,一场比赛接着一场比赛。

作为起点,在本章中,我们将探讨竞技编程如何演变为数据科学竞赛,为什么 Kaggle 平台是此类竞赛最受欢迎的网站,以及它是如何运作的。

我们将涵盖以下主题:

  • 数据科学竞赛平台兴起

  • 常见任务框架范式

  • Kaggle 平台和一些其他替代方案

  • Kaggle 竞赛的工作方式:阶段、竞赛类型、提交和排行榜动态、计算资源、网络等

数据科学竞赛平台兴起

竞技编程有着悠久的历史,始于 20 世纪 70 年代,当时是国际大学生程序设计竞赛ICPC)的第一轮。在最初的 ICPC 中,来自大学和公司的小型团队参加了一项比赛,要求使用计算机程序解决一系列问题(最初,参与者使用 FORTRAN 编程)。为了获得良好的最终排名,团队必须在团队合作、问题解决和编程方面展示出色的技能。

参加这样竞赛的热烈体验和站在招聘公司聚光灯下的机会为学生提供了充足的动力,这使得竞赛多年以来一直很受欢迎。在 ICPC 决赛中,有几位选手成为了知名人士:有 Facebook 前首席技术官和 Quora 创始人亚当·达格诺(Adam D’Angelo),Telegram Messenger 的联合创始人尼古拉伊·杜罗夫(Nikolai Durov),以及 Apache Spark 的创造者马泰伊·扎哈里亚(Matei Zaharia)。他们与其他许多专业人士一样,都分享了同样的经历:参加过 ICPC。

在 ICPC 之后,编程竞赛蓬勃发展,尤其是在 2000 年之后,远程参与变得更加可行,使得国际竞赛更容易进行且成本更低。大多数这些竞赛的格式相似:有一系列问题,你必须编写代码来解决它们。获胜者会获得奖品,同时也会让招聘公司或简单地成名。

通常,竞技编程中的问题范围从组合数学和数论到图论、算法博弈论、计算几何、字符串分析和数据结构。近年来,与人工智能相关的问题成功出现,特别是在KDD 杯(知识发现与数据挖掘竞赛)启动之后,该竞赛由计算机协会ACM)的特别兴趣小组SIG)在其年度会议期间举办(kdd.org/conferences)。

首届 KDD 杯比赛于 1997 年举行,涉及电梯曲线优化的直接营销问题,这开启了一系列持续至今的竞赛。您可以在www.kdd.org/kdd-cup找到包含数据集、说明和获奖者的存档。以下是撰写本文时的最新资料:ogb.stanford.edu/kddcup2021/。KDD 杯在建立最佳实践方面证明非常有效,许多发表的论文描述了解决方案、技术和竞赛数据集共享,这些都对许多从业者进行实验、教育和基准测试非常有用。

竞赛编程事件和 KDD 杯的成功案例激发了公司(如 Netflix)和企业家(如 Kaggle 的创始人安东尼·戈德布卢姆)创建第一个数据科学竞赛平台,公司可以在这些平台上举办难以解决的数据科学挑战,并可能从众包中受益。事实上,鉴于没有适用于数据科学中所有问题的黄金方法,许多问题需要耗时的方法,可以总结为尝试所有你能尝试的方法

事实上,从长远来看,没有任何算法能在所有问题上击败其他所有算法,正如大卫·沃尔珀特(David Wolpert)和威廉·麦克雷迪(William Macready)提出的**“无免费午餐”定理**所述。该定理告诉你,每个机器学习算法只有在它的假设空间包含解决方案时才会表现良好。因此,由于你事先无法知道某个机器学习算法是否最适合解决你的问题,你必须尝试它,直接在你问题上进行测试,以确保你正在做正确的事情。在机器学习中没有理论上的捷径或其他圣杯——只有经验实验才能告诉你什么有效。

更多细节,你可以查阅“无免费午餐”定理,以了解这一实际真理的理论解释。以下是 Analytics India Magazine 关于该主题的完整文章:analyticsindiamag.com/what-are-the-no-free-lunch-theorems-in-data-science/

在需要广泛测试算法和数据转换以找到最佳可能组合,但缺乏人力和计算机能力的情况下,众包证明是理想的。这就是为什么政府和企业会求助于比赛,以便在某些领域取得进展:

  • 在政府方面,我们可以引用 DARPA 及其围绕自动驾驶汽车、机器人操作、机器翻译、说话人识别、指纹识别、信息检索、OCR、自动目标识别等许多其他领域的众多比赛。

  • 在商业方面,我们可以引用 Netflix 这样的公司,它将比赛的成果委托给改进其预测用户电影选择的算法。

Netflix 比赛基于改进现有协同过滤的想法。其目的仅仅是根据用户对其他电影的评分来预测用户对电影的潜在评分,而不需要具体知道用户是谁或电影是什么。由于没有用户描述或电影标题或描述可用(所有这些都用身份代码代替),比赛要求参赛者开发智能方法来使用可用的过去评分。只有当解决方案能够将现有的 Netflix 算法 Cinematch 提升到一定阈值以上时,才会颁发 100 万美元的巨额奖金。

该比赛从 2006 年持续到 2009 年,最终获胜的是由多个先前比赛团队融合而成的团队:来自 Commendo Research & Consulting GmbH 的团队,包括安德烈亚斯·托舍尔迈克尔·耶雷尔,他们在 Kaggle 比赛中也相当知名;来自 AT&T 实验室的两名研究人员;以及来自 Yahoo!的两名研究人员。最终,赢得比赛需要如此多的计算能力和不同解决方案的集成,以至于团队不得不合并以保持竞争力。这种情况也反映在 Netflix 实际使用该解决方案上,Netflix 更愿意不实施它,而是简单地从中提取最有趣的见解来改进其现有的 Cinematch 算法。您可以在这篇 Wired 文章中了解更多信息:www.wired.com/2012/04/netflix-prize-costs/.

在 Netflix 比赛的最后,重要的是解决方案本身,因为 Netflix 的业务重点从 DVD 转向在线电影,该解决方案很快就被取代了。对于在协同过滤中获得巨大声誉的参与者,以及能够将其改进的推荐知识转移到新业务的该公司来说,真正的益处是从比赛中获得的见解。

Kaggle 比赛平台

除了 Netflix 之外,其他公司也从数据科学比赛中受益。名单很长,但我们可以引用一些例子,其中举办比赛的公司的报告显示从中获得了明确的好处。例如:

  • 保险公司 Allstate 能够通过涉及数百名数据科学家的比赛改进他们自己专家构建的精算模型(www.kaggle.com/c/ClaimPredictionChallenge)。

  • 作为另一个有详细记录的例子,通用电气通过类似的比赛(www.kaggle.com/c/flight)将预测航空公司航班到达时间的行业标准性能(通过均方根误差指标衡量)提高了 40%。

到目前为止,Kaggle 比赛平台已经举办了数百场比赛,这两个只是公司成功使用 Kaggle 的几个例子。让我们暂时从具体的比赛中退一步,谈谈 Kaggle 公司,这是贯穿本书的线索。

Kaggle 的历史

Kaggle 的起步是在 2010 年 2 月,归功于安东尼·戈德布卢姆,一位受过经济学和计量经济学学位训练的澳大利亚经济学家。在澳大利亚财政部和澳大利亚储备银行的研究部门工作后,戈德布卢姆在伦敦的《经济学人》国际时事、国际商业、政治和技术周刊实习。在《经济学人》杂志,他有机会撰写一篇关于大数据的文章,这激发了他建立一个竞赛平台的想法,该平台可以众包最佳分析专家来解决有趣的机器学习问题(www.smh.com.au/technology/from-bondi-to-the-big-bucks-the-28yearold-whos-making-data-science-a-sport-20111104-1myq1.html)。由于众包动态在这个平台商业理念中发挥了重要作用,他创造了名字Kaggle,这个名称通过押韵回忆了gaggle这个词,意为一群鹅,鹅也是该平台的象征。

在搬到美国硅谷后,他的 Kaggle 初创公司从知名风险投资公司 Khosla Ventures 和 Index Ventures 的一轮投资中获得了 1125 万美元的 A 轮融资。推出了第一批竞赛,社区规模扩大,一些最初的竞争者变得相当突出,例如澳大利亚数据科学家和企业家杰里米·豪沃德,他在 Kaggle 上赢得了几场比赛后,成为了公司的总裁和首席科学家。

杰里米·豪沃德在 2013 年 12 月辞去了总裁的职位,并成立了一家新的初创公司fast.aiwww.fast.ai),为程序员提供机器学习课程和深度学习库。

在当时,还有一些其他杰出的 Kagglers(这个名字表明了经常参加 Kaggle 举办的竞赛的参与者),例如杰里米·阿钦托马斯·德·戈多伊。在达到平台上的全球前 20 名排名后,他们迅速决定退休并创立了自己的公司,DataRobot。不久之后,他们开始从 Kaggle 竞赛中的最佳参与者中招聘员工,以便将最好的机器学习知识和实践融入到他们正在开发的软件中。如今,DataRobot 是开发 AutoML 解决方案(自动机器学习软件)的领先公司之一。

Kaggle 竞赛吸引了越来越多的观众的关注。即使是深度学习的“教父”杰弗里·辛顿,也在 2012 年参加了由默克公司主办的 Kaggle 竞赛(www.kaggle.com/c/MerckActivity/overview/winners),并赢得了比赛。Kaggle 也是弗朗索瓦·肖莱特奥托集团产品分类挑战赛www.kaggle.com/c/otto-group-product-classification-challenge/discussion/13632)期间推出他的深度学习包 Keras,以及田奇希格斯玻色子机器学习挑战赛www.kaggle.com/c/higgs-boson/discussion/10335)中推出 XGBoost,这是一种更快、更精确的梯度提升机版本的平台。

除了 Keras,弗朗索瓦·肖莱特还在 Quora 网站上提供了一份关于如何在 Kaggle 竞赛中获胜的最有用和最有洞察力的观点:www.quora.com/Why-has-Keras-been-so-successful-lately-at-Kaggle-competitions

通过多次尝试的快速迭代,以经验(而非理论)证据为指导,实际上这就是你所需要的全部。我们认为,赢得 Kaggle 竞赛的秘密并不比他在回答中指出的更多。

值得注意的是,弗朗索瓦·肖莱特还在 Kaggle 上举办了属于自己的竞赛(www.kaggle.com/c/abstraction-and-reasoning-challenge/),这被广泛认为是世界上第一个通用人工智能竞赛。

一场又一场的比赛,围绕 Kaggle 的社区在 2017 年增长到一百万,同年,在谷歌 Next 大会的演讲中,谷歌首席科学家李飞飞宣布谷歌 Alphabet 将收购 Kaggle。从那时起,Kaggle 成为了谷歌的一部分。

今天,Kaggle 社区仍然活跃并持续增长。在他的推文中(twitter.com/antgoldbloom/status/1400119591246852096),安东尼·戈德布卢姆报告说,除了参加比赛外,大多数用户还下载了公共数据(Kaggle 已成为一个重要的数据枢纽),在 Python 或 R 中创建了一个公共 Notebook,或在提供的课程中学习了一些新知识:

图 1.1:一个条形图显示了用户在 2020 年、2019 年和 2018 年使用 Kaggle 的情况

几年来,Kaggle 为其参与者提供了更多的机会,例如:

最重要的是,学习更多关于数据科学中涉及到的技能和技术细节。

其他竞赛平台

虽然这本书主要关注 Kaggle 上的竞赛,但我们不能忘记,许多数据竞赛是在私人平台或其他竞赛平台上举行的。实际上,你在这本书中找到的大部分信息也适用于其他竞赛,因为它们本质上都遵循相似的原则,参与者的好处也或多或少相同。

尽管许多其他平台仅限于特定国家或仅针对某些类型的竞赛进行本地化,为了完整性,我们将简要介绍其中一些,至少是我们有一些经验和知识的一些:

其他较小的平台包括来自瑞士洛桑联邦理工学院的 CrowdAI (www.crowdai.org/),InnoCentive (www.innocentive.com/),Grand-Challenge (grand-challenge.org/) 生物医学成像,DataFountain (www.datafountain.cn/business?lang=en-US),OpenML (www.openml.org/),等等。你总能在俄罗斯社区 Open Data Science (ods.ai/competitions) 找到大量正在进行的主要竞赛,甚至不时发现新的竞赛平台。

你可以在 mlcontests.com 网站上看到正在进行的竞赛概述,以及租用 GPU 的当前费用。该网站经常更新,是快速了解不同平台上的数据科学竞赛动态的便捷方式。

Kaggle 始终是你可以找到最有趣竞赛并获得最广泛认可的平台。然而,在它之外接受挑战是有意义的,我们建议当你找到一个符合你个人和职业兴趣的竞赛时,将其作为一种策略。正如你所看到的,除了 Kaggle 之外,还有很多替代方案和机会,这意味着如果你考虑更多的竞赛平台与 Kaggle 一起,你可以更容易地找到一个可能因为其专业或数据而引起你兴趣的竞赛。

此外,你可以在这些挑战中期待较少的竞争压力(因此排名更好,甚至可能赢得一些东西),因为它们不太为人所知且宣传较少。只需预期参与者之间的分享较少,因为没有任何其他竞赛平台像 Kaggle 一样拥有如此丰富的分享和网络机会。

介绍 Kaggle

到目前为止,我们需要更深入地了解 Kaggle 是如何运作的。在接下来的段落中,我们将讨论 Kaggle 平台及其竞赛的各个方面,你将了解在 Kaggle 竞赛中的体验。之后,我们将在本书的剩余章节中更详细地讨论许多这些话题,并提供更多建议和策略。

竞赛的各个阶段

Kaggle 上的竞赛被安排成不同的步骤。通过查看每个步骤,你可以更好地理解数据科学竞赛是如何运作的,以及你可以期待什么。

当竞赛启动时,社交媒体上通常会有一些帖子,例如在 Kaggle 的 Twitter 个人资料上,twitter.com/kaggle,宣布它,并且在竞赛页面上的 Kaggle 部分会出现一个新的标签页关于活跃竞赛www.kaggle.com/competitions)。如果你点击某个特定竞赛的标签页,你将被带到其页面。一眼就能看出,你可以检查竞赛是否有奖品(以及它是否颁发分数和奖牌,这是参与竞赛的次要后果),目前有多少团队参与,以及你还有多少时间来工作解决方案:

图片

图 1.2:Kaggle 上的竞赛页面

在那里,你可以首先探索概览菜单,它提供了以下信息:

  • 竞赛的主题

  • 其评估指标(你的模型将根据此进行评估)

  • 竞赛的日程安排

  • 奖项

  • 法律或竞争要求

通常时间表会被忽视,但它应该是您首先检查的事项之一;它不仅告诉您比赛开始和结束的时间,而且还会提供规则接受截止日期,这通常是在比赛结束前七天到两周。规则接受截止日期是您可以加入比赛的最后一天(通过接受其规则)。还有团队合并截止日期:您可以在该截止日期之前安排与另一位竞争对手的团队合并,但在此之后将不可能合并。

规则菜单也经常被忽视(人们只是跳到数据),但检查它很重要,因为它可以告诉您比赛的各项要求。从规则中您可以获得的关键信息包括:

  • 您是否有资格获奖

  • 您是否可以使用外部数据来提高您的分数

  • 您每天可以提交多少次(对您的解决方案的测试)

  • 您可以选择多少个最终解决方案

一旦您接受了规则,您可以从数据菜单下载任何数据,或者直接从代码菜单开始工作在Kaggle 笔记本(在线、基于云的笔记本),重用他人提供的代码或从头开始创建自己的代码。

如果您决定下载数据,也要考虑您有一个Kaggle API,它可以帮助您以几乎自动化的方式运行下载和提交。如果您在本地计算机或云实例上运行模型,这是一个重要的工具。您可以在www.kaggle.com/docs/api找到更多关于 API 的详细信息,您可以从 GitHubgithub.com/Kaggle/kaggle-api获取代码。

如果您仔细检查 Kaggle GitHub 仓库,您还可以找到他们用于在线笔记本的 Docker 镜像,Kaggle 笔记本:

图片

图 1.3:一个准备编码的 Kaggle 笔记本

在这个阶段,随着您开发解决方案,我们热切建议您不要独自一人继续,而是通过讨论论坛联系其他竞争对手,在那里您可以提出和回答与比赛具体相关的问题。通常您还会找到关于数据特定问题的有用提示,甚至有助于改进您自己解决方案的想法。许多成功的 Kagglers 报告说,在论坛上找到的想法帮助他们表现更好,更重要的是,他们更多地了解了数据科学中的建模。

一旦您的解决方案准备就绪,您可以根据比赛的规格将其提交给 Kaggle 评估引擎。一些比赛将接受 CSV 文件作为解决方案,而另一些比赛则要求您在 Kaggle 笔记本中编写代码并生成结果。您可以在整个比赛期间提交解决方案。

每次你提交一个解决方案后,排行榜会很快为你提供一个得分和你在竞争对手中的位置(等待时间取决于评分评估所需的计算)。这个位置只是一个大致的指示,因为它反映了你的模型在测试集的一部分,即公共测试集上的表现,因为你在竞赛期间的表现是公开的,以便让每个人都知道。

在竞赛关闭之前,每位参赛者可以选择他们用于最终评估的解决方案数量(通常是两个)。

图片

图 1.4:一个展示数据如何转化为公共和私人排行榜得分的图表

只有当竞赛关闭时,基于参赛者决定评分的模型,他们的得分才会被揭示在测试集的另一部分,称为私人测试集。这个新的排行榜,即私人排行榜,构成了竞赛的最终、有效得分,但其在排名上仍然不是官方和最终的。事实上,Kaggle 团队将花一些时间来检查一切是否正确,以及所有参赛者是否都遵守了竞赛规则。

经过一段时间(有时由于取消资格而导致排名变化),私人排行榜将变为官方和最终版,获胜者将被宣布,许多参与者将在竞赛讨论论坛上公布他们的策略、解决方案和代码。此时,取决于你检查其他解决方案并尝试改进自己的方案。我们强烈建议你这样做,因为这是 Kaggle 中另一个重要的学习来源。

竞赛类型及示例

Kaggle 竞赛根据竞赛类别进行分类,每个类别在如何竞争以及预期内容方面都有不同的含义。类别内部的数据类型、问题难度、奖金以及竞赛动态都相当多样,因此事先了解每个类别的含义非常重要。

这里是你可以用来筛选不同竞赛的官方类别:

  • 特色

  • 大师级

  • 年度竞赛

  • 研究

  • 招聘

  • 入门

  • 操场

  • 分析学

  • 社区

特色竞赛是最常见的一种类型,涉及赞助公司提出的与商业相关的问题以及给顶尖表现者的奖金。获胜者将授予其作品给赞助公司的非独家许可;他们必须准备一份关于其解决方案的详细报告,有时甚至需要参加与赞助公司的会议。

每次访问 Kaggle 时,都会有一些特色竞赛的例子。目前,许多竞赛都与将深度学习方法应用于非结构化数据(如文本、图像、视频或声音)的应用相关。在过去,表格数据竞赛很常见,即基于可以在数据库中找到的结构的化数据问题的竞赛。最初是通过随机森林,然后是使用巧妙特征工程的梯度提升方法,从 Kaggle 得出的表格数据解决方案确实可以改善现有的解决方案。如今,这些竞赛举办得越来越少,因为众包解决方案通常不会比一支优秀的数据科学家团队或甚至 AutoML 软件做得更好。鉴于更好软件和良好实践的普及,竞赛结果质量的提高确实微乎其微。然而,在非结构化数据领域,一个好的深度学习解决方案仍然可以产生重大影响。例如,预训练网络如 BERT 为许多著名的 NLP 任务基准带来了两位数的标准提升。

大师级竞赛现在较少见,但它们是私人的、仅限邀请的竞赛。其目的是为专家(通常是根据 Kaggle 奖牌排名被评为大师或特级大师的竞争者)创建仅针对他们的竞赛,基于他们在 Kaggle 上的排名。

年度竞赛是一年中的特定时期内总会出现的竞赛。在年度竞赛中,我们有圣诞老人竞赛(通常基于算法优化问题)和三月机器学习狂热竞赛,自 2014 年以来每年在美国大学篮球锦标赛期间举行。

研究竞赛意味着具有研究或科学目的,而不是商业目的,有时是为了服务于公共利益。这就是为什么这些竞赛并不总是提供奖品。此外,这些竞赛有时要求获胜者将他们的解决方案作为开源发布。

Google 过去发布过一些研究竞赛,例如Google 地标识别 2020 (www.kaggle.com/c/landmark-recognition-2020),其目标是标记图像中的著名(和不那么著名)地标。

想要测试潜在求职者能力的赞助商举办招聘竞赛。这些竞赛仅限于单人团队,并为排名靠前的竞争者提供与赞助商面试的机会作为奖品。如果竞争者希望在竞赛结束后被考虑联系,他们必须在竞赛结束时上传他们的简历。

招聘竞赛的例子包括:

入门比赛不提供任何奖品,但提供友好且简单的题目,让初学者熟悉 Kaggle 的原则和动态。它们通常是半永久性的比赛,其排行榜会不时更新。如果您正在寻找机器学习的教程,这些比赛是开始的好地方,因为您可以在一个高度协作的环境中找到许多 Kaggle 笔记本,这些笔记本展示了如何处理数据并创建不同类型的机器学习模型。

著名的正在进行中的入门比赛包括:

Playground比赛比入门比赛稍微难一些,但它们也是为了让参赛者学习并测试他们的能力,而不受完整 Featured 比赛的压力(尽管在 Playground 比赛中,竞争的激烈程度有时也可能相当高)。此类比赛的常规奖品只是周边产品(“我们都能得到的东西”的缩写,例如,例如,一个杯子、一件 T 恤或 Kaggle 品牌的袜子;参见www.kaggle.com/general/68961)或一点钱。

一个著名的 Playground 比赛是原始的Dogs vs. Cats比赛(www.kaggle.com/c/dogs-vs-cats),任务是为区分狗和猫创建一个算法。

应当提及数据分析比赛,其中评估是定性的,参与者需要提供想法、解决方案草案、PowerPoint 幻灯片、图表等;以及社区(之前称为 InClass)比赛,这些比赛由学术机构和 Kagglers 举办。您可以在www.kaggle.com/product-feedback/294337上了解社区比赛的启动情况,您可以在www.kaggle.com/c/about/hostwww.kaggle.com/community-competitions-setup-guide上获得举办自己比赛的建议。

Parul Pandey

www.kaggle.com/parulpandey

我们采访了 Parul Pandey,Kaggle 笔记本大师、数据集大师以及 H2O.ai 的数据科学家,她分享了她在数据分析比赛中的经验和更多内容。

您最喜欢的竞赛类型是什么?为什么?在技术和解决方法方面,您在 Kaggle 上的专长是什么?

我真的很喜欢数据分析竞赛,这些竞赛要求您分析数据,并在最后提供一个全面的分析报告。这些包括数据科学竞赛(DS4G)、体育数据分析竞赛(NFL 等)以及一般的调查挑战。与传统竞赛不同,这些竞赛没有排行榜来跟踪您与其他人的表现;您也不会得到任何奖牌或分数。

另一方面,这些竞赛要求提供端到端的解决方案,涉及数据科学的多个方面,如数据清洗、数据挖掘、可视化以及传达见解。这类问题提供了一种模拟现实场景的方式,让您提供自己的见解和观点。可能没有唯一的最佳答案来解决这些问题,但它给了您深思熟虑和权衡潜在解决方案的机会,并将它们融入您的解决方案中。

您是如何处理 Kaggle 竞赛的?这种处理方式与您日常工作的方式有何不同?

我的第一步始终是分析数据作为 EDA(探索性数据分析)的一部分。这也是我日常工作流程中遵循的事情。通常,我会探索数据以寻找潜在的红旗,如数据的不一致性、缺失值、异常值等,这些都可能在以后造成问题。下一步是创建一个良好且可靠的交叉验证策略。然后我会阅读讨论论坛,并查看一些人们分享的 Notebooks。这通常是一个良好的起点,然后我可以从过去的经验中在这个工作流程中融入一些东西。跟踪模型性能也是至关重要的。

然而,对于数据分析竞赛,我喜欢将问题分解成多个步骤。例如,第一步可能是理解问题,这可能需要几天时间。之后,我喜欢探索数据,然后创建一个基本的基线解决方案。然后我通过逐步添加来增强这个解决方案。这可能与逐步添加乐高积木以创建最终杰作相似。

告诉我们您参加的一个特别具有挑战性的竞赛,以及您使用了哪些见解来应对这项任务。

正如我之前提到的,我大多数时候喜欢参加数据分析竞赛,尽管偶尔也会尝试参加常规的竞赛。我想特别指出一个非常有吸引力的数据科学竞赛,名为“环境洞察探索者”(www.kaggle.com/c/ds4g-envi…

真正让我印象深刻的是用例。我们的地球正在应对气候变化问题,这个竞赛触及了这一方面。在我为竞赛进行研究时,我惊讶地发现在这个卫星图像领域取得的进展,这给了我一个机会去理解和更深入地研究这个话题。它给了我一个机会去了解像 Landsat、Modis 和 Sentinel 这样的卫星是如何工作的,以及它们如何使卫星数据可用。这是一个很好的竞赛,让我了解了一个我之前几乎一无所知的话题。

在你的经验中,不经验的 Kagglers 经常忽略什么?你现在知道什么,而你在最初开始时希望知道的?

我将列举一些我在 Kaggle 初期年份中犯的错误。

首先,大多数新手认为 Kaggle 只是一个竞赛平台。如果你喜欢竞赛,这里有很多,但 Kaggle 也为其他专业的人士提供了东西。你可以编写代码并与他人分享,参与健康的讨论,并建立人脉。为社区整理和分享好的数据集。我最初只使用 Kaggle 下载数据集,直到几年前我才真正活跃起来。现在当我回顾过去,我发现自己当初是多么的错误。很多人被竞赛吓到了。你可以先熟悉平台,然后逐渐开始参与竞赛。

我想提到的另一件重要的事情是,许多人独自工作,失去动力,并最终放弃。在 Kaggle 上组队有许多看不到的优势。它教会你团队合作,从经验中学习,并在有限的时间内共同追求一个目标。

你使用其他竞赛平台吗?它们与 Kaggle 相比如何?

虽然 我现在大部分时间都花在 Kaggle 上,但在过去,我曾使用过 Zindi,这是一个专注于非洲用例的数据科学竞赛平台。这是一个获取专注于非洲的数据集的好地方。Kaggle 是一个多功能的平台,但来自世界各地的竞赛题目相对较少。最近,我们也看到了一些多样化的题目,比如最近举办的 chaii 竞赛——这是一个专注于印度语言的 NLP 竞赛。我相信类似专注于不同国家的竞赛将对研究和整个数据科学社区都有帮助

在 Kaggle 竞赛的分类中,你还得考虑竞赛可能具有不同的格式。通常的格式是所谓的简单格式,其中你提供解决方案,然后按照我们之前描述的方式进行评估。更复杂的是两阶段竞赛,它将比赛分为两个部分,并且只有在第一阶段完成后,才会向第一阶段参与者发布最终数据集。两阶段竞赛格式出现是为了限制某些竞争者作弊和违反规则的机会,因为评估是在一个完全未尝试的测试集上进行的,而这个测试集只短暂可用。与原始的 Kaggle 竞赛格式相反,在这种情况下,竞争者有更短的时间,更少的提交来从测试集中找出任何有用的模式。

由于同样的原因,最近出现了代码竞赛,在这种竞赛中,所有提交都是通过 Kaggle 笔记本完成的,并且禁止直接上传提交。

对于处于不同竞赛阶段的 Kagglers,参与任何类型的竞赛都没有限制。然而,根据你在数据科学方面的经验水平和计算资源,我们有一些关于竞赛格式或类型的建议:

  • 对于完全的初学者来说,入门游乐场竞赛是开始的好地方,因为你可以轻松地了解更多关于 Kaggle 如何工作,而不必面对高竞争压力。话虽如此,许多初学者都是从特色和研究竞赛开始的,因为压力帮助他们更快地学习。因此,我们的建议是根据你的学习风格来决定:一些 Kagglers 需要通过探索和协作来学习(入门或游乐场竞赛非常适合这种情况),而其他人则需要快速竞争的热度来找到他们的动力。

  • 对于特色研究竞赛,也要考虑到这些竞赛通常涉及人工智能和机器学习的边缘应用,因此,你通常需要扎实的背景知识或愿意研究该竞赛应用领域的所有相关研究。

最后,请记住,大多数竞赛要求你能够访问通常在工作场所中大多数数据科学家都无法获得的计算资源。如果你使用 Kaggle 以外的云平台,这可能会变成不断增长的支出。因此,代码竞赛和有时间或资源限制的竞赛可能就是投入你努力的理想场所,因为它们努力将所有参与者置于相同的资源水平。

提交和排行榜动态

Kaggle 的工作方式看似简单:测试集对参与者保密;你拟合你的模型;如果你的模型在测试集上的预测最佳,那么你的得分会很高,你可能会赢得比赛。不幸的是,这种描述过于简化了 Kaggle 竞赛的内部运作。它没有考虑到竞争者之间直接和间接的互动动态,或者你所面临的问题及其训练集和测试集的细微差别。

解释共同任务框架范式

对 Kaggle 工作原理的更全面描述实际上是由斯坦福大学统计学教授大卫·多诺霍web.stanford.edu/dept/statistics/cgi-bin/donoho/)在其论文《数据科学 50 年》中给出的。该论文最初发表在《计算与图形统计杂志》上,随后被发布在麻省理工学院计算机科学与人工智能实验室(courses.csail.mit.edu/18.337/2015/docs/50YearsDataScience.pdf)。

多诺霍教授并没有具体提到 Kaggle,而是提到了所有数据科学竞赛平台。引用计算语言学家马克·利伯曼的话,他将数据科学竞赛和平台视为共同任务框架CTF)范式的一部分,这种范式在过去几十年中默默而稳步地推进了许多领域的科学数据。他指出,CTF 可以从经验角度非常有效地改善数据科学问题的解决方案,引用 Netflix 竞赛和许多 DARPA 竞赛作为成功的例子。CTF 范式对许多领域问题的最佳解决方案进行了重塑。

CTF 由成分秘密配方组成。成分很简单:

  1. 一个公开可用的数据集和相关的预测任务

  2. 一组共同承担着为任务提供最佳预测的预测任务的竞争者

  3. 一个系统,以公平和客观的方式对参与者的预测进行评分,同时不提供过于具体的解决方案提示(或者至少限制它们)

如果任务定义得很好且数据质量良好,系统工作得最好。从长远来看,解决方案的性能通过小的增益逐渐提高,直到达到一个渐近线。通过允许参与者之间进行一定程度的共享(如在 Kaggle 上通过讨论和共享 Kaggle Notebooks 以及数据集部分中找到的额外数据)可以加快这个过程。根据 CTF 范式,竞赛中的竞争压力足以产生不断改进的解决方案。当竞争压力与参与者之间的一定程度的共享相结合时,改进的速度会更快——这就是为什么 Kaggle 引入了许多共享激励措施的原因。

这是因为在 CTF 范式中的秘密配方就是竞赛本身,在解决一个需要提高经验性能的实际问题的框架内,它总是导致新的基准、新的数据和建模解决方案的出现,总的来说,是提高了机器学习在竞赛提出的问题上的应用。因此,一个竞赛可以提供一种解决预测问题的新方法,新的特征工程方法,以及新的算法或建模解决方案。例如,深度学习并非仅仅源于学术研究,它首先因为成功的竞赛而获得了巨大的推动力,这些竞赛标志着其有效性(例如,我们已经提到了杰弗里·辛顿的团队赢得的默克竞赛:www.kaggle.com/c/MerckActivity/overview/winners)。

结合开放软件运动,它允许每个人都能访问强大的分析工具(如 Scikit-learn、TensorFlow 或 PyTorch),CTF 范式带来了更好的结果,因为所有竞争者从开始就处于同一水平。另一方面,竞赛解决方案对专用或改进硬件的依赖可能会限制可达到的结果,因为它可能阻止无法访问这些资源的竞争者正确参与并直接贡献解决方案,或者通过在其他参与者身上施加竞争压力间接贡献。可以理解的是,这就是为什么 Kaggle 开始向其竞赛的参与者免费提供云服务的原因,我们将在计算资源部分介绍 Kaggle Notebooks。它可以平息一些硬件密集型竞赛(如大多数深度学习竞赛)中的某些差异,并增加整体竞争压力。

理解竞赛中可能出错的地方

根据我们之前对 CTF 范式的描述,你可能倾向于想象,所有比赛需要的只是在一个合适的平台上设置,并且好的结果,如参与者积极的参与和赞助公司出色的模型,将自动出现。然而,也有一些事情可能会出错,并可能导致比赛结果令人失望,无论是对于参与者还是组织该比赛的机构:

  • 数据泄露

  • 从排行榜(评分系统)进行探测

  • 过度拟合和随之而来的排行榜动荡

  • 私有共享

当解决方案的一部分可以在数据本身中追踪到时,你就有数据泄露。例如,某些变量可能是目标变量的后继变量,因此它们揭示了关于它的某些信息。这在欺诈检测中发生,当你使用在欺诈发生后更新的变量时,或者在销售预测中处理与产品有效分布相关的信息时(更多的分布意味着对产品的更多请求,因此更多的销售)。

另一个问题可能是训练和测试示例以可预测的方式排序,或者示例标识符的值暗示了解决方案。例如,当标识符基于目标的排序时,或者标识符值与时间的流动相关,而时间影响目标发生的概率。

这种解决方案泄露,有时被竞争对手称为金特征(因为数据中这样的细微差别可能会变成参与者的金奖),不可避免地导致一个不可重复使用的解决方案。这也意味着对于赞助商来说,结果可能不是最优的,但他们至少能够了解一些可能影响他们问题解决方案的泄露特征。

另一个问题是有可能从排行榜中探测到一个解决方案。在这种情况下,你可以利用展示给你的评估指标,通过在排行榜上重复提交试验来窃取解决方案。同样,在这种情况下,该解决方案在不同的环境中完全不可用。一个明显的例子发生在比赛Don’t Overfit II中。获胜者Zachary Mayers将每个单独的变量作为一个单独的提交,从而获得了关于每个变量可能权重的信息,这使他能够估计他模型中正确的系数(你可以在 Zach 的详细解决方案中阅读:www.kaggle.com/c/dont-overfit-ii/discussion/91766)。一般来说,时间序列问题或其他测试数据中存在系统性变化的問題可能会受到探测的严重影响,因为它们可以帮助竞争对手成功定义某种后处理(如将他们的预测乘以一个常数),这对于在特定测试集上获得高分最为合适。

另一种形式的排行榜窥探(即,获取关于测试集的线索并对其过度拟合)发生在参与者更多地依赖公共排行榜的反馈而不是他们自己的测试时。有时这会导致比赛的完全失败,造成剧烈的动荡——最终排行榜位置的完全不可预测的重新洗牌。在这种情况下,获胜的解决方案可能并不那么适合问题,甚至可能只是由机会决定的。这导致了分析训练集和公共测试集之间潜在差距的技术扩散。这种分析被称为对抗性测试,可以提供关于应该依赖排行榜多少的见解,以及是否存在训练集和测试集之间差异如此之大,以至于最好完全避免的特征。

例如,您可以查看Bojan Tunguz的此笔记本:www.kaggle.com/tunguz/adversarial-ieee

防止排行榜过度拟合的另一种方式是选择安全策略,以避免提交过于依赖排行榜结果的解决方案。例如,由于(通常)每个参与者允许选择两个解决方案进行最终评估,一个好的策略是提交基于排行榜表现最佳的一个,以及基于你自己的交叉验证测试表现最佳的一个。

为了避免排行榜探测和过度拟合的问题,Kaggle 最近推出了基于代码竞赛的不同创新,正如我们之前讨论的那样,评估被分为两个不同的阶段,参与者对实际测试数据完全不知情,因此被迫更多地考虑他们自己的本地验证测试。

最后,竞争可能出现的另一种扭曲是由于私下分享(在参与者封闭圈中分享想法和解决方案)以及其他非法行为,如通过多个账户或多个团队进行游戏并窃取想法。所有这些行为都会在参与者之间造成信息不对称,这对少数人有利,而对大多数人有害。再次强调,由于比赛期间分享并不完美,且较少的团队能够充分发挥竞争压力,因此产生的解决方案可能会受到影响。此外,如果参与者意识到这些情况(例如,参见www.kaggle.com/c/ashrae-energy-prediction/discussion/122503),可能会导致对比赛或后续比赛的信任度降低和参与度减少。

计算资源

一些竞赛为了使可行的解决方案可用于生产而设定了限制。例如,博世生产线性能竞赛(www.kaggle.com/c/bosch-production-line-performance)对解决方案的执行时间、模型文件输出和内存限制有严格的限制。基于笔记本(之前称为 Kernel-Only)的竞赛,要求在 Kaggle 笔记本上执行训练和推理,对所需资源没有问题。这是因为 Kaggle 会为你提供所有需要的资源(这也是为了使所有参与者站在同一起跑线上,以获得更好的竞赛结果)。

当竞赛仅限制笔记本的使用时间为推理时间时,问题就出现了。在这些情况下,你可以在自己的机器上训练模型,唯一的限制是在测试时间,即你产生的模型的数量和复杂性。由于目前大多数竞赛都需要深度学习解决方案,你必须意识到,为了取得有竞争力的成绩,你需要专门的硬件,如 GPU。

即使在一些现在很少见的表格竞赛中,你很快就会意识到,你需要一台强大的机器,拥有相当数量的处理器和大量内存,以便轻松应用特征工程到数据,运行实验,并快速构建模型。

标准变化迅速,因此很难指定一个标准硬件,以便至少与其他团队在同一联赛中竞争。我们可以通过观察其他竞争对手使用什么硬件来获得关于当前标准的线索,无论是他们自己的机器还是云上的机器。

例如,惠普推出了一项计划,通过提供 HP Z4 或 Z8 服务器作为奖励,以换取品牌曝光度,奖励给一些精选的 Kaggle 参与者。例如,Z8 机器最多拥有 72 个核心,3TB 内存,48TB 存储(按照固态硬盘的标准,这是一个不错的配置),通常配备双 NVIDIA RTX 作为 GPU。我们理解这对很多人来说可能有些难以触及;即使在谷歌的 GCP 或亚马逊的 AWS 云实例上短期租赁类似的机器,考虑到即使是中等使用量的费用,这也超出了讨论的范围。

每个竞赛的云成本自然取决于要处理的数据量以及你构建的模型的数量和类型。Kaggle 竞赛中,GCP 和 AWS 云平台通常提供的免费信用额度通常在 200 美元到 500 美元之间。

因此,当你开始攀登 Kaggle 参与者排名的旅程时,我们的建议是使用 Kaggle 提供的免费机器,Kaggle 笔记本(之前被称为 Kaggle Kernels)。

Kaggle 笔记本

Kaggle 笔记本是基于在云机器上运行的 Docker 容器版本化的计算环境,允许你使用 R 和 Python 语言编写和执行脚本和笔记本。Kaggle 笔记本:

  • 集成到 Kaggle 环境中(你可以从它们提交并跟踪哪些提交与哪个笔记本相关)

  • 预装了大多数数据科学包

  • 允许一些定制(你可以下载文件并安装更多包)

基本 Kaggle 笔记本仅基于 CPU,但你可以使用由 NVIDIA Tesla P100 或 TPU v3-8 增强的版本。TPU 是专门针对深度学习任务硬件加速器。

尽管受到使用数量和时间配额限制的约束,Kaggle 笔记本仍然为你提供了访问计算工作站的权限,以便在 Kaggle 竞赛中构建基准解决方案:

笔记本类型CPU 核心内存同时可运行的笔记本数量每周配额
CPU416 GB10无限制
GPU213 GB230 hours
TPU416 GB230 hours

除了总运行时间外,CPU 和 GPU 笔记本可以在会话中运行最多 12 小时(TPU 笔记本为 9 小时)然后停止,这意味着除了你在磁盘上保存的内容外,你不会从运行中获得任何结果。你有一个 20 GB 的磁盘保存额度来存储你的模型和结果,还有一个额外的临时使用磁盘,可以在脚本运行期间超过 20 GB。

在某些情况下,Kaggle 笔记本提供的 GPU 增强机器可能不足以满足需求。例如,最近的Deepfake Detection Challenge (www.kaggle.com/c/deepfake-detection-challenge) 需要处理大约 500 GB 的视频数据。这尤其具有挑战性,因为每周使用时间限制为 30 小时,并且你不能同时运行超过两台带有 GPU 的机器。即使你可以通过将代码修改为利用 TPU 而不是 GPU(你可以在以下位置找到一些易于实现的指导:www.kaggle.com/docs/tpu)来加倍你的机器时间,这也许仍然不足以在数据密集型竞赛如Deepfake Detection Challenge中进行快速实验。

因此,在第三章使用 Kaggle 笔记本工作和学习中,我们将为你提供一些技巧,帮助你成功应对这些限制,在不购买高性能机器的情况下产生令人满意的结果。我们还将向你展示如何将 Kaggle 笔记本与 GCP 集成,或者,在第二章使用数据集组织数据中,如何将所有工作迁移到另一个基于云的解决方案,Google Colab。

团队和网络

虽然计算能力在其中扮演了一定的角色,但在 Kaggle 竞赛中,真正能产生差异的还是人类的专长和能力。为了成功应对竞赛,有时需要一群参赛者的协作努力。除了招募竞赛,赞助商可能需要个别参与者以更好地评估他们的能力外,通常没有限制组建团队。通常,团队可以由最多五名参赛者组成。

团队合作有其自身的优势,因为它可以放大努力以找到更好的解决方案。一个团队可以共同花更多时间解决问题,不同的技能可以大有裨益;并不是所有数据科学家在处理不同模型和数据操作时都会拥有相同的技能或相同水平的技能。

然而,团队合作并非全是积极的。协调不同个体和努力以实现共同目标可能并不容易,可能会出现一些次优情况。一个常见的问题是,一些参与者没有参与或只是闲置,无疑最糟糕的是当有人违反竞赛规则——这对所有人都是一种损害,因为整个团队可能会被取消资格——或者甚至间谍活动,以给另一队提供优势,正如我们之前提到的。

尽管有负面影响,但在 Kaggle 竞赛中团队合作是一个了解其他数据科学家、为了共同目标协作并取得更多成就的绝佳机会,因为 Kaggle 规则确实奖励团队而非孤独的竞争者。事实上,对于较小的团队,你获得的总额百分比要高于平均份额。虽然在 Kaggle 中建立联系的唯一可能性并不是团队合作,但这无疑对参与者来说更有利和有趣。你还可以通过论坛上的讨论或通过在竞赛期间共享数据集和笔记本来与其他人建立联系。平台上的所有这些机会都可以帮助你了解其他数据科学家并在社区中获得认可。

在 Kaggle 平台之外,也有很多机会与其他 Kagglers 建立联系。首先,有几个 Slack 频道可能会有所帮助。例如,KaggleNoobs (www.kaggle.com/getting-started/20577) 是一个在 2016 年开放的频道,其中包含许多关于 Kaggle 竞赛的讨论。他们有一个支持性的社区,如果你在代码或模型上遇到特定问题,他们可以提供帮助。

还有许多其他频道专门用于交换关于 Kaggle 比赛和数据科学相关主题的意见。有些频道是在地区或国家层面组织的,例如,日本的频道 Kaggler-ja (kaggler-ja-wiki.herokuapp.com/) 或 2015 年成立的俄罗斯社区 Open Data Science Network (ods.ai/),后来也向非俄语使用者开放。Open Data Science Network 不仅提供 Slack 频道,还提供如何赢得比赛的课程、活动,以及对所有已知数据科学平台上正在进行的活跃比赛的报道(见 ods.ai/competitions)。

除了 Slack 频道,围绕 Kaggle 主题或特定比赛的地方聚会也相当多,有些只是临时性的,而有些则更加正式。一个专注于 Kaggle 比赛的聚会,通常围绕一位想要分享经验或建议的竞争者的演讲而建立,这是面对面结识其他 Kagglers、交流意见和共同参加数据科学竞赛联盟的最好方式。

在这个联盟中,应该提到由 Maria ParyszPaweł Jankiewicz 建立的 Kaggle Days (kaggledays.com/)。Kaggle Days 组织在世界各地的主要地点安排了一些活动(kaggledays.com/about-us/),目的是聚集一场 Kaggle 专家的会议。它还在不同国家建立了当地聚会网络,这些网络仍然非常活跃(kaggledays.com/meetups/)。

Pawel_Jankiewicz

Paweł Jankiewicz

www.kaggle.com/paweljankiewicz

我们有机会与 Paweł 交流他在 Kaggle 上的经验。他是一位竞赛大师,也是 LogicAI 的联合创始人。

你最喜欢的比赛类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

代码竞赛是我最喜欢的竞赛类型,因为在受限的环境中工作迫使你考虑不同类型的预算:时间、CPU、内存。在之前的许多比赛中,我需要利用多达 3-4 台强大的虚拟机。我不喜欢为了获胜而不得不利用这些资源,因为这使比赛变得非常不平等。

你是如何处理 Kaggle 比赛的?这种处理方式与你在日常工作中所做的工作有何不同?

我对待每个比赛都有一些不同的方法。我倾向于为每个比赛构建一个框架,使我能够尽可能多地创建实验。例如,在一个我们需要创建深度学习卷积神经网络的比赛中,我创建了一种通过指定格式 C4-MP4-C3-MP3(其中每个字母代表不同的层)来配置神经网络的方法。那是在很多年前,所以现在神经网络的配置可能是由选择骨干模型来完成的。但规则仍然适用。你应该创建一个框架,使你能够快速更改管道中最敏感的部分。

在日常工作方面,建模方法和适当的验证与 Kaggle 比赛有一些重叠。Kaggle 比赛教给我的重要性包括验证、防止数据泄露等。例如,如果数据泄露在许多比赛中发生,当准备它们的人是该领域的最佳人选时,你可以问问自己有多少生产模型在训练中存在数据泄露;我个人认为 80%以上的生产模型可能没有正确验证,但不要引用我的话。

在日常工作中的另一个重要区别是,没有人真正告诉你如何定义建模问题。例如:

  1. 您报告或优化的指标应该是 RMSE、RMSLE、SMAPE 还是 MAPE?

  2. 如果问题是基于时间的,你如何分割数据以尽可能真实地评估模型?

而且,这些并不是商业中唯一重要的事情。您还必须能够传达您的选择以及您为什么做出这些选择。

告诉我们您参加的一个特别具有挑战性的比赛,以及您使用了哪些见解来应对任务。

最具挑战性和趣味性的是 Mercari 价格预测代码比赛。它与任何其他比赛都大不相同,因为它仅限于 1 小时的计算时间,只有 4 个核心和 16GB 的内存。克服这些限制是挑战中最激动人心的部分。我从这次比赛中得到的启示是更加相信网络在表格数据中的应用。在与我的队友 Konstantin Lopukhin (www.kaggle.com/lopuhin)* 合并之前,我有一系列复杂的模型,包括神经网络,还有一些其他提升算法。合并后,结果证明 Konstantin 只使用了一种非常优化的架构(epoch 数量、学习率)。这次比赛另一个相当独特的地方是,仅仅平均团队解决方案是不够的。我们必须重新组织我们的工作流程,以便我们有一个单一的连贯解决方案,而不是快速拼凑起来的东西。我们花了三周时间将我们的解决方案结合起来。*

在您的经验中,没有经验的 Kagglers 通常忽略了什么?您现在知道什么,而您希望在开始时就知道?

软件工程技能可能被低估了很多。每个比赛和问题都有所不同,需要一些框架来简化解决方案(看看 github.com/bestfitting… 以及他们的代码是如何组织的)。良好的代码组织可以帮助你更快地迭代,并最终尝试更多的事情。

当人们参加比赛时,他们应该记住或做些什么最重要的事情?

最重要的是要享受乐趣。

性能层级和排名

除了货币奖金和其他物质物品,如奖杯、T 恤、连帽衫和贴纸外,Kaggle 还提供了许多非物质奖励。Kagglers 在比赛中投入了大量的时间和精力(更不用说在发展他们用于竞争的技能上,这些技能在普通人中实际上相当罕见)。通常,货币奖金覆盖了排名前几位 Kagglers 的努力,如果不是只有排名第一的人,那么其他人就会自愿投入大量的时间而几乎没有什么回报。从长远来看,参加没有实质性结果的比赛可能会导致不满和兴趣下降,降低竞争强度。

因此,Kaggle 找到了一种通过基于奖牌和积分的荣誉体系来奖励竞争者的方法。其理念是,你拥有的奖牌和积分越多,你的技能就越相关,这为你提供了在求职或其他基于你声誉的相关活动中的机会。

首先,有一个通用排行榜,它结合了所有个人比赛的排行榜(www.kaggle.com/rankings)。根据他们在每个比赛中达到的位置,Kagglers 获得一定数量的积分,所有积分加起来提供了他们在通用排行榜上的排名。乍一看,比赛中积分计分的公式可能看起来有点复杂:

然而,在现实中,它仅仅基于几个要素:

  • 在比赛中你的排名

  • 你的团队规模

  • 比赛的受欢迎程度

  • 比赛的历史

直觉上,在流行的比赛中排名靠前会带来很多积分。不那么直观的是,团队的大小以非线性方式影响排名。这是因为公式中的倒数平方根部分,因为你必须放弃的积分比例随着参与人数的增加而增长。

如果你的团队相对较小(最多 2 至 3 人),由于协作带来的智慧和计算能力的优势,这仍然相当有利。

另一点需要记住的是,积分会随着时间的推移而减少。这种减少不是线性的,但可以作为一个经验法则记住,一年后,你获得的积分所剩无几。因此,在 Kaggle 的一般排行榜上的荣耀是短暂的,除非你继续参加与之前相似结果的竞赛。作为安慰,在你的个人资料中,你将始终保留你曾经达到的最高排名。

比起排行榜,更持久的是涵盖 Kaggle 竞赛所有四个方面的奖牌系统。你将根据你的结果获得竞赛、笔记本、讨论和数据集的奖牌。在竞赛中,奖牌是根据你在排行榜上的位置颁发的。在其他三个领域,奖牌是根据其他竞争者的点赞数颁发的(这实际上可能导致一些次优情况,因为点赞是一个不那么客观的指标,也取决于人气)。你获得的奖牌越多,你能够进入的 Kaggle 精通等级就越高。等级包括新手贡献者专家大师宗师www.kaggle.com/progression页面解释了如何获得奖牌以及需要多少以及什么类型的奖牌才能进入不同的等级。

请记住,这些排名和荣誉总是相对的,并且会随时间而变化。实际上,几年前,评分系统和排名相当不同。很可能会在未来,排名将再次改变,以使更高的排名更加罕见和有价值。

批评和机会

自 Kaggle 开始以来,它已经受到了不少批评。参与数据科学竞赛至今仍是一个有争议的话题,外界有各种各样的观点,既有积极的也有消极的。

在负面批评方面:

  • Kaggle 给人一种关于机器学习真正是什么的错觉,因为它只是专注于排行榜的动态

  • Kaggle 只是一个超参数优化和集成多个模型的游戏,只是为了获得一点更高的准确率(而实际上是在过度拟合测试集)

  • Kaggle 充斥着缺乏经验的热心爱好者,他们愿意尝试任何可能的事情,只为获得分数和聚光灯,希望被招聘者发现

  • 作为进一步的后果,竞赛解决方案过于复杂,通常过于特定于测试集,以至于无法实施

许多人认为 Kaggle,就像许多其他数据科学竞赛平台一样,与数据科学的实际情况相去甚远。批评者提出的问题是,商业问题并非凭空而来,你很少一开始就有一个准备好的数据集来开始,因为你通常是在根据细化后的商业规格和对当前问题的理解过程中逐步构建它的。此外,许多批评者强调,Kagglers 并不擅长或精通创建生产就绪的模型,因为一个获胜的解决方案不能受限于资源限制或技术债务的考虑(尽管这并不总是适用于所有竞赛)。

所有这些批评最终都与雇主眼中 Kaggle 排名如何与其他类型的经验相比较有关,特别是与数据科学教育和工作经验相比较。一个持续的神话是,Kaggle 竞赛不能帮助你获得工作或更好的数据科学工作,而且它们并不使你比完全不参加竞赛的数据科学家处于更高的层次。

我们对此的看法是,认为 Kaggle 排名在 Kaggle 社区之外没有自动价值的观点是误导性的。例如,在求职过程中,Kaggle 可以为你提供一些非常有用的建模数据和问题的能力以及有效的模型测试。它还可以让你接触到许多技术和不同的数据/商业问题,这些超出了你的实际经验和舒适区,但它不能为你提供作为数据科学家成功进入公司的所有所需。

你可以用 Kaggle 来学习(网站上也有一个专门用于学习的部分,即课程部分)和在求职中区别于其他候选人;然而,这一点如何被考虑在不同的公司中差异很大。无论如何,你在 Kaggle 上学到的知识将不可避免地在你的整个职业生涯中证明是有用的,并在你需要用数据建模解决复杂和不同寻常的问题时为你提供保障。通过参加 Kaggle 竞赛,你将建立起强大的建模和验证能力。你还可以与其他数据科学家建立联系,这可以使你更容易地获得工作推荐,并为你提供另一种处理超出你技能范围困难问题的方法,因为你可以接触到其他人的能力和观点。

因此,我们的观点是,Kaggle 以更间接的方式帮助你作为数据科学家在职业生涯中取得成功,以各种不同的方式。当然,有时 Kaggle 会帮助你基于你的成功直接作为求职者被联系,但更常见的是,Kaggle 会为你提供成功所需的智力技能和经验,首先是作为候选人,然后是作为从业者。

实际上,在 Kaggle 上玩弄数据和模型一段时间后,你将有机会看到足够多的不同数据集、问题和在时间压力下处理它们的不同方式,当面对现实环境中的类似问题时,你将能够快速有效地找到解决方案。

正是这种技能提升的机会激励我们最初写这本书,这本书实际上也是关于这个主题的。你不会在这里找到关于如何在 Kaggle 竞赛中获胜或得分很高的指南,但你绝对会找到关于如何在 Kaggle 上更好地竞争以及如何从竞赛经验中获得最大回报的指南。

智能地使用 Kaggle 和其他竞赛平台。Kaggle 不是一个万能的解决方案——在竞赛中取得第一并不能保证你获得高薪工作或超越 Kaggle 社区的荣耀。然而,持续参与竞赛是一张明智的牌,可以展示你对数据科学职位的兴趣和热情,并提高一些可以让你作为数据科学家脱颖而出而不是被 AutoML 解决方案淘汰的特定技能。

如果你跟随我们阅读这本书,我们将向你展示如何做到这一点。

摘要

在本章的开头,我们首先讨论了数据科学竞赛平台是如何兴起以及它们实际上是如何运作的,特别是提到了 David Donoho 教授讨论过的令人信服的 CTF 模式。

我们展示了 Kaggle 的工作原理,同时不忘提及其他值得注意的竞赛平台,以及如何在你参加 Kaggle 以外的挑战中也能派上用场。关于 Kaggle,我们详细介绍了竞赛的不同阶段是如何工作的,竞赛之间有何不同,以及 Kaggle 平台可以为你提供哪些资源。

在接下来的几章中,我们将更详细地探讨 Kaggle,从如何处理数据集开始。

加入我们本书的 Discord 空间

加入本书的 Discord 工作空间,参加每月一次的作者“问我任何问题”活动:

packt.link/KaggleDiscord

第二章:使用数据集组织数据

在他的故事《铜 Beeches 的冒险》中,亚瑟·柯南·道尔让夏洛克·福尔摩斯喊道“数据!数据!数据!没有粘土我无法制造砖块。”这种心态为文学中最著名的侦探提供了很好的服务,每个数据科学家都应该采纳这种心态。因此,我们以一个专门介绍数据的章节开始这本书的更技术性部分:具体来说,在 Kaggle 的背景下,利用 Kaggle 数据集功能为我们服务。

在本章中,我们将涵盖以下主题:

  • 设置数据集

  • 收集数据

  • 与数据集一起工作

  • 在 Google Colab 中使用 Kaggle 数据集

  • 法律注意事项

设置数据集

原则上,你可以使用的任何数据都可以上传到 Kaggle(受限制;请参阅后面的 法律注意事项 部分)。写作时的具体限制是 每个私有数据集 100 GB总共 100 GB 的配额。请注意,单个数据集的大小限制是计算未压缩的;上传压缩版本可以加快传输速度,但不会帮助克服限制。你可以通过此链接检查数据集的最新文档:www.kaggle.com/docs/datasets

Kaggle 自称为“数据科学之家”,并且从该网站提供的令人印象深刻的数据集集合确实为这一说法增添了一些可信度。你不仅可以找到从石油价格到动漫推荐等主题的数据,而且数据迅速出现在那里的速度也令人印象深刻。当 2021 年 5 月根据《信息自由法》发布 安东尼·福奇 的电子邮件时(www.washingtonpost.com/politics/interactive/2021/tony-fauci-emails/),它们仅仅在 48 小时后就被上传为一个 Kaggle 数据集。

图 2.1:Kaggle 上的趋势和热门数据集

在将你的项目数据上传到数据集之前,请确保检查现有内容。对于几个流行的应用(图像分类、NLP、金融时间序列),有可能它已经被存储在那里。

为了介绍的目的,让我们假设你将在项目中使用的数据尚未存在,因此你需要创建一个新的数据集。当你点击左侧带有三条线的菜单并点击 数据 时,你将被重定向到 数据集 页面:

包含文本的图像 自动生成的描述

图 2.2:数据集页面

当你点击 + 新数据集 时,你将被提示输入基本信息:上传实际数据和给它一个标题:

包含文本的图像 自动生成的描述

图 2.3:输入数据集详细信息

左侧的图标对应于您可以为数据集利用的不同来源。我们按页面显示的顺序描述它们:

  • 从本地驱动器上传文件(如图所示)

  • 从远程 URL 创建

  • 导入 GitHub 仓库

  • 使用现有笔记本的输出文件

  • 导入 Google Cloud Storage 文件

关于 GitHub 选项的一个重要观点:当涉及到实验性库时,此功能特别有用。虽然它们经常提供以前不可用的功能,但它们通常不包括在 Kaggle 环境中,因此如果您想在代码中使用此类库,您可以将其作为数据集导入,如下所示:

  1. 前往数据集并点击新建数据集

  2. 选择 GitHub 图标。

  3. 插入仓库链接以及数据集的标题。

  4. 在右下角点击创建

包含文本的图像 自动生成的描述

图 2.4:来自 GitHub 仓库的数据集

创建按钮旁边,还有一个标记为私有的按钮。默认情况下,您创建的任何数据集都是私有的:只有您,即创建者,可以查看和编辑它。在数据集创建阶段保持此设置为默认值,并在稍后阶段将其公开(可供选定列表的参与者或所有人使用)可能是一个好主意。

请记住,Kaggle 是一个流行的平台,许多人上传他们的数据集——包括私有的——所以尽量想一个非通用标题。这将增加您的数据集真正被注意到的机会。

完成所有步骤并点击创建后,哇!您的第一个数据集就准备好了。然后您可以前往数据选项卡:

图 2.5:数据选项卡

上面的截图展示了您可以提供有关数据集的不同信息;您提供的信息越多,可用性指数就越高。这个指数是一个综合指标,总结了您的数据集描述得有多好。具有更高可用性指数的数据集在搜索结果中显示得更高。对于每个数据集,可用性指数基于多个因素,包括文档水平、相关公共内容(如笔记本)的可用性、文件类型和关键元数据的覆盖范围。

在原则上,您不需要填写上图所示的所有字段;您新创建的数据集无需它们即可完全使用(如果它是私有的,您可能也不在乎;毕竟,您知道里面有什么)。然而,社区礼仪建议填写您公开的数据集的信息:您指定的信息越多,数据对他人就越有用。

收集数据

除了法律方面,在数据集中存储的内容类型实际上没有真正的限制:表格数据、图像、文本;如果它符合大小要求,就可以存储。这包括从其他来源收集的数据;在撰写本文时,按标签或主题收集的推文是流行的数据集之一:

包含文本的图像 自动生成的描述

图 2.6:推文是最受欢迎的数据集之一

讨论从社交媒体(Twitter、Reddit 等)收集数据的不同框架超出了本书的范围。

安德烈·马拉尼亚奥的图片

安德烈·马拉尼亚奥

www.kaggle.com/andrewmvd

我们采访了安德烈·马拉尼亚奥(又名 Larxel),数据集大师(在撰写本文时数据集排名第一)和圣保罗艾伯特·爱因斯坦医院的资深数据科学家,关于他如何取得数据集的成功,他创建数据集的技巧以及他在 Kaggle 上的总体经验。

你最喜欢的比赛类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

医学影像通常是我在 Kaggle 上最喜欢的。它与我的人生目标和职业相关。在医学竞赛中,NLP 受语言限制,表格数据在医院之间差异很大,但影像学大多是相同的,因此在这个背景下任何进步都可以为世界上的许多国家带来好处,我热爱这种影响潜力。我也喜欢 NLP 和表格数据,但我想这很常见。

告诉我们你参加的一个特别具有挑战性的比赛,以及你用来应对任务的见解。

在 X 光图像结核病检测比赛中,我们有大约 1,000 张图像,这对于捕捉疾病的全部表现来说数量相当少。我提出了两个想法来弥补这一点:

  1. 在外部肺炎检测数据(约 20k 张图像)上进行预训练,因为肺炎可能会被误诊为肺结核。

  2. 在肺异常的多标签分类(约 600k 张图像)上进行预训练,并使用简单的 SSD 与 grad-CAM 生成分类标签的边界框注释。

最终,这两种简单混合的方法比第二名团队的结果高出 22%。这发生在一次医学会议上,大约有 100 个团队参加。

你已经成为数据集大师,并在数据集上取得了第一名。你是如何选择主题,以及如何在 Kaggle 上找到、收集和发布数据集的?

这是一个很大的问题;我会一点一点地把它分解。

  1. 设定自己的目标

在选择主题时,我首先考虑的是我最初为什么要做这件事。

当有一个更深层次的原因时,伟大的数据集只是作为一个结果出现,而不是作为一个目标本身。ImageNet 创建实验室的负责人李飞飞在 TED 演讲中透露,她 希望创造一个世界,机器能够用他们的视觉以她孩子的方式推理和欣赏世界。

有一个目的在心中会使你更有可能参与并随着时间的推移而改进,这也会使你和你数据集与众不同。你当然可以靠日常主题的表格数据为生,尽管我发现这不太可能留下持久的影响。

  1. 一个伟大的数据集是一个伟大问题的体现

如果我们看看当前文献中最伟大的数据集,比如 ImageNet 和其他数据集,我们可以看到一些共同的主题:

  • 这是一个大胆、相关的问题,对我们所有人(科学或现实世界应用)都有巨大的潜力。

  • 数据收集得很好,质量得到控制,并且有很好的记录

  • 当前硬件的数据量和多样性是足够的

  • 它有一个活跃的社区,不断改进数据并/或在此基础上构建问题

正如我之前提到的,我认为提问是数据科学家的主要角色,并且随着自动机器学习和深度学习解决方案的进步,它可能会变得更加突出。这正是数据集可以肯定地发挥你技能的独特之处。

  1. 创造你的成功过程,而不仅仅是追求成功本身

质量远远超过数量;你只需要 15 个数据集就可以成为大师,而 AI 的旗舰数据集很少且制作精良。

我已经丢弃了与我发布的同样多的数据集。这需要时间,而且它不是许多人所认为的一次性事情——数据集有维护和持续改进的一面。

经常被忽视的一点是支持围绕你的数据聚集的社区。笔记本和数据集是共同努力的结果,因此支持那些花时间分析你数据的人对你的数据集也有很大的帮助。分析他们的瓶颈和选择可以为你提供指导,关于哪些预处理步骤可以完成和提供,以及你文档的清晰度。

总的来说,我推荐的过程是从设定你的目的开始,将其分解为目标和主题,制定问题以满足这些主题,调查可能的数据来源,选择和收集,预处理,记录,发布,维护和支持,最后是改进措施。

例如,假设你想要提高社会福利;你将其分解为一个目标,比如,种族平等。从那里,你分析与目标相关的主题,并找到“黑人的命也是命”运动。从这里,你提出问题:我如何理解数百万人在谈论它?

这缩小了你的数据类型到 NLP,你可以从新闻文章、YouTube 评论和推文中(你选择的,因为它似乎更能代表你的问题和可行性)收集数据。你预处理数据,去除标识符,并记录收集过程和数据集用途。

完成这些后,你发布它,一些 Kagglers 尝试主题建模,但很难做到,因为一些推文中包含许多外语,这造成了编码问题。你通过提供建议和突出他们的工作来支持他们,并决定回到推文,将其缩小到英语,以彻底解决这个问题。

他们的分析揭示了与运动相关的需求、动机和恐惧。通过他们的努力,有可能将数百万条推文分解成一系列可能改善社会种族平等的建议。

  1. *做好工作是你在控制范围内的所有事情

最终,是其他人让你成为大师,投票并不总是转化为努力或影响。在我的一个关于《赛博朋克 2077》的数据集中,我总共工作了大约 40 小时,时至今日,它仍然是我最少点赞的数据集之一。

但这没关系。我付出了努力,我尝试了,我学到了我能学到的东西——那是我能控制的,下周无论发生什么,我都会再次尝试。尽你所能,继续前进。

你会推荐哪些特定的工具或库用于数据分析/机器学习?

奇怪的是,我既推荐也不建议使用库。LightGBM 是一个出色的表格机器学习库,具有出色的性能与计算时间的比率,CatBoost 有时可以超越它,但代价是增加了计算时间,在这段时间里,你可以尝试和测试新的想法。Optuna 非常适合超参数调整,Streamlit 适用于前端,Gradio 适用于 MVP,Fast API 适用于微服务,Plotly 和 Plotly Express 适用于图表,PyTorch 及其衍生品适用于深度学习。

虽然图书馆很棒,但我还建议在职业生涯的某个阶段,你花些时间自己实现它。我第一次从 Andrew Ng 那里听到这个建议,后来又从许多同等水平的人那里听到。这样做可以创造非常深入的知识,这些知识可以让你对模型的功能以及它如何响应调整、数据、噪声等有新的认识。

在你的经验中,不经验的 Kagglers 经常忽视什么?你现在知道什么,而你在最初开始时希望知道的呢?

多年来,我最希望早点意识到的事情是:

  1. 在竞赛结束时吸收所有知识

  2. 在完成竞赛中复制获胜的解决方案

在一场即将结束的竞争压力下,你可以看到排行榜比以往任何时候都更加动荡。这使得你不太可能冒险,也不太愿意花时间去细致观察。当比赛结束后,你不再有那种紧迫感,可以花尽可能多的时间去思考;你也可以复制获胜者的逻辑,让他们知道他们的解决方案。

如果你有自律,这将对你的数据科学技能产生神奇的效果,所以底线是:在你完成时停止,而不是在比赛结束时停止。我还从 Andrew Ng 的闭幕演讲中听到过这个建议,他建议复制论文是他作为 AI 实践者自我发展的最佳方式之一。

此外,在比赛结束时,你可能会感到筋疲力尽,只想结束这一天。没问题;但请记住,比赛结束后,讨论论坛是地球上知识最丰富的地方之一,主要是因为 许多获胜解决方案的理据和代码都公开发布在那里。花时间去阅读和学习获胜者所做的事情;不要屈服于想要转向其他事物的欲望,因为你可能会错过一个极好的学习机会。

Kaggle 是否帮助了你的职业生涯?如果是的话,是如何帮助的?

Kaggle 通过提供丰富的知识、经验和建立我的作品集来帮助了我的职业生涯。我作为数据科学家的第一份工作很大程度上得益于 Kaggle 和 DrivenData 竞赛。在我的整个职业生涯中,我研究了竞赛解决方案,并参与了一些更多的竞赛。在数据集和笔记本上的进一步参与也在学习新技术和提出更好的问题方面证明非常有益。

在我看来,提出优秀问题是数据科学家面临的主要挑战。回答它们当然也很棒,尽管我相信我们离一个自动化解决方案在建模中越来越普遍的未来并不遥远。建模始终有空间,但我认为在这方面会有很多工作流程简化。然而,提出优秀问题要远比自动化困难——如果问题本身不好,即使是最好的解决方案也可能毫无意义。

你是否曾使用在 Kaggle 竞赛中完成的项目来构建你的作品集,以展示给潜在雇主?

绝对如此。我于 2017 年通过 Kaggle 作为知识证明,获得了我的第一份数据科学家工作。时至今日,它仍然是一个极好的简历组成部分,因为教育背景和学位在数据科学知识和经验方面不如作品集来得有代表性。

拥有竞赛项目的作品集不仅展示了额外的经验,还显示了超越常规进行发展的意愿,这在长期成功中可能更为重要。

你使用其他竞赛平台吗?它们与 Kaggle 相比如何?

我也使用 DrivenData 和 AICrowd。它们的好处是允许那些没有相同财务资源访问权的组织,如初创公司和研究机构,创建比赛。

伟大的竞赛来自于优秀的问题和优秀的数据的结合,这无论公司规模大小都是可能的。Kaggle 拥有一个更大、更活跃的社区,以及他们提供的硬件,结合数据集和笔记本功能,使其成为最佳选择;然而,DrivenData 和 AICrowd 也提供了同样有趣挑战,并允许更多样化的选择。

当人们参加比赛时,他们应该记住或做什么最重要的事情?

假设你的主要目标是开发,我的建议是选择一个你感兴趣的主题和之前没有做过的任务的比赛。批判性思维和技能需要深度和多样性。专注于并全力以赴将保证深度,而多样性是通过做你以前没有做过的事情或以不同的方式做事情来实现的。

与数据集一起工作

一旦你创建了一个数据集,你可能希望将其用于你的分析。在本节中,我们将讨论不同的实现方法。

很可能,最重要的是在参加比赛时,应该记住或做的事情是开始一个笔记本,其中你使用你的数据集作为主要来源。你可以通过访问数据集页面,然后点击新建笔记本来完成:

图 2.7:从数据集页面创建笔记本

完成这些操作后,你将被重定向到你的笔记本页面:

包含文本的图像 自动生成的描述

图 2.8:使用你的数据集开始笔记本

关于这一点,这里有一些提示:

  • 阿拉伯数字和字母标题是自动生成的;你可以通过点击它来编辑它。

  • 在右侧的数据部分,你可以看到附加到你的笔记本上的数据源列表;我选择的数据集可以在../input//kaggle/input/下访问。

  • 开头块(包含导入的包、描述性注释和打印可用文件列表)会自动添加到新的 Python 笔记本中。

在这个基本设置下,你可以开始编写用于分析的笔记本,并将你的数据集作为数据源使用。我们将在第四章利用讨论论坛中更详细地讨论笔记本。

在 Google Colab 中使用 Kaggle 数据集

Kaggle 笔记本免费使用,但并非没有限制(更多内容请见第四章),你很可能会遇到的时间限制。一个流行的替代方案是迁移到 Google Colab,这是一个完全在云端运行的免费 Jupyter Notebook 环境:colab.research.google.com

即使我们将计算移动到那里,我们可能仍然需要访问 Kaggle 数据集,因此将它们导入 Colab 是一个相当方便的功能。本节剩余部分将讨论使用 Colab 通过 Kaggle 数据集所需的步骤。

假设我们已经在 Kaggle 上注册,我们首先去账户页面生成API 令牌(一个包含登录会话安全凭证、用户标识、权限等的访问令牌):

  1. 前往你的账户,可以在 https://www.kaggle.com/USERNAME/account 找到,然后点击创建新的 API 令牌

包含文本的图片 自动生成的描述

图 2.9:创建新的 API 令牌

将包含你的用户名和令牌的名为 kaggle.json 的文件创建出来。

  1. 下一步是在你的 Google Drive 中创建一个名为 Kaggle 的文件夹,并将 .json 文件上传到那里:

![图片 B17574_02_10.png]

图 2.10:将 .json 文件上传到 Google Drive

  1. 完成后,你需要在 Colab 中创建一个新的笔记本,并通过在笔记本中运行以下代码来挂载你的驱动器:

    from google.colab import drive
    drive.mount('/content/gdrive') 
    
  2. 从 URL 提示中获取授权代码,并在出现的空框中提供,然后执行以下代码以提供 .json 配置的路径:

    import os
    # content/gdrive/My Drive/Kaggle is the path where kaggle.json is 
    # present in the Google Drive
    os.environ['KAGGLE_CONFIG_DIR'] = "/content/gdrive/My Drive/Kaggle"
    # change the working directory
    %cd /content/gdrive/My Drive/Kaggle
    # check the present working directory using the pwd command 
    
  3. 现在我们可以下载数据集了。首先前往数据集在 Kaggle 上的页面,点击新建笔记本旁边的三个点,然后选择复制 API 命令

![图片 B17574_02_11.png]

图 2.11:复制 API 命令

  1. 运行 API 命令以下载数据集(对命令细节感兴趣的读者可以查阅官方文档:www.kaggle.com/docs/api):

    !kaggle datasets download -d ajaypalsinghlo/world-happiness-report-2021 
    
  2. 数据集将以 .zip 归档的形式下载到 Kaggle 文件夹中——解压后即可使用。

如上表所示,在 Colab 中使用 Kaggle 数据集是一个简单的过程——你只需要一个 API 令牌,切换后你就有可能使用比 Kaggle 授予的更多 GPU 小时数。

法律免责声明

只因为你可以在 Kaggle 上放置一些数据,并不意味着你一定应该这样做。一个很好的例子是 Tinder 的人 数据集。2017 年,一位开发者使用 Tinder API 爬取了网站上的半私密资料,并将数据上传到了 Kaggle。问题曝光后,Kaggle 最终将该数据集下架。你可以在这里阅读完整的故事:www.forbes.com/sites/janetwburns/2017/05/02/tinder-profiles-have-been-looted-again-this-time-for-teaching-ai-to-genderize-faces/?sh=1afb86b25454

通常,在将任何内容上传到 Kaggle 之前,问问自己两个问题:

  1. 从版权角度来看,这是否允许? 记得始终检查许可证。如有疑问,您始终可以咨询opendefinition.org/guide/data/或联系 Kaggle。

  2. 这个数据集是否有隐私风险? 仅因为发布某些类型的信息在严格意义上并不违法,但这可能对另一人的隐私造成伤害。

这些限制符合常识,因此不太可能妨碍您在 Kaggle 上的努力。

摘要

在本章中,我们介绍了 Kaggle 数据集,这是在平台上存储和使用数据的标准化方式。我们讨论了数据集创建、在 Kaggle 之外工作的方法以及最重要的功能:在您的笔记本中使用数据集。这为我们下一章提供了一个很好的过渡,我们将重点关注 Kaggle 笔记本。

加入我们本书的 Discord 空间

加入本书的 Discord 工作空间,参加每月一次的作者“问我任何问题”活动:

packt.link/KaggleDiscord

二维码

第三章:使用 Kaggle 笔记本学习和工作

Kaggle 笔记本——直到最近还被称为内核——是浏览器中的 Jupyter 笔记本,可以免费运行。这意味着您可以从任何有互联网连接的设备执行实验,尽管可能比手机大一些会更好。以下是从 Kaggle 网站引用的环境技术规格(截至本文写作时);最新版本可以在www.kaggle.com/docs/notebooks验证:

  • CPU/GPU 执行时间为 12 小时,TPU 为 9 小时

  • 20GB 的自动保存磁盘空间(/kaggle/working)

  • 额外的临时磁盘空间(在/kaggle/working 之外),这些空间在当前会话之外不会被保存

CPU 规格:

  • 4 个 CPU 核心

  • 16GB 的 RAM

GPU 规格:

  • 2 个 CPU 核心

  • 13GB 的 RAM

TPU 规格:

  • 4 个 CPU 核心

  • 16GB 的 RAM

在本章中,我们将涵盖以下主题:

  • 设置笔记本

  • 运行笔记本

  • 将笔记本保存到 GitHub

  • 充分利用笔记本

  • Kaggle 学习课程

不再拖延,让我们直接进入正题。我们首先需要做的是弄清楚如何设置笔记本。

设置笔记本

创建笔记本主要有两种方法:从首页或从数据集创建。

要进行第一种方法的操作,请转到www.kaggle.com/着陆页左侧的代码菜单部分,并点击新建笔记本按钮。如果您计划进行涉及上传自己的数据集的实验,这是一个首选方法:

图片

图 3.1:从代码页面创建新的笔记本

或者,您可以转到您感兴趣的数据集页面,并点击那里的新建笔记本按钮,正如我们在上一章中看到的:

图片

图 3.2:从数据集页面创建新的笔记本

无论您选择哪种方法,在点击新建笔记本后,您将被带到您的笔记本页面:

图片

图 3.3:笔记本页面

在上面显示的新笔记本页面的右侧,我们有一些可以调整的设置:

图片

图 3.4:笔记本选项

我们将简要讨论设置。首先,是编码语言。截至本文写作时,Kaggle 环境仅允许 Python 和 R 作为可用的编码选项。默认情况下,新的笔记本初始化时语言设置为 Python——如果您想使用 R,请点击下拉菜单并选择R

接下来是环境:这个切换按钮允许你决定是否始终使用最新的 Docker 环境(风险选项;更新快,但依赖项可能会因未来的更新而损坏)或者将笔记本固定到 Kaggle 提供的原始环境版本(安全选择)。后者是默认选项,除非你正在进行非常活跃的开发工作,否则没有真正的原因要去修改它。

加速器允许用户选择如何运行代码:在 CPU 上(无加速)、GPU 上(对于几乎所有涉及深度学习的严肃应用都是必要的),或者 TPU 上。请记住,从 CPU 迁移到(单个)GPU 只需要对代码进行最小改动,并且可以通过系统设备检测来处理。

将你的代码迁移到 TPU 需要更详细的重新编写,从数据处理开始。需要记住的一个重要点是,当你正在你的笔记本上工作时,你可以切换到 CPU/GPU/TPU,但每次你这样做,环境都会重新启动,你需要从头开始运行所有代码。

最后,我们有互联网切换按钮,它启用或禁用在线访问。如果你连接了网络并且需要,例如,安装额外的包,依赖项的下载和安装将在后台自动进行。你需要明确禁用互联网访问的最常见情况是在提交比赛时,比赛明确禁止在提交时使用在线访问。

使用笔记本的一个重要方面是,你可以始终取一个现有的笔记本(由你自己或另一个 Kaggler 创建)并将其克隆以修改和调整以满足你的需求。这可以通过点击笔记本页面右上角的复制并编辑按钮来实现。在 Kaggle 术语中,这个过程被称为分支

图片

图 3.5:分支现有的笔记本

关于礼仪的说明:如果你之前参加过 Kaggle 比赛,你可能已经注意到排行榜上充斥着得分很高的笔记本的分支。在别人的工作上建立自己的东西并没有什么不妥——但如果你这样做,记得要给原作者点赞,并明确指出参考作品的创作者。

默认情况下,你创建的笔记本是私有的(只有你能看到)。如果你想让它对其他人可用,你可以选择添加协作者,这样只有被明确添加到名单中的用户才能查看或编辑内容,或者将笔记本公开,在这种情况下,任何人都可以看到它。

运行你的笔记本

所有编码工作已完成,笔记本看起来运行良好,你现在可以执行了。为此,请前往笔记本页面的右上角并点击保存版本

图片

图 3.6:保存你的脚本

保存并运行所有通常用于执行脚本,但还有一个快速保存选项,可以在脚本准备好提交之前保存脚本的中间版本:

图 3.7:保存版本的选项

一旦您启动了您的脚本,您可以前往左下角并点击活动事件

包含文本的图像,屏幕截图,显示器,屏幕  自动生成的描述

图 3.8:监控活动事件

以这种方式,您可以监控您的笔记本行为。正常执行与消息运行相关联;否则,将显示为失败。如果您决定出于任何原因(例如,您意识到您忘记使用最新的数据)想要终止一个正在运行的会话,您可以通过点击活动事件下脚本条目右侧的三个点来完成,您将收到如图下所示的弹出窗口:

图 3.9:取消笔记本执行

将笔记本保存到 GitHub

最近引入的一项功能(见www.kaggle.com/product-feedback/295170)允许您将您的代码或笔记本存储到版本控制存储库 GitHub (github.com/))。您可以将您的作品存储在公共和私有存储库中,并且当您保存代码版本时,这将自动发生。这个功能对于与您的 Kaggle 队友分享您的作品,以及向更广泛的公众展示您的作品来说可能非常有用。

为了启用此功能,您需要打开您的笔记本;在文件菜单中,选择链接到 GitHub选项。

00.PNG

图 3.10:启用 GitHub 功能

选择选项后,您需要将 GitHub 账户链接到笔记本。您将在第一次选择链接时明确被要求提供链接权限。对于任何后续链接到新笔记本的操作,操作将自动执行。

01.PNG

图 3.11:链接到 GitHub

只有在链接了您的笔记本之后,当您保存时,您才被允许将您的作品同步到您选择的存储库:

02.PNG

图 3.12:将您的作品提交到 GitHub

在决定存储库和分支(这样您可以存储您工作的不同开发阶段)之后,您可以更改您要推送到存储库的文件名,并修改提交信息。

如果你决定不再在 GitHub 上同步特定的 Notebook,你只需要回到文件菜单并选择从 GitHub 断开连接。最后,如果你想让 Kaggle 停止连接到你的 GitHub 仓库,你可以从我的链接账户下的 Kaggle 账户页面或 GitHub 的设置页面(github.com/settings/applications)断开你的账户链接。

充分利用 Notebooks

Kaggle 每周会提供一定量的免费资源,配额会重置。你可以使用一定数量的 GPU 和 TPU 时间;对于 TPU 是 30 小时,但对于 GPU,这个数字每周都可能变化(你可以在这里找到描述“浮动”配额政策的官方声明:www.kaggle.com/product-feedback/173129)。你可以在自己的个人资料中始终监控你的使用情况:

包含文本的图像 自动生成的描述

图 3.13:加速器配额的当前状态

虽然乍一看这些数量可能很大,但这种初步印象可能会误导人;实际上,很容易很快就用完你的配额。以下是一些可以帮助你控制资源使用的实用建议:

  • 配额计数器(衡量你使用所选加速器,GPU 或 TPU 的时间)从你初始化Notebook 的那一刻开始运行。

  • 这意味着你应该始终先检查设置中是否已禁用 GPU(参见上面的图 3.6)。首先编写模板代码,检查你的语法,并在添加实际依赖于 GPU 初始化的代码部分时启用/禁用 GPU。提醒:当你更改加速器时,Notebook 将重新启动。

  • 通常,在小部分数据上从头到尾运行代码以了解执行时间是一个好主意。这样,你可以最大限度地减少你的代码因超过此限制而崩溃的风险。

有时候,Kaggle 提供的免费资源不足以完成手头的任务,你需要迁移到一个更强大的机器。一个很好的例子是最近的一个肿瘤分类竞赛:www.kaggle.com/c/rsna-miccai-brain-tumor-radiogenomic-classification/data

如果你的原始数据超过 100GB,你需要调整/下采样你的图像(这可能会对你的模型性能产生不利影响),或者在一个能够处理高分辨率图像的环境中训练模型。你可以自己设置整个环境(例如,第二章中的使用 Kaggle 数据集在 Google Colab 中部分就是一个这样的设置示例),或者你可以在 Notebooks 框架内保持,但更换底层的机器。这就是 Google Cloud AI Notebooks 发挥作用的地方。

升级到 Google Cloud Platform (GCP)

升级到 GCP 的明显好处是获得更强大的硬件:由 Kaggle 免费提供的 Tesla P100 GPU 对于许多应用来说相当不错,但在性能方面并不是顶级的,16GB 的 RAM 在资源密集型应用(如大型 NLP 模型或高分辨率图像处理)中也可能相当有限。虽然执行时间的改进是明显的,导致开发周期中迭代速度更快,但这是有代价的:你需要决定你愿意花多少钱。对于强大的机器处理数字,时间可以说是实实在在的钱。

为了将你的笔记本迁移到 GCP 环境,请转到右侧的侧边菜单并点击升级到 Google Cloud AI 笔记本

包含文本的图像 自动生成的描述

图 3.14:升级到 Google Cloud AI 笔记本选项

你将看到以下提示:

包含文本的图像 自动生成的描述

图 3.15:升级到 Google Cloud AI 平台笔记本提示

当你点击继续时,你将被重定向到 Google Cloud Platform 控制台,在那里你需要配置你的计费选项。提醒:GCP 不是免费的。如果是你第一次使用,你需要完成一个教程,引导你完成必要的步骤。

更进一步

如本章前面所述,Kaggle 笔记本是教育和参加比赛的一个极好的工具;但它们也充当了一个非常有用的组件,即你可以用来展示你的数据科学技能的资料夹。

在构建你的数据科学资料夹时,有许多潜在的考虑因素(品牌、受众范围、向潜在雇主推销等),但如果没有人能找到它,那么它们都不重要。因为 Kaggle 是 Google 的一部分,笔记本由世界上最受欢迎的搜索引擎索引;所以如果有人正在寻找与你代码相关的主题,它将出现在他们的搜索结果中。

下面,我展示了一个个人例子:几年前,我为一项比赛编写了一个笔记本。我想解决的问题是对抗验证(对于那些不熟悉这个话题的人来说:一个相当简单的方法来查看你的训练集和测试集是否有相似分布,就是构建一个二元分类器,训练它来区分它们;这个概念在第六章设计良好的验证中有更详细的介绍)。在撰写本章时,我试图搜索这个笔记本,结果它出现在搜索结果的高位(注意我在查询中没有提到 Kaggle 或任何个人细节,如我的名字):

包含文本的图像 自动生成的描述

图 3.16:Konrad 的笔记本出现在 Google 上

接下来谈谈使用 Notebooks 展示技能集的其他好处:就像竞赛数据集讨论一样,笔记本也可以获得投票/奖牌,从而在进步系统和排名中定位你。你可以远离竞赛赛道,仅通过专注于社区欣赏的高质量代码,成为专家、大师或大师级。

最新的进步要求版本可以在www.kaggle.com/progression找到;以下是我们提供的与专家和大师级别相关的快照:

包含文本的图像 自动生成的描述

图 3.17:等级进步要求

在笔记本类别中进步可能是一个具有挑战性的经历;虽然比竞赛容易,但绝对比讨论难。最受欢迎的笔记本是与特定竞赛相关的:探索性数据分析、端到端的概念验证解决方案,以及排行榜追逐;遗憾的是,人们通常会克隆得分最高的公开笔记本,调整一些参数以提高分数,然后广受赞誉(如果点赞可以被视为情绪的衡量标准)。这并不是要阻止读者在 Kaggle 上发布高质量的作品——大多数 Kagglers 都欣赏新颖的工作,而且从长远来看,质量确实占上风——但需要对期望进行现实的调整。

你的 Kaggle 个人资料附带关注者,并为你提供了链接其他专业网络如 LinkedIn 或 GitHub 的可能性,这样你就可以利用在社区中获得的联系:

![B17574_03_18.png]

图 3.18:Konrad 的 Kaggle 个人资料

在这个时代,对“社区建设”的宣称持怀疑态度是很常见的,但在 Kaggle 的情况下,这竟然是真的。他们在数据科学领域的品牌认知度无人能及,无论是对于从业者还是那些真正做足功课的招聘者来说都是如此。在实践中,这意味着一个(足够好的)Kaggle 个人资料已经可以让你迈过门槛;正如我们都知道的,这通常是最难的一步。

马丁·亨泽的图片

Martin Henze

www.kaggle.com/headsortails

我们有幸采访了 Martin Henze,也就是 Heads or Tails,他是 Kaggle 的 Notebooks 和 Discussion 领域的 Kaggle 大师,同时也是 Edison Software 的数据科学家。Martin 还是《每周笔记本精选:隐藏的宝石》的作者,这是一周精选的最好笔记本,它们都逃过了公众的注意。你可以通过关注他的 Kaggle 个人资料或 Twitter 和 LinkedIn 上的账户来获取新的隐藏宝石帖子。

你最喜欢的比赛类型是什么?为什么?在技术、解决方法方面,你在 Kaggle 上的专长是什么?

长期以来,我的重点是 EDA(探索性数据分析)笔记本,而不是排行榜预测本身。在我加入 Kaggle 之前的大部分经验都与表格数据有关,我的大多数 EDA 笔记本都涉及从新推出的表格挑战中提取复杂的见解。我仍然认为这是我在 Kaggle 上的专长,我花了很多时间来构建我的笔记本的结构、数据可视化和叙事。

你是如何处理 Kaggle 竞赛的?这种处理方式与你在日常工作中所做的是如何不同的?

即使 Kaggle 已经从表格竞赛转向,我仍然坚信数据本身是任何挑战最重要的方面。很容易过早地专注于模型架构和超参数调整。但在许多竞赛中,成功的关键仍然是一个以对数据集及其怪癖和独特性有详细了解为中心的方法。这对于图像数据、NLP、时间序列以及你能想到的任何其他数据结构都是正确的。因此,我总是在构建一个简单的基线模型、一个 CV 框架之前,先进行广泛的 EDA(探索性数据分析)。

与我的数据科学日常工作相比,主要的不同可能在于,大多数有经验的人在新挑战的第一周内就能构建出的基线模型可能被认为是足够投入生产的。在许多情况下,在那几天之后,我们在得分指标方面已经超过了最终获胜者的解决方案的 80%以上。当然,Kaggle 的乐趣和挑战在于找到创造性的方法来获得最后几个百分点的准确性。但在行业工作中,你的时间通常更有效地用于处理新的项目。

Kaggle 是否帮助了你在职业生涯中?如果是的话,是如何帮助的?

Kaggle 对我的职业生涯产生了巨大的影响。在 Kaggle 社区中的良好经历激励我从学术界转向行业。如今,我在一家科技初创公司担任数据科学家,并通过 Kaggle 挑战不断成长和磨练我的技能。

在我的情况下,我对构建广泛的 Kaggle Notebooks 的关注帮助了我很多,因为我可以很容易地使用它们作为我的作品集。我不知道招聘经理实际上会多频繁地查看这些资源,但我经常有一种印象,我的大师级称号可能比我的博士学位为我打开更多的门。或者可能是两者的结合。无论如何,我强烈推荐拥有一个公开 Notebooks 的作品集。此外,在我的求职过程中,我使用了在 Kaggle 上学到的策略来解决各种带回家的作业,并且它们对我很有帮助。

根据你的经验,没有经验的 Kagglers 通常忽略了什么?你现在知道的事情,你希望在你刚开始的时候就知道?

我认为我们都在 不断积累经验。现在我们都比十年前、五年前甚至一年前更聪明了。抛开这些不说,一个经常被忽视的关键方面是,你需要为你要做的事情制定一个计划,并执行和记录这个计划。对于新加入 Kaggle 的人来说,这是一个完全可以理解的错误,因为一切都是新颖的、复杂的,至少有些令人困惑。我知道当我第一次加入 Kaggle 时,它对我来说很困惑。你可以做很多事情:论坛、数据集、挑战、课程。而且比赛可能会让人感到非常害怕:神经元细胞实例分割;股票市场波动预测。这些到底是什么东西?但比赛也是开始的最佳地方。

因为当一项比赛启动时,没有人真正了解它。是的,可能有一个人的博士论文几乎与这个主题完全相同。但这种情况很少见。其他人,我们几乎都是从零开始的。深入研究数据,玩转损失函数,运行一些简单的入门模型。当你一开始加入比赛时,你会以社区成员的身份以加速的方式经历所有学习曲线。你与其他人一起学习,他们会给你提供大量的想法。但你仍然需要一个计划。

这个计划很重要,因为盲目地运行一些实验,看到所有的 GPU RAM 都被使用,会让人感到很满足。但随后你会忘记哪个版本的你模型表现最好,局部验证和排行榜之间是否有相关性?我已经测试过这个参数组合了吗?所以写下你要做什么,然后记录结果。现在有越来越多的工具可以为你做记录,但这也可以通过一个自定义脚本来轻松完成。

机器学习仍然主要是一门实验科学,高效实验的关键在于精心规划实验并记录所有结果,以便进行比较和分析。

你在过去比赛中犯过哪些错误?

我犯过很多错误,我希望我已经从中学到了东西。没有建立健壮的交叉验证框架是其中之一。没有考虑到训练集和测试集之间的差异。做了太多的 EDA(探索性数据分析)而忽略了模型构建——这可能是我在前几次比赛中犯下的标志性错误。没有做足够的 EDA 而遗漏了某些重要内容——是的,我也犯过这样的错误。没有选择我的最后两个提交。(最终并没有带来太大的变化,但我仍然不会忘记这一点。)

关于错误,这与我之前关于实验和有计划的观点相似。如果你从错误中学习,并且它们帮助你成长和进化,那么错误是可以接受的。但你应该尽量避免那些可以通过预见避免的简单错误。但在机器学习(和科学!)中,失败几乎是过程的一部分。不是所有的事情都会一直有效。这是可以的。但你不想一次又一次地犯同样的错误。所以,唯一的真正错误就是没有从错误中学习。这在 Kaggle 竞赛和生活中都是正确的。

您是否推荐使用特定的工具或库来进行数据分析或机器学习?

我知道我们越来越生活在 Python 的世界里,但说到表格处理和数据分析可视化,我仍然更喜欢 R 及其 tidyverse:dplyr、ggplot2、lubridate 等。新的 tidymodels 框架是 sklearn 的有力竞争者。即使你是 Python 的死忠粉丝,偶尔看看 pandas 之外的工具也是有益的。不同的工具往往能带来不同的视角和更多的创造力。在深度学习方面,我发现 PyTorch 及其 FastAI 界面最为直观。当然,现在每个人都喜欢 huggingface;而且有很好的理由。

当人们参加比赛时,他们应该记住或做些什么最重要的事情?

最重要的是要记得享受乐趣并学到东西。在比赛期间和之后,有如此多的宝贵见解和智慧被分享,如果不吸收并从中成长,那就太可惜了。即使你唯一关心的是获胜,你也只能通过学习和实验,站在这个社区的基础上才能实现。但 Kaggle 远不止排行榜那么简单,一旦你开始为社区做出贡献并回馈,你将以更全面的方式成长。我保证。

Kaggle Learn 课程

Kaggle 的许多事情都与获取知识有关。无论是你在比赛中学到的东西,还是你在不断增长的存储库中找到的数据集,或者是展示一个以前未知的模型类别,总有新的东西可以探索。这个集合中最新的补充是汇集在Kaggle Learn标签下的课程:www.kaggle.com/learn。这些是 Kaggle 作为“获得独立数据科学项目所需技能的最快方式”进行营销的微课程,核心统一主题是跨各种主题的快速入门介绍。每个课程都分为小章节,后面跟着编码实践问题。这些课程使用 Notebooks 进行交付,其中必要的理论和阐述部分与预期你编码和实现的部分交织在一起。

下面,我们提供了一些最有用的简要概述:

  • 机器学习入门/中级机器学习: www.kaggle.com/learn/intro-to-machine-learningwww.kaggle.com/learn/intermediate-machine-learning

    这两门课程最好看作是一个两集系列:第一集介绍了机器学习中使用的不同类别的模型,随后讨论了不同模型共有的主题,如欠拟合/过拟合或模型验证。第二集深入探讨特征工程,处理缺失值和处理分类变量。对于刚开始机器学习之旅的人来说很有用

  • pandas: www.kaggle.com/learn/pandas

    这门课程提供了对现代数据科学中最基本工具之一的快速入门介绍。你首先学习如何创建、读取和写入数据,然后继续学习数据清洗(索引、选择、组合、分组等)。对于初学者(有时 pandas 的功能可能会令人不知所措)和实践者(作为复习/参考)都很有用

  • 游戏人工智能: www.kaggle.com/learn/intro-to-game-ai-and-reinforcement-learning

    这门课程是对 Kaggle 在学习模块中引入的技术课程部分的完美总结。你将编写一个游戏代理,调整其性能,并使用最小-最大算法。这可能是强化学习实践导向的入门介绍

  • 机器学习可解释性: www.kaggle.com/learn/machine-learning-explainability

    建立模型很有趣,但在现实世界中并非每个人都是数据科学家,所以你可能会发现自己需要向他人解释你所做的工作。这就是这个关于模型可解释性的迷你课程发挥作用的地方:你将学习如何使用三种不同的方法来评估你的特征的相关性:置换重要性、SHAP 和部分依赖图。对于在商业环境中使用机器学习的人来说,这极为有用,因为项目的成败取决于信息传达的好坏

  • AI 伦理: www.kaggle.com/learn/intro-to-ai-ethics

    这最后一门课程是对提案的一个非常有趣的补充:它讨论了指导 AI 系统道德设计的实用工具。你将学习如何识别 AI 模型中的偏差,检验 AI 公平性的概念,并了解如何通过传达 ML 模型信息来提高透明度。对于从业者来说非常有用,因为“负责任的 AI”这个短语我们将越来越常听到

除了 Kaggle 原创内容外,平台还有其他通过用户创建的笔记本提供的学习机会;鼓励读者自行探索。

Andrada_Olteanu

Andrada Olteanu

www.kaggle.com/andradaolteanu

Andrada Olteanu 是一位非常鼓励从笔记本中学习的 Kaggle 笔记本大师。Andrada 是 HP 全球数据科学大使,Endava 的数据科学家,以及 Weights & Biases 的 Dev 专家。我们与 Andrada 讨论了笔记本竞赛、她的职业生涯以及其他内容。

你最喜欢的竞赛类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

我会说我擅长的 Kaggle 领域更偏向于数据可视化,因为它使我能够将艺术和创意与数据相结合。

我不会说我有一个最喜欢的竞赛类型,但我会说我更喜欢偶尔变换一下,选择我觉得有趣的内容。

Kaggle 的美丽之处在于,一个人可以在学习多个数据科学领域(计算机视觉、NLP、探索性数据分析与统计学、时间序列等)的同时,也熟悉和舒适地了解许多主题(如体育、医疗领域、金融和加密货币、全球事件等)。

另一件很棒的事情是,例如,如果有人想提高处理文本数据的能力,几乎总有一个需要自然语言处理(NLP)的 Kaggle 竞赛。或者,如果有人想学习如何预处理和建模音频文件,也有竞赛可以培养这种技能。

告诉我们您参加的一个特别具有挑战性的竞赛,以及您使用了哪些见解来应对这项任务。

我参加过的最具挑战性的“竞赛”是“Kaggle 数据科学和机器学习年度调查”。我知道这并不是一个“真正的”竞赛——涉及排行榜和强大的机器学习——然而对我来说,这是我参与并学到最多的一次竞赛。

这是一个笔记本竞赛,用户必须发挥创意才能赢得 Kaggle 提供的 5 个奖项之一。我连续参加了两年。在第一年(2020 年),它挑战了我的更“基础”的视觉化技能,并迫使我跳出思维定式(我获得了第三名);在第二年(2021 年),我通过学习 D3 为它准备了大约 4 个月,试图在我的数据可视化技能上达到一个新的水平(仍在审查中;到目前为止,我已经赢得了“早期笔记本奖”奖项)。我可以提供的最佳见解是:

  • 首先,不要迷失在数据中,并尝试创建尽可能准确的图表;如果需要,建立双重验证方法以确保你所展示的是清晰和简洁的。没有什么比一个展示不准确见解的美丽图表更糟糕了。

  • 尝试从你周围寻找灵感:从自然、从电影、从你的工作中。你可以借鉴惊人的主题和有趣的方式来美化你的可视化。

Kaggle 是否帮助你在职业生涯中取得进步?如果是,如何?

是的。非常。我相信我现在在职业生涯中所处的位置很大一部分要归功于 Kaggle,为此我永远感激。通过 Kaggle,我成为了 HP 的 Z 大使;我还发现了 Weights & Biases,这是一个惊人的机器学习实验平台,现在我是他们的一名自豪的 Dev 专家。最后但同样重要的是,通过这个平台,我与我现在的 Endava 首席数据科学家建立了联系,他招募了我,并且我从那时起一直与他合作。简而言之,我在 Endava 的职位以及我与两家大型公司(HP 和 Weights & Biases)的联系都是我 Kaggle 平台活动直接的结果。

我认为 Kaggle 最被忽视的方面是社区。Kaggle 拥有最大的群体,所有的人都聚集在一个方便的地方,你可以从中建立联系、互动和学习。

最好的利用方式是,例如,从每个 Kaggle 部分(比赛、数据集、笔记本——如果你愿意,还可以是讨论)中选出前 100 人,然后在 Twitter/LinkedIn 上关注那些在个人资料上分享这些信息的人。这样,你可以开始定期与这些充满洞察力和知识的人互动。

你在过去比赛中犯过哪些错误?

我在过去比赛中犯的最大错误是没有参加比赛。我相信这是初学者进入平台时犯的最大、最根本的错误。

出于恐惧(我是在个人经验的基础上说的),他们认为他们还没有准备好,或者他们不知道如何开始。幸运的是,如果你遵循一个简单的系统,进入任何比赛都会变得非常容易:

  • 参加任何你喜欢的或听起来有趣的比赛。

  • 探索描述页面和数据。

  • 如果你没有任何开始的方法,不用担心!只需进入“代码”部分,寻找获得大量点赞或由经验丰富的人,如大师级人物制作的笔记本。开始做一个“代码跟随”笔记本,在那里你查看别人做了什么,并“复制”它,研究并尝试自己改进。在我看来,这是最好的学习方式——你永远不会卡住,你通过在一个具体项目中实践来学习。

当人们参加比赛时,他们应该记住或做最重要的事情是什么?

他们应该记住,失败是可以接受的,因为通常这是最好的学习方式。

他们还应该记住的是,始终向竞赛大师学习,因为他们通常是那些分享和解释可能从未想到过的机器学习技术的人。学习某样东西的最好方式是观察那些“已经成功”的人,这样你的成功之路就不会那么颠簸,而是更加无痛、顺畅和迅速。选择 2-3 位你真正钦佩的大师,让他们成为你的老师;研究他们的笔记,一起编写代码,尽可能多地学习。

你是否使用其他竞赛平台?它们与 Kaggle 相比如何?

我从未使用过任何其他竞赛平台——仅仅因为我感觉 Kaggle 已经拥有一切。

摘要

在本章中,我们讨论了 Kaggle 笔记,这是一种多用途、开放的编码环境,可用于教育、实验,以及推广你的数据科学项目组合。你现在可以创建自己的笔记,有效地利用可用资源,并将结果用于竞赛或个人项目。

在下一章中,我们将介绍讨论论坛,这是在 Kaggle 上交换想法和意见的主要形式。

加入我们书的 Discord 空间

加入本书的 Discord 工作空间,参加每月一次的作者“问我任何问题”活动:

packt.link/KaggleDiscord

第四章:利用讨论论坛

讨论论坛是 Kaggle 上信息交流的主要手段。无论是讨论正在进行的竞赛,还是关于数据集或笔记本的对话,Kagglers 总是在谈论事情。

在本章中,我们介绍了讨论论坛:它们的组织方式以及管理其中丰富信息的守则。我们涵盖了以下主题:

  • 论坛如何运作

  • 竞赛讨论的方法

  • 网络礼仪

论坛如何运作

您可以通过多种方式进入讨论论坛。最直接的方式是在左侧面板中点击讨论

包含文本的图片 自动生成的描述

图 4.1:从主菜单进入讨论页面

顶部部分包含论坛,它们是一般主题的聚合。浏览这些内容对您来说很有用,无论您是第一次参加竞赛,还是提出建议,或者只是因为感到迷茫而有一个一般性的问题。

在论坛下方,您可以找到 Kaggle 上讨论的合并视图:主要是与竞赛相关的对话(这构成了 Kaggle 上大部分的活动),但也包括笔记本或值得注意的数据集。默认情况下,它们按热度排序;换句话说,参与度和活动量最高的内容显示在顶部附近。在这个部分,您可以找到与该领域动态性质更相关的内容:来自 Kaggle 不同子集的讨论集合,您可以根据特定标准进行筛选:

包含文本的图片 自动生成的描述

图 4.2:来自 Kaggle 的讨论

根据您的兴趣,您可以通过使用筛选器开始个性化内容。根据您的偏好,您可以按以下方式筛选:

  • 最近性:允许您控制您正在追赶的信息范围

  • 我的活动:如果您需要查看所有论坛中的评论/出版物/观点的概览;如果您同时参与多个讨论,这将非常有用

  • 管理员:提供 Kaggle 管理员公告的快速概览

  • 类型:讨论可以在一般论坛、特定竞赛或数据集周围进行

  • 标签:虽然并非无处不在,但有几个讨论被标记,并且这种功能允许用户利用这一事实:

包含文本的图片 自动生成的描述

图 4.3:讨论可用的筛选器

下一个图显示了在初学者标签上筛选讨论的示例输出:

包含文本的图片 自动生成的描述

图 4.4:筛选标记为“初学者”的讨论

作为一种替代,你也可以专注于一个特定的主题;由于像计算机视觉这样的主题吸引了大量关注,因此对主题进行排序可能是有用的。你可以按热度最近评论最近发布最多投票最多评论排序:

包含文本的图像 自动生成的描述

图 4.5:通用讨论论坛中的计算机视觉主题子集

人们来到 Kaggle 出于各种原因,但尽管 Notebooks 的流行度有所增长,比赛仍然是主要的吸引力。每个 Kaggle 比赛都有自己的专用讨论论坛,你可以通过进入比赛页面并选择讨论来进入:

包含文本的图像 自动生成的描述

图 4.6:比赛的讨论论坛

并非总是如此,但如今几乎所有的比赛都在其专用讨论论坛的顶部固定了一个 FAQ 主题。从这里开始是两个主要原因的好主意:

  • 这可以节省你的时间;最流行的查询可能在那里得到了解答。

  • 你可以避免在论坛的其余部分提出重复或重复的问题,从而使每个人的体验都变得更好。

与 Notebooks 一样,讨论论坛有一个选项,允许你将特别相关的主题标记为书签以供以后参考:

图 4.7:在讨论论坛中标记一个主题

你可以在个人资料页面上找到所有标记主题的概述:

包含文本的图像 自动生成的描述

图 4.8:在讨论论坛中标记一个主题

示例讨论方法

在某个时刻在比赛中感到迷茫是完全正常的事情:你来了,尝试了一些想法,在排行榜上获得了一些进展,然后你遇到了 Kaggle 版本的跑步者墙。这是讨论论坛成为咨询场所的时刻。

例如,我们将查看Optiver 实现波动率预测比赛(www.kaggle.com/c/optiver-realized-volatility-prediction),组织者是这样描述的:

在这个比赛的最初三个月,你将构建预测不同行业数百只股票短期波动的模型。你将拥有数亿行高度细粒度的金融数据在你的指尖,你将利用这些数据设计你的模型,预测 10 分钟期间的波动。你的模型将在训练后的三个月评估期内收集的真实市场数据上进行评估。

这里有很多东西需要解释,因此我们将概述这个挑战的主要组成部分,并展示它们如何通过讨论论坛来处理。首先,参加这个比赛需要一定程度的金融知识;可能不是经验丰富的交易员水平,但理解计算波动性的不同方式对于外行人来说当然不是微不足道的(在这个特定问题上,大多数 Kagglers 都是外行人)。幸运的是,对于参赛者来说,组织者在比赛期间非常活跃,并提供了旨在帮助新进入该领域的人的资源:www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/273923

如果入门知识仍然不足以开始,请不要犹豫,在公共场合弄清楚事情并寻求帮助,就像这里:www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/263039

或者这里:www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/250612

随着比赛的进行,人们开始开发越来越复杂的模型来处理这个问题。这里需要找到一个平衡点:一方面,如果你从分享发现的前辈那里学到了东西,你可能想回馈一些东西;另一方面,你不想通过发布所有优秀的代码作为笔记本来泄露你的(潜在的)优势。一个合理的折衷方案是在论坛比赛的帖子中讨论,例如,你的特征想法,就像这个帖子一样:www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/273915

近年来,越来越多的比赛正在摆脱固定的测试数据集格式,并引入某种变化:有时它们强制使用 Kaggle API(这些比赛需要从笔记本提交),其他则引入一个特殊的日程表,分为训练阶段和对实时数据的评估。Optiver 就是这种情况:

在最终提交截止日期之后,将定期更新排行榜,以反映将针对所选笔记本运行的市场数据更新。更新将大约每两周进行一次,并调整以避免冬季假期。

虽然制定起来很简单,但这种设置在重新训练和更新模型时产生了一些挑战。如果你遇到这种情况,请随时提问,就像在这个比赛中参赛者所做的那样:www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/249752

在 Kaggle 竞赛中,为你的训练模型制定一个验证方案始终是一个重要的话题,通常与永久的“CV vs LB”(交叉验证与排行榜)讨论相结合。Optiver 竞赛也不例外:www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/250650

除非已经存在这样的帖子——并且检查一下总是个好主意,以最大限度地减少冗余——你可能还想考虑一种相关的帖子类型:单一模型性能。迟早,每个人都会开始使用模型集成,但没有好的单一模型组件,它们效率并不高。对知识的协作追求不会就此停止:如果你认为你找到了处理问题的更好方法,分享它可能是个好主意。要么你会为他人做些有用的事情,要么你会发现自己错了(节省你的时间和精力);无论如何,正如这个讨论所示,这是一个胜利,例如:www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/260694

除了显而易见的个人好处(你可以窥见其他竞争对手的表现),这样的帖子还允许社区内进行信息交流,促进协作元素,对初学者也有帮助。这样的讨论例子可以在www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/250695找到。

如果你已经阅读了上述话题,你仍然可能会想知道:我遗漏了什么重要的东西吗? Kaggle 是一个可以完美提问的地方:www.kaggle.com/c/optiver-realized-volatility-prediction/discussion/262203

让我们拓宽我们的关注范围,到其他竞赛来结束这一部分。我们上面提到了验证,这对于 Kaggler 来说总是与信息泄露和过拟合的话题相关联。在第六章中广泛讨论了泄露问题,该章节专门讨论设计验证方案。在这里,我们简要地讨论了它们是如何通过讨论来处理的。由于 Kaggle 是一个好奇的人组成的社区,如果有泄露的怀疑,有人很可能会提出这个话题。

例如,文件名或记录的 ID 可能包含时间戳,这意味着它们可以被逆向工程,有效地窥视未来,并产生一个不切实际的低误差指标值。这种情况发生在Two Sigma Connect竞赛中(www.kaggle.com/c/two-sigma-connect-rental-listing-inquiries/)。你可以在 Kazanova 的帖子中了解更多详情:www.kaggle.com/c/two-sigma-connect-rental-listing-inquiries/discussion/31870#176513

另一个例子是空中客车船检测挑战赛(www.kaggle.com/c/airbus-ship-detection),参赛者需要在卫星图像中定位船只。结果发现,相当一部分测试图像是训练图像中的随机裁剪,匹配这两者相对简单:www.kaggle.com/c/airbus-ship-detection/discussion/64355#377037

一系列相当臭名昭著的竞赛是由桑坦德银行赞助的。在这家公司组织的三次 Kaggle 竞赛中,两次涉及数据泄露:www.kaggle.com/c/santander-value-prediction-challenge/discussion/61172

接下来发生的事情因竞赛而异:有几次 Kaggle 决定用新的或清理后的数据重置竞赛,但也有时候他们允许竞赛继续(因为他们认为影响很小)。处理这种情况的一个例子可以在预测红帽商业价值竞赛中找到:www.kaggle.com/c/predicting-red-hat-business-value/discussion/23788

尽管数据泄露可能会严重扰乱竞赛,但好消息是,在过去的 2-3 年里,Kaggle 上的数据泄露几乎已经消失——所以,希望这部分内容只会被阅读一次,而不会成为你在平台上经验的常态。

在平台上经验的主题是进行大师访谈的一个很好的过渡。

谢一帆

www.kaggle.com/yifanxie

谢一帆是一位讨论和竞赛大师,同时也是 Arion.ai 的联合创始人。以下是他对参加竞赛和与其他 Kagglers 合作的一些看法。

你最喜欢的竞赛类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

我实际上没有特别喜欢的类型;我喜欢解决各种类型的问题。在技术方面,我已经建立了一个坚实的机器学习模块流水线,使我能够快速地将典型技术和算法应用于大多数数据问题。我认为这对我来说是一种竞争优势:专注于标准化,无论是工作流程还是随着时间的推移技术工件。这允许更快地进行迭代,从而有助于提高进行数据实验的效率,这是 Kaggle 的核心组成部分。

你是如何处理 Kaggle 竞赛的?这种处理方式与你在日常工作中所做的是如何不同的?

随着时间的推移,我发展了一种特定的方式来管理和收集我大多数主要数据项目的信息。这适用于工作、Kaggle 竞赛和其他副项目。通常,我会以标准化的格式捕获有用的信息,如书签、数据字典、待办事项列表、有用的命令和实验结果,并为每个竞赛分配一个格式,当在团队中竞赛时,我会与我的队友分享这些信息。

请告诉我们你参加的一个特别具有挑战性的竞赛,以及你使用了哪些见解来处理这项任务?

对我来说,了解竞赛的更广泛背景总是很有用的;例如,支撑和产生我们正在工作的数据的社交/工程/金融流程是什么?对于可以有意义地观察个别数据点的竞赛,例如深度伪造检测挑战赛*,我会构建一个特定的仪表板(通常使用 Streamlit),使我能够检查个别数据点(在这种情况下,是一对真实和虚假的视频),以及将简单的统计收集整合到仪表板中,以便我更好地了解数据。*

Kaggle 是否帮助你在职业生涯中取得进步?如果是,是如何帮助的?

我认为 Kaggle 是我作为数据科学咨询公司共同所有者的当前职业道路中最有帮助的平台。它使我能够在几年内建立解决不同领域数据问题的技能和方法。我从 Kaggle 竞赛的团队组建中认识了一些客户和同事,尽管我现在在 Kaggle 上的活动较少,但它始终是我知识来源的好帮手。

在你的经验中,没有经验的 Kaggle 参赛者通常忽略了什么?你现在知道什么,而当时你刚开始时希望知道的?

对于 Kaggle 的新手来说,我能看到的错误是忽略了关键的非技术问题:团队规则、数据使用、私人信息的共享、出于无害原因使用多个账户等。这些错误可能会完全无效化一个人通常需要数月才能完成的竞赛努力。

我最初希望知道的一件事就是不要担心在公共排行榜上的日常位置——这给自己带来了不必要的压力,并导致过度拟合。

对于数据分析或机器学习,有没有任何特定的工具或库推荐使用?

通常:Scikit-learn、XGB/LGB、PyTorch 等。我推荐大家学习并精通的一个工具是 NumPy,特别是对于更高级的信息排序和子集操作;这些是 pandas 通过懒惰方法可以轻松完成的事情,但 NumPy 中的更复杂版本会带来更高的效率。

当人们参加竞赛时,他们应该牢记或做些什么最重要的事情?

在我的书中,从事任何数据科学相关工作的原因有四个:为了盈利、为了知识、为了乐趣和为了公益。对我来说,Kaggle 始终是一个知识宝库,而且经常是一个很好的记忆来源,所以我的建议总是提醒自己,排名是暂时的,但知识和记忆是永恒的:)

你是否使用其他竞赛平台?它们与 Kaggle 相比如何?

我是一个 非常活跃的 Numerai 参与者。对我来说,基于我从事数据科学的四个原因,它更多的是为了盈利,因为他们通过其加密货币提供收益。它更多的是一种个人努力,因为在像 Numerai 这样的交易竞赛平台上,团队协作并没有真正的好处;他们既不鼓励也不禁止,但就是这样,更多的人力资源并不总是等同于更好的盈利。

对我来说,在忙碌的工作日程期间,Numerai 比 Kaggle 更可持续,因为每轮的训练数据通常保持不变,我可以在构建初始模型后实现高度的生产化,以自动化预测和提交。

Numerai 的连续性功能使其更适合那些想要为表格数据集构建专用机器学习管道的人。

网络礼仪

任何在线超过 15 分钟的人都知道这一点:在讨论中,无论话题多么无辜,总有可能人们会变得情绪化,对话会离开文明光谱的文明部分。Kaggle 也不例外,因此社区有适当的举止指南:www.kaggle.com/community-guidelines

这些原则不仅适用于讨论,也适用于 Notebooks 和其他形式的沟通。在 Kaggle 互动时,你应该牢记以下要点:

  • 不要陷入斯科特·亚当斯所说的心灵感应错觉:Kaggle 是一个来自世界各地(其中许多人英语不是他们的第一语言)的极其多样化的社区,所以保持细微差别是一个巨大的挑战。不要做出假设,并在可能的情况下尝试澄清。

  • 不要让事情变得个人化;上帝 wins 定律有其存在的理由。特别是,对受保护的不变特征的引用是一个绝对不能触碰的区域。

  • 你的里程可能不同,但事实仍然是:这并非 1990 年代的互联网狂野西部,当时在网上告诉某人去查阅手册(RTFM)是完全正常的;贬低往往会疏远人们。

  • 不要试图操纵进度系统(这是授予 Kaggle 奖牌的基础):这一方面涵盖了平台滥用的整个范围,从明确要求点赞,到串通,再到直接的作弊行为。

简而言之,以你希望别人如何对待你的方式对待他人,事情应该会顺利解决。

摘要

在本章中,我们讨论了讨论论坛,这是 Kaggle 平台上主要的沟通方式。我们展示了论坛的机制,向你展示了如何在更高级的比赛中利用讨论的例子,并简要总结了讨论的礼仪。

这本书的第一部分,也就是介绍部分到此结束。下一章标志着对如何最大化从 Kaggle 中获得收益的更深入探索的开始,并探讨了如何应对比赛中必须应对的众多不同任务和指标。

加入我们书籍的 Discord 空间

加入书籍的 Discord 工作空间,每月与作者进行一次“问我任何问题”的会议:

packt.link/KaggleDiscord

第二部分

锻炼技能以备竞赛

第五章:竞赛任务和指标

在竞赛中,你首先检查目标指标。理解你的模型错误是如何评估的是在每一场竞赛中取得高分的关键。当你的预测提交到 Kaggle 平台时,它们将与基于目标指标的真实数据进行比较。

例如,在泰坦尼克号竞赛(www.kaggle.com/c/titanic/)中,你所有的提交都将根据准确率进行评估,即正确预测的幸存乘客百分比。组织者选择这个指标是因为竞赛的目的是找到一个模型,该模型可以估计在类似情况下乘客生存的概率。在另一个知识竞赛房价 - 高级回归技术(www.kaggle.com/c/house-prices-advanced-regression-techniques)中,你的工作将根据你的预测与真实数据之间的平均差异进行评估。这涉及到计算对数、平方和开方,因为模型预计能够尽可能准确地量化待售房屋价格的高低顺序。

在现实世界的数据科学中,目标指标也是你项目成功的关键,尽管现实世界与 Kaggle 竞赛之间肯定存在差异。我们可以简单地总结说,现实世界中有更多的复杂性。在现实世界的项目中,你将经常面对不止一个而是多个指标,你的模型将根据这些指标进行评估。通常,一些评估指标甚至与你的预测与用于测试的真实数据之间的表现无关。例如,你正在工作的知识领域,项目的范围,你的模型考虑的特征数量,整体内存使用量,对特殊硬件(例如 GPU)的任何要求,预测过程的延迟,预测模型的复杂性,以及许多其他方面,最终可能比单纯的预测性能更重要。

现实世界的问题确实比你在参与其中之前想象的要更多地受到商业和技术基础设施的关注。

尽管如此,你无法回避这样一个事实:无论是现实世界项目还是 Kaggle 竞赛的核心基本原则都是相同的。你的工作将根据某些标准进行评估,理解这些标准的细节,以智能的方式优化你模型的拟合度,或者根据这些标准选择其参数,这些都将为你带来成功。如果你能更多地了解 Kaggle 中模型评估的流程,你的现实世界数据科学工作也将从中受益。

在本章中,我们将详细说明某些类型问题的评估指标如何强烈影响你在数据科学竞赛中构建模型解决方案时的操作方式。我们还讨论了 Kaggle 竞赛中可用的各种指标,以给你一个关于什么最重要的概念,并在边缘讨论了指标对预测性能的不同影响以及如何正确地将它们转化为你的项目。我们将涵盖以下主题:

  • 评估指标和目标函数

  • 基本任务类型:回归、分类和序型

  • Meta Kaggle 数据集

  • 处理未见过的指标

  • 回归指标(标准型和序型)

  • 二元分类指标(标签预测和概率)

  • 多类分类指标

  • 目标检测问题的指标

  • 多标签分类和推荐问题的指标

  • 优化评估指标

评估指标和目标函数

在 Kaggle 竞赛中,你可以在竞赛的概述页面的左侧菜单中找到评估指标。通过选择评估选项卡,你可以获得关于评估指标的具体信息。有时你会找到指标公式、重现它的代码以及一些关于指标的讨论。在同一页面上,你还可以获得关于提交文件格式的说明,提供文件的标题和一些示例行。

评估指标与提交文件之间的关联很重要,因为你必须考虑到指标在训练模型并产生一些预测后基本上才会工作。因此,作为第一步,你必须考虑评估指标目标函数之间的区别。

将一切简化到基本原理,目标函数在训练过程中服务于你的模型,因为它涉及到错误最小化(或根据问题进行分数最大化)。相比之下,评估指标在模型训练后提供服务,通过提供一个分数。因此,它不能影响模型如何拟合数据,但以间接方式影响它:通过帮助你选择模型中最出色的超参数设置,以及竞争中的最佳模型。在继续本章的其余部分之前,这部分将向你展示这如何影响 Kaggle 竞赛以及为什么分析 Kaggle 评估指标应该是你在竞赛中的首要行动,让我们首先讨论一些你可能在讨论论坛中遇到的术语。

你经常会听到关于目标函数、损失函数和损失函数的讨论,有时可以互换使用。然而,它们并不完全相同,我们在这里解释了区别:

  • 损失函数是在单个数据点上定义的函数,它考虑了模型的预测和该数据点的真实值,计算一个惩罚。

  • 代价函数考虑了用于训练的整个数据集(或其一部分批次),通过计算其数据点的损失惩罚的总和或平均值。它可以包括进一步的约束,例如 L1 或 L2 惩罚,例如。代价函数直接影响到训练过程。

  • 目标函数是与机器学习训练中优化范围最通用(且安全使用)的术语:它包括代价函数,但不仅限于它们。实际上,目标函数还可以考虑与目标无关的目标:例如,要求估计模型的稀疏系数或系数值的极小化,如在 L1 和 L2 正则化中。此外,虽然损失和代价函数暗示基于最小化的优化过程,但目标函数是中立的,可以暗示学习算法执行的是最大化或最小化活动。

同样,当涉及到评估指标时,你会听到关于评分函数和误差函数的讨论。区分它们很容易:一个评分函数如果函数的分数更高,则暗示更好的预测结果,这意味着一个最大化过程。

误差函数则暗示如果函数报告较小的误差量,则会有更好的预测,这意味着一个最小化过程。

基本任务类型

并非所有目标函数都适用于所有问题。从一般的角度来看,你会在 Kaggle 竞赛中找到两种类型的问题:回归任务和分类任务。最近,也出现了强化学习RL)任务,但 RL 不使用指标进行评估;相反,它依赖于与其他竞争对手的直接对抗产生的排名,假设这些竞争对手的解决方案与你的表现相当(在这个对抗中表现优于你的同伴将提高你的排名,表现较差将降低它)。由于 RL 不使用指标,我们仍将继续提到回归-分类的二分法,尽管序数任务,其中你预测由整数表示的有序标签,可能逃避这种分类,并且可以使用回归或分类方法成功处理。

回归

回归需要你构建一个可以预测实数的模型;通常是一个正数,但也有预测负数的例子。一个经典的回归问题示例是 房价 - 高级回归技术,因为你需要猜测房屋的价值。回归任务的评估涉及计算你的预测与真实值之间的距离。这种差异可以通过不同的方式来评估,例如通过平方它来惩罚较大的错误,或者通过对其应用对数来惩罚错误尺度的预测。

分类

当你在 Kaggle 面对分类任务时,需要考虑更多的细微差别。实际上,分类可以是 二元多类多标签

二元问题中,你必须猜测一个示例是否应该被分类到特定的类别中(通常称为 类,并与 类进行比较)。在这里,评估可能包括对类归属的直接预测,或者对这种归属概率的估计。一个典型的例子是 泰坦尼克号 比赛,你必须猜测一个二元结果:是否幸存。在这种情况下,比赛的要求仅仅是预测,但在许多情况下,提供概率是必要的,因为在某些领域,特别是医疗应用中,需要对不同选项和情况下的阳性预测进行排序,以便做出最佳决策。

虽然在二元分类中计算正确匹配的确切数量似乎是一个有效的方法,但当正负类之间存在不平衡时,这实际上并不会很好地工作,也就是说,正负类中的示例数量不同。基于类别不平衡分布的分类需要考虑不平衡的评估指标,如果你想正确跟踪模型上的改进。

当你有超过两个类别时,你面临的是一个 多类 预测问题。这也需要使用合适的评估函数,因为需要跟踪模型的总体性能,同时也要确保跨类别的性能是可比的(例如,你的模型可能在某些类别上表现不佳)。在这里,每个案例只能属于一个类别,而不能属于其他任何类别。一个很好的例子是 叶分类 (www.kaggle.com/c/leaf-classification),其中每张叶片样本的图像都必须与正确的植物物种相关联。

最后,当你的类别预测不是互斥的,并且你可以为每个示例预测多个类别所有权时,你就遇到了一个多标签问题,这需要进一步的评估来控制你的模型是否正在预测正确的类别,以及正确的类别数量和组合。例如,在希腊媒体监测多标签分类(WISE 2014)www.kaggle.com/c/wise-2014)中,你必须将每篇文章与它所涉及的所有主题关联起来。

有序

在一个涉及对有序尺度预测的问题中,你必须猜测有序的整数数值标签,这些标签自然是按顺序排列的。例如,地震的震级就属于有序尺度。此外,市场调研问卷中的数据通常也记录在有序尺度上(例如,消费者的偏好或意见一致性)。由于有序尺度由有序值组成,因此有序任务可以被视为介于回归和分类之间的一种任务,你可以用这两种方式来解决它们。

最常见的方法是将你的有序任务视为一个多类问题。在这种情况下,你将得到一个整数值(类别标签)的预测,但预测不会考虑这些类别有一定的顺序。如果你查看类别的预测概率,你会感觉到将问题作为多类问题处理可能存在问题。通常,概率将分布在所有可能值的整个范围内,描绘出一个多模态且通常不对称的分布(而你应该期望最大概率类周围有一个高斯分布)。

解决有序预测问题的另一种方法是将它视为一个回归问题,然后对结果进行后处理。这样,类之间的顺序将被考虑在内,尽管预测输出不会立即用于评估指标上的评分。实际上,在回归中,你得到的是一个浮点数作为输出,而不是表示有序类的整数;此外,结果将包括你有序分布中的整数之间的全部值,甚至可能还包括它之外的值。通过裁剪输出值并将它们通过单位舍入转换为整数可能可行,但这可能会导致一些需要更复杂后处理的误差(我们将在本章后面进一步讨论这个问题)。

现在,你可能想知道为了在 Kaggle 上取得成功,你应该掌握哪种类型的评估。显然,你必须掌握你所参加的竞赛的评估指标。然而,一些指标比其他指标更常见,这是你可以利用的信息。最常见的指标是什么?我们如何确定在使用了类似评估指标的竞赛中寻找洞察力的地方?答案是查阅 Meta Kaggle 数据集。

Meta Kaggle 数据集

Meta Kaggle 数据集(www.kaggle.com/kaggle/meta-kaggle)是 Kaggle 社区和活动的丰富数据集合,由 Kaggle 本身作为公共数据集发布。它包含 CSV 表格,其中充满了来自竞赛、数据集、笔记本和讨论的公共活动。你只需要开始一个 Kaggle 笔记本(如你在第二章和第三章中看到的),添加 Meta Kaggle 数据集,并开始分析数据。CSV 表格每天都会更新,因此你将不得不经常刷新你的分析,但考虑到你可以从中获得的见解,这是值得的。

我们有时会在这本书中提到 Meta Kaggle 数据集,既作为许多有趣竞赛动态的灵感来源,也是为了收集有用的例子用于你的学习和竞赛策略。在这里,我们将用它来确定在过去七年里最常用于竞赛的评价指标。通过查看本章中最常见的指标,你将能够从稳固的起点开始任何竞赛,然后通过在论坛中找到的讨论来细化你对指标的了解,并掌握竞赛特有的细微差别。

在下面,我们介绍了生成指标及其每年计数的表格所需代码。它设计为可以直接在 Kaggle 平台上运行:

import numpy as np
import pandas as pd
comps = pd.read_csv("/kaggle/input/meta-kaggle/Competitions.csv")
evaluation = ['EvaluationAlgorithmAbbreviation',
              'EvaluationAlgorithmName',
              'EvaluationAlgorithmDescription',]
compt = ['Title', 'EnabledDate', 'HostSegmentTitle']
df = comps[compt + evaluation].copy()
df['year'] = pd.to_datetime(df.EnabledDate).dt.year.values
df['comps'] = 1
time_select = df.year >= 2015
competition_type_select = df.HostSegmentTitle.isin(
						['Featured', 'Research'])
pd.pivot_table(df[time_select&competition_type_select],
               values='comps',
               index=['EvaluationAlgorithmAbbreviation'],
               columns=['year'],
               fill_value=0.0,
               aggfunc=np.sum,
               margins=True
              ).sort_values(
                by=('All'), ascending=False).iloc[1:,:].head(20) 

在此代码中,我们读取包含竞赛相关数据的 CSV 表格。我们关注代表评估的列以及告诉我们竞赛名称、开始日期和类型的列。我们将行限制在自 2015 年以来举行且为特色或研究类型的竞赛(这些是最常见的类型)。我们通过创建 pandas 交叉表,结合评估算法和年份,并计算使用该算法的竞赛数量来完成分析。我们只显示前 20 个算法。

这里是生成的表格(截至写作时):

年份2015201620172018201920202021总计
评估算法
AUC441332017
LogLoss225232016
MAP@{K}130410110
CategorizationAccuracy10401208
MulticlassLoss23201008
RMSLE21311008
QuadraticWeightedKappa30012107
MeanFScoreBeta10121207
MeanBestErrorAtK00221106
MCRMSLE00100506
MCAUC10100305
RMSE11030005
Dice01102105
GoogleGlobalAP00121105
MacroFScore00010214
分数00300003
CRPS20001003
OpenImagesObjectDetectionAP00011103
MeanFScore00100023
RSNAObjectDetectionAP00010102

使用我们刚刚实例化的相同变量来生成表格,你还可以检查数据以找到采用你选择指标的竞赛:

metric = 'AUC'
metric_select = df['EvaluationAlgorithmAbbreviation']==metric
print(df[time_select&competition_type_select&metric_select]
        [['Title', 'year']]) 

在上面的片段中,我们决定表示使用 AUC 指标的竞赛。你只需更改表示所选指标的字符串,结果列表将相应更新。

回到生成的表格,我们可以检查在 Kaggle 主办的竞赛中最受欢迎的评估指标:

  • 两个最重要的指标彼此之间以及与二进制概率分类问题密切相关。AUC 指标有助于衡量你的模型预测概率是否倾向于以高概率预测阳性案例,而 Log Loss 指标有助于衡量你的预测概率与真实值之间的差距(并且当你优化 Log Loss 时,你也在优化 AUC 指标)。

  • 在第 3 位,我们发现 MAP@{K},这是推荐系统和搜索引擎中常用的一个指标。在 Kaggle 竞赛中,这个指标主要用于信息检索评估,例如在 座头鲸识别 竞赛(www.kaggle.com/c/humpback-whale-identification)中,你需要在五个可能的猜测中精确识别一只鲸鱼。MAP@{K} 的另一个应用示例是在 快速绘画!涂鸦识别挑战www.kaggle.com/c/quickdraw-doodle-recognition/)中,你的目标是猜测所画草图的内容,并且你有三次尝试的机会。本质上,当 MAP@{K} 是评估指标时,你可以评分的不仅仅是能否正确猜测,还包括你的正确猜测是否在一定的其他错误预测数量(函数名称中的“K”)中。

  • 只有在第 6 位,我们才能找到一个回归指标,即 RMSLERoot Mean Squared Logarithmic Error,在第 7 位是 Quadratic Weighted Kappa,这是一个特别有用的指标,用于估计模型在涉及猜测递增整数数(有序尺度问题)的问题上的性能。

当你浏览顶级指标列表时,你将不断发现这些指标在机器学习教科书中经常被讨论。在接下来的几节中,首先讨论当你遇到从未见过的指标时应该做什么(这种情况在 Kaggle 竞赛中发生的频率可能比你预期的要高),然后我们将回顾回归和分类竞赛中最常见的指标。

处理从未见过的指标

在继续之前,我们必须考虑的是,前 20 名表格并没有涵盖所有比赛中使用的指标。我们应该意识到,近年来有一些指标只被使用过一次。

让我们继续使用之前代码的结果来找出它们是什么:

counts = (df[time_select&competition_type_select]
          .groupby('EvaluationAlgorithmAbbreviation'))
total_comps_per_year = (df[time_select&competition_type_select]
                        .groupby('year').sum())
single_metrics_per_year = (counts.sum()[counts.sum().comps==1]
                           .groupby('year').sum())
single_metrics_per_year
table = (total_comps_per_year.rename(columns={'comps': 'n_comps'})
         .join(single_metrics_per_year / total_comps_per_year)
         .rename(columns={'comps': 'pct_comps'}))
print(table) 

因此,我们得到了以下表格,展示了每年有多少比赛使用了此后从未再被使用的指标(n_comps),以及这些比赛在每年中的比例(pct_comps):

 n_comps pct_comps
year                   
2015       28  0.179
2016       19  0.158
2017       34  0.177
2018       35  0.229
2019       36  0.278
2020       43  0.302
2021        8  0.250 

观察从未再被使用过的指标的竞赛相对份额,我们立即注意到它逐年增长,并在近年来达到了 25%-30%的水平,这意味着通常每三到四个竞赛中就有一个需要你从头开始研究和理解一个指标。

你可以通过一个简单的代码片段获取过去发生过的此类指标列表:

print(counts.sum()[counts.sum().comps==1].index.values) 

通过执行代码,你会得到一个类似这样的列表:

['AHD@{Type}' 'CVPRAutoDrivingAveragePrecision' 'CernWeightedAuc'
'FScore_1' 'GroupMeanLogMAE' 'ImageNetObjectLocalization'
'IndoorLocalization'  'IntersectionOverUnionObjectSegmentationBeta'
'IntersectionOverUnionObjectSegmentationWithClassification'
'IntersectionOverUnionObjectSegmentationWithF1' 'Jaccard'
'JaccardDSTLParallel' 'JigsawBiasAUC' 'LaplaceLogLikelihood'
'LevenshteinMean' 'Lyft3DObjectDetectionAP' 'M5_WRMSSE' 'MASpearmanR' 'MCRMSE' 'MCSpearmanR' 'MWCRMSE' 'MeanColumnwiseLogLoss' 'MulticlassLossOld' 'NDCG@{K}' 'NQMicroF1' 'NWRMSLE' 'PKUAutoDrivingAP' 'R2Score' 'RValue' 'RootMeanSquarePercentageError' 'SIIMDice' 'SMAPE' 'SantaResident' 'SantaRideShare' 'SantaWorkshopSchedule2019' 'TrackML'
 'TravelingSanta2' 'TwoSigmaNews' 'WeightedAUC' 'WeightedMulticlassLoss' 'WeightedPinballLoss' 'WeightedRowwisePinballLoss' 'YT8M_MeanAveragePrecisionAtK' 'ZillowMAE' 'football' 'halite' 'mab'] 

通过仔细检查,你可以找到许多与深度学习和强化学习比赛相关的指标。

当你遇到一个以前从未使用过的指标时,你会怎么做?当然,你可以依赖 Kaggle 讨论论坛中的讨论,在那里你总能找到好的灵感,以及许多愿意帮助你的 Kagglers。然而,如果你想建立自己对这一指标的知识,除了在谷歌上搜索之外,我们建议你尝试通过自己编写评估函数来实验它,即使是不完美的,并尝试模拟指标对模型产生的不同类型错误的反应。你也可以直接测试它在比赛训练数据样本或你准备好的合成数据上的功能。

我们可以引用一些 Kagglers 使用此方法的一些例子:

这可以让你对评估有更深入的了解,并比那些只依赖谷歌搜索和 Kaggle 论坛答案的竞争对手有优势。

罗汉·拉奥

www.kaggle.com/rohanrao

在我们开始探索不同的指标之前,让我们了解一下罗汉·拉奥(又名 Vopani)本人,他是H2O.ai的超级大师级高级数据科学家,关于他在 Kaggle 上的成功以及他要与我们分享的智慧。

你最喜欢的比赛类型是什么?为什么?在 Kaggle 上,你在技术和解决方法方面有什么专长?

我喜欢尝试不同类型的比赛,但我的最爱无疑是时间序列比赛。我不太喜欢行业中对时间序列的典型方法和概念,所以我倾向于通过以非常规的方式构建解决方案来创新和跳出思维定势,这对我的成功非常有帮助。

你如何处理 Kaggle 比赛?这种处理方式与你的日常工作有何不同?

对于任何 Kaggle 比赛,我的典型工作流程如下:

  • 理解问题陈述,并阅读所有与规则、格式、时间表、数据集、指标和交付成果相关的信息。

  • 深入数据。以任何可能的方式切割和分解它,并探索/可视化它,以便能够回答关于它的任何问题。

  • 使用基线模型构建一个简单的流水线,并提交以确认流程是否有效。

  • 工程师特征,调整超参数,并且 尝试多个模型以了解哪些通常有效,哪些无效。

  • 不断地回到分析数据,阅读论坛上的讨论,并尽可能调整特征和模型。也许在某个时刻可以组建团队。

  • 集成多个模型,并决定哪些提交作为最终版本。

在我的数据科学日常工作中,这些事情也经常发生。但还有两个额外需要的关键要素:

  • 为问题陈述准备和整理数据集。

  • 将最终模型或解决方案部署到生产环境中。

我在过去参与的大多数项目中,大部分时间都花在这两个活动上。

Kaggle 是否帮助了你的职业生涯?如果是,是如何帮助的?

我在机器学习中学到的绝大多数东西都来自 Kaggle。社区、平台和内容都是纯金,你可以学到的东西非常多。

对我最有益的是参加 Kaggle 比赛的经验;它使我在理解、构建和解决跨领域问题方面有了巨大的信心,我能够成功地将其应用于 Kaggle 之外的公司和项目中。

许多招聘人员联系我,寻求查看我的 Kaggle 成就的机会,主要是在竞赛方面。它相当好地表明了候选人在解决数据科学问题方面的能力,因此这是一个展示你的技能和建立作品集的绝佳平台。

你在过去比赛中犯过哪些错误?

我在每一场比赛中都犯过一些错误!这就是你学习和进步的方式。有时是编码错误,有时是验证设置有缺陷,有时是提交选择不正确!

重要的是要从这些经验中学习,并确保你不会重复它们。自动迭代这个过程有助于提高你在 Kaggle 上的整体表现。

你会推荐使用哪些特定的工具或库来进行数据分析/机器学习?

我坚信永远不要与一项技术结婚。使用最好的,最舒适和最有效的,但始终开放学习新的工具和库。

回归的度量(标准和序数)

当处理回归问题时,即涉及估计一个连续值(可能从负无穷大到正无穷大)的问题时,最常用的误差度量是RMSE(根均方误差)和MAE(平均绝对误差),但你也可以发现一些稍微不同的误差度量很有用,例如 RMSLE 或 MCRMSLE。

均方误差(MSE)和 R 平方

根均方误差是均方误差(MSE)的平方根,这实际上就是你在学习回归如何工作时学到的平方误差和(SSE)的平均值。

这是 MSE 的公式:

图片

让我们先解释一下公式是如何工作的。首先,n表示案例数量,是真实值,是预测值。你首先得到你的预测值和真实值之间的差异。然后你对差异进行平方(这样它们就变成正数或简单地为零),然后将它们全部相加,得到你的 SSE。然后你只需将这个度量除以预测的数量,以获得平均值,即 MSE。通常,所有回归模型都最小化 SSE,所以你不会在尝试最小化 MSE 或其直接导数(如R 平方,也称为确定系数)时遇到太大问题,它由以下公式给出:

图片

在这里,SSE(平方误差和)与平方和总(SST)进行比较,这实际上是响应的方差。实际上,在统计学中,SST 被定义为你的目标值与它们的平均值之间的平方差:

图片

换句话说,R 平方比较了模型平方误差与可能的最简单模型(响应平均值)的平方误差。由于 SSE 和 SST 具有相同的尺度,R 平方可以帮助你确定转换目标是否有助于获得更好的预测。

请记住,线性变换,如 minmax(scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html)或标准化(scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html),不会改变任何回归器的性能,因为它们是目标值的线性变换。非线性变换,如平方根、立方根、对数、指数及其组合,则应该肯定地修改你的回归模型在评估指标上的性能(如果你选择了正确的变换,希望是更好的)。

MSE 是用于比较应用于同一问题的回归模型的一个很好的工具。坏消息是 MSE 在 Kaggle 竞赛中很少使用,因为 RMSE 更受欢迎。实际上,通过取 MSE 的根,其值将类似于你的目标原始尺度,这将更容易一眼看出你的模型是否做得很好。此外,如果你正在考虑跨不同数据问题(例如,跨各种数据集或数据竞赛)的相同回归模型,R 平方更好,因为它与 MSE 完美相关,其值介于 0 和 1 之间,这使得所有比较都更容易。

根均方误差(RMSE)

RMSE 只是 MSE 的平方根,但这意味着一些微妙的变化。以下是它的公式:

图片

在上述公式中,n表示案例数量,图片是真实值,图片是预测值。在 MSE 中,由于平方操作,大的预测误差会受到极大的惩罚。在 RMSE 中,由于根效应,这种主导性减弱(然而,你应该始终注意异常值;无论你是基于 MSE 还是 RMSE 进行评估,它们都可能对你的模型性能产生很大影响)。

因此,根据问题,你可以在将目标值开平方(如果可能的话,因为这需要正值)然后平方结果之后,使用均方误差(MSE)作为目标函数来获得更好的算法拟合。Scikit-learn 中的TransformedTargetRegressor等函数可以帮助你适当地转换回归目标,以便在评估指标方面获得更好的拟合结果。

最近使用 RMSE 的竞赛包括:

根均方对数误差 (RMSLE)

MSE(均方误差)的另一种常见转换是根均方对数误差RMSLE)。MCRMSLE 只是由 COVID-19 预测竞赛推广的一种变体,它是当存在多个单一目标时,每个目标 RMSLE 值的列平均值。以下是 RMSLE 的公式:

在公式中,n表示案例数量,是真实值,是预测值。由于你在所有其他平方、平均和开根运算之前对预测值和真实值应用了对数变换,因此你不会对预测值和实际值之间的大差异进行惩罚,尤其是在两者都是大数的情况下。换句话说,当你使用 RMSLE 时,你最关心的是预测值与真实值规模的比例。与 RMSE 一样,如果你在拟合之前对目标应用对数变换,机器学习算法可以更好地优化 RMSLE(然后使用指数函数逆转效果)。

最近使用 RMSLE 作为评估指标的竞赛包括:

到目前为止,RMSLE(Root Mean Squared Log Error,根均方对数误差)是 Kaggle 竞赛中回归问题最常用的评估指标。

均值绝对误差 (MAE)

MAE平均绝对误差)评估指标是预测值与目标之间的差异的绝对值。以下是 MAE 的公式:

在公式中,n代表案例数量,是真实值,而是预测值。MAE 对异常值不敏感(与 MSE 不同,其中误差是平方的),因此你可能会发现它是在许多竞赛中使用的评估指标,这些竞赛的数据集包含异常值。此外,你可以轻松地与之合作,因为许多算法可以直接将其用作目标函数;否则,你可以通过仅对目标的平方根进行训练,然后对预测值进行平方来间接优化它。

在下行方面,使用 MAE 作为目标函数会导致收敛速度大大减慢,因为你实际上是在优化预测目标的中位数(也称为 L1 范数),而不是均值(也称为 L2 范数),正如 MSE 最小化所发生的那样。这导致优化器需要进行更复杂的计算,因此训练时间甚至可以根据你的训练案例数量呈指数增长(例如,参见这个 Stack Overflow 问题:stackoverflow.com/questions/57243267/why-is-training-a-random-forest-regressor-with-mae-criterion-so-slow-compared-to)。

最近一些使用 MAE 作为评估指标的著名竞赛包括:

在之前提到了 ASHRAE 竞赛之后,我们也应该提到回归评估指标与预测竞赛的相关性。例如,最近举办了 M5 预测竞赛(mofc.unic.ac.cy/m5-competition/),而且所有其他 M 竞赛的数据也是可用的。如果你对预测竞赛感兴趣,其中 Kaggle 上有几个,请参阅robjhyndman.com/hyndsight/forecasting-competitions/以了解 M 竞赛的概述以及 Kaggle 在从这些竞赛中获得更好的实际和理论结果方面的重要性。

从本质上讲,预测竞赛并不需要与回归竞赛非常不同的评估方法。在处理预测任务时,确实可以获取一些不寻常的评估指标,例如加权均方根误差www.kaggle.com/c/m5-forecasting-accuracy/overview/evaluation)或对称平均绝对百分比误差,更广为人知的缩写为sMAPEwww.kaggle.com/c/demand-forecasting-kernels-only/overview/evaluation)。然而,最终它们只是常规 RMSE 或 MAE 的变体,你可以通过正确的目标转换来处理。

分类(标签预测和概率)的指标

在讨论了回归问题的指标之后,我们现在将说明分类问题的指标,从二元分类问题(当你需要预测两个类别之间)开始,然后到多类别(当你有超过两个类别),最后到多标签(当类别重叠时)。

准确率

在分析二元分类器的性能时,最常用且易于获取的指标是准确率。误分类错误是指你的模型对一个例子预测了错误的类别。准确率仅仅是误分类错误的补数,它可以计算为正确数字的数量除以答案数量的比率:

图片

这个指标已经在例如木薯叶病分类www.kaggle.com/c/cassava-leaf-disease-classification)和文本规范化挑战 - 英语语言www.kaggle.com/c/text-normalization-challenge-english-language)中使用过,在这些挑战中,只有当你的预测文本与实际字符串匹配时,你才被认为做出了正确的预测。

作为指标,准确率强烈关注模型在实际环境中的有效性能:它告诉你模型是否按预期工作。然而,如果你的目的是评估和比较,并清楚地了解你的方法实际上有多有效,那么在使用准确率时你必须谨慎,因为它可能导致错误的结论,尤其是在类别不平衡(它们有不同的频率)时。例如,如果一个特定的类别仅占数据的 10%,那么一个只预测多数类别的预测器将会有 90%的准确率,尽管准确率很高,但它实际上相当无用。

如何发现这样的问题?您可以通过使用混淆矩阵轻松做到这一点。在混淆矩阵中,您创建一个双向表,比较行上的实际类别与列上的预测类别。您可以使用 Scikit-learn 的confusion_matrix函数创建一个简单的混淆矩阵:

sklearn.metrics.confusion_matrix(
    y_true, y_pred, *, labels=None, sample_weight=None,
    normalize=None
) 

提供y_truey_pred向量就足以返回一个有意义的表格,但您也可以提供行/列标签和考虑中的示例的样本权重,并在真实示例(行)、预测示例(列)或所有示例上归一化(将边缘设置为求和为 1)。一个完美的分类器将所有案例都位于矩阵的主对角线上。如果对角线上的某个单元格中案例很少或没有,则突出显示预测器的有效性问题。

为了让您更好地了解其工作原理,您可以尝试 Scikit-learn 提供的图形示例,网址为scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-glr-auto-examples-model-selection-plot-confusion-matrix-py

图 5.1:混淆矩阵,每个单元格归一化到 1.00,以表示匹配的份额

您可以通过考虑每个类别的相对精度并取平均值来尝试提高准确性的可用性,但您会发现依赖其他指标如精确度召回率F1 分数更有用。

精确度和召回率

为了获得精确度和召回率指标,我们再次从混淆矩阵开始。首先,我们必须命名每个单元格:

预测
实际真阴性假阳性
假阴性真阳性

表 5.1:带有单元格名称的混淆矩阵

这里是我们定义单元格的方式:

  • TP真阳性):这些位于左上角单元格中,包含被正确预测为正例的示例。

  • FP假阳性):这些位于右上角单元格中,包含被预测为正但实际上是负的示例。

  • FN假阴性):这些位于左下角单元格中,包含被预测为负但实际上是正的示例。

  • TN真阴性):这些位于右下角单元格中,包含被正确预测为负例的示例。

使用这些单元格,您可以实际上获取更多关于您的分类器如何工作以及如何更好地调整模型的信息。首先,我们可以轻松地修改准确度公式:

然后,第一个有意义的度量指标被称为精度(或特异性),它实际上是正例的准确率:

图片

在计算中,只涉及真正例的数量和假正例的数量。本质上,这个度量指标告诉你,当你预测正例时,你有多正确。

显然,你的模型可以通过只对它有高置信度的示例预测正例来获得高分。这实际上是这个度量指标的目的:迫使模型只在它们确定并且这样做是安全的时候预测正类。

然而,如果你还希望尽可能多地预测出正例,那么你还需要关注召回率(或覆盖率灵敏度甚至真正例率)指标:

图片

在这里,你还需要了解假阴性。这两个度量指标有趣的地方在于,由于它们基于示例分类,而分类实际上是基于概率(通常在正负类之间设置在0.5阈值),你可以改变阈值,其中一个度量指标会得到改善,而另一个则会付出代价。

例如,如果你提高阈值,你会得到更高的精度(分类器对预测更有信心),但召回率会降低。如果你降低阈值,你会得到较低的精度,但召回率会提高。这也被称为精度/召回率权衡

Scikit-learn 网站提供了一个简单实用的概述,介绍了这个权衡:scikit-learn.org/stable/auto_examples/model_selection/plot_precision_recall.html,帮助你绘制精度/召回率曲线,从而理解这两个度量指标如何相互交换以获得更适合你需求的结果:

图片

图 5.2:具有特征步骤的两类精度-召回率曲线

与精度/召回率权衡相关的一个度量指标是平均精度。平均精度计算从 0 到 1 的召回值对应的平均精度(基本上,当你将阈值从 1 变到 0 时)。平均精度在涉及对象检测的任务中非常受欢迎,我们稍后会讨论这一点,但它对于表格数据的分类也非常有用。在实践中,当你想要以更精确和准确的方式监控模型在非常罕见的类别(当数据极度不平衡时)上的性能时,它非常有价值,这在欺诈检测问题中通常是这种情况。

对于这方面的更具体见解,请阅读Gael Varoquaux的讨论:gael-varoquaux.info/interpreting_ml_tuto/content/01_how_well/01_metrics.html#average-precision

F1 分数

到目前为止,你可能已经意识到使用精确度或召回率作为评估指标并不是一个理想的选择,因为你在优化一个的同时必须牺牲另一个。因此,没有 Kaggle 竞赛只使用这两个指标中的任何一个。你应该将它们结合起来(如平均精确度)。一个单一的指标,F1 分数,即精确度和召回率的调和平均数,通常被认为是最佳解决方案:

如果你得到一个高的F1 分数,那是因为你的模型在精确度或召回率或两者方面都有所提高。你可以在Quora Insincere Questions Classification竞赛中找到一个使用此指标的精彩示例(www.kaggle.com/c/quora-insincere-questions-classification)。

在某些竞赛中,你还会得到F-beta分数。这实际上是精确度和召回率之间的加权调和平均数,而 beta 决定了召回率在组合分数中的权重:

由于我们已经介绍了阈值和分类概率的概念,我们现在可以讨论对数损失和 ROC-AUC,这两个都是相当常见的分类指标。

对数损失和 ROC-AUC

让我们从对数损失开始,它在深度学习模型中也被称为交叉熵。对数损失是预测概率与真实概率之间的差异:

在上述公式中,n 代表示例数量, 是第 i 个案例的真实值,而 是预测值。

如果一个竞赛使用对数损失,这意味着目标是尽可能准确地估计示例属于正类的概率。你实际上可以在很多竞赛中找到对数损失。

我们建议你看看最近的Deepfake Detection Challengewww.kaggle.com/c/deepfake-detection-challenge)或较老的Quora Question Pairswww.kaggle.com/c/quora-question-pairs)。

ROC 曲线,或受试者工作特征曲线,是一种用于评估二元分类器性能并比较多个分类器的图表。它是 ROC-AUC 指标的基础,因为该指标简单地是 ROC 曲线下方的面积。ROC 曲线由真正例率(召回率)与假正例率(错误地将负例分类为正例的负例比例)的对比组成。它等同于 1 减去真正例率(正确分类的负例比例)。以下是一些示例:

图 5.3:不同的 ROC 曲线及其 AUC 值

理想情况下,表现良好的分类器的 ROC 曲线应该在低假阳性率的情况下迅速上升真阳性率(召回率)。ROC-AUC 在 0.9 到 1.0 之间被认为是非常好的。

一个不好的分类器可以通过 ROC 曲线看起来非常相似,如果不是完全相同,与图表的对角线相似来识别,这代表了一个纯粹随机分类器的性能,如图中左上角所示;ROC-AUC 分数接近 0.5 被认为是几乎随机的结果。如果您正在比较不同的分类器,并且您正在使用曲线下面积AUC),则面积更大的分类器性能更好。

如果类别是平衡的,或者不平衡程度不是太高,AUC 的增加与训练模型的效率成正比,并且可以直观地认为这是模型输出更高概率的正例的能力。我们也可以将其视为从正例到负例更正确地排序示例的能力。然而,当正例类别很少时,AUC 的起始值很高,其增量在预测稀有类别方面可能意义不大。正如我们之前提到的,在这种情况下,平均精度是一个更有帮助的指标。

最近,AUC 已经被用于许多不同的竞赛。我们建议您查看以下三个:

您可以在以下论文中阅读详细的论述:Su, W., Yuan, Y., and Zhu, M. 平均精度与 ROC 曲线下面积之间的关系. 2015 年国际信息检索理论会议论文集。2015。

马修斯相关系数(MCC)

我们通过介绍马修斯相关系数MCC)来完成对二元分类指标的概述,它在VSB 电力线故障检测 (www.kaggle.com/c/vsb-power-line-fault-detection) 和 Bosch 生产线性能 (www.kaggle.com/c/bosch-production-line-performance) 中首次出现。

MCC 的公式是:

图片

在上述公式中,TP 代表真阳性,TN 代表真阴性,FP 代表假阳性,FN 代表假阴性。这与我们在讨论精确率和召回率时遇到的命名法相同。

作为相关系数的行为,换句话说,从+1(完美预测)到-1(反向预测),这个指标可以被认为是分类质量的一个度量,即使类别相当不平衡。

尽管公式复杂,但它可以被重新表述和简化,正如神经元工程师(www.kaggle.com/ratthachat)在他的笔记本中所展示的:www.kaggle.com/ratthachat/…

神经元工程师在理解评估指标比率方面所做的工作确实值得称赞。事实上,他重新表述的 MCC 变为:

公式中的每个元素是:

重新表述有助于更清晰地阐明,通过提高正负类别的精确度,你可以获得更高的性能,但这还不够:你还需要有与真实标签成比例的正负预测,否则你的提交将受到严重惩罚。

多类别分类的指标

当转向多类别分类时,你只需将我们刚刚看到的二进制分类指标应用于每个类别,然后使用一些常用的多类别情况下的平均策略来总结它们。

例如,如果你想根据 F1 分数评估你的解决方案,你有三种可能的平均选择:

  • 宏平均:简单地对每个类别的 F1 分数进行计算,然后对所有结果进行平均。这样,每个类别的权重与其他类别相同,无论其正例出现的频率如何,或者它们对于你的问题的重要性如何,因此当模型在任一类别上表现不佳时,将产生相等的惩罚:

  • 微平均:这种方法将每个类别的所有贡献相加来计算一个综合的 F1 分数。由于所有计算都是不考虑每个类别的,因此它不会特别偏向或惩罚任何类别,因此它可以更准确地反映类别不平衡:

  • 加权:与宏平均一样,你首先计算每个类别的 F1 分数,但然后使用一个依赖于每个类别的真实标签数量的权重,对所有这些分数进行加权平均。通过使用这样一套权重,你可以考虑每个类别的正例频率或该类别对于你的问题的相关性。这种方法明显偏向多数类别,在计算中将给予更多的权重:

你可能在 Kaggle 竞赛中遇到的常见多类度量包括:

然后还有二次加权 Kappa,我们稍后会探讨它作为序数预测问题的智能评估指标。在其最简单形式中,Cohen Kappa得分只是衡量你的预测与真实值之间的一致性。该度量实际上是为了测量互标注一致性而创建的,但它非常灵活,并且已经找到了更好的用途。

互标注一致性是什么?让我们想象一下,你有一个标注任务:根据照片中是否包含猫、狗或两者都不是的图像来对照片进行分类。如果你要求一组人帮你完成任务,你可能会因为有人(在这种任务中被称为评委)可能将狗误认为是猫或反之,而得到一些错误的标签。正确完成这项工作的聪明方法是让多个评委对同一照片进行标注,然后根据 Cohen Kappa 得分衡量他们的协议水平。

因此,Cohen Kappa 被设计为一个表示两个标注者在标注(分类)问题上一致程度的得分:

在公式中,p[0]是评分者之间观察到的相对一致性,而p[e]是偶然一致性的假设概率。使用混淆矩阵的命名法,这可以重写为:

这个公式的有趣之处在于,得分考虑了协议仅仅是通过偶然发生的经验概率,因此该度量对所有最可能的分类都有修正。该度量范围从 1,表示完全一致,到-1,表示评委完全对立(完全不一致)。

值在 0 附近的表示评委之间的同意和不同意完全是偶然发生的。这有助于你判断模型是否在大多数情况下真的比随机情况表现更好。

安德烈·卢克扬诺夫

www.kaggle.com/artgor

本章的第二次采访是与安德烈·卢克扬诺夫,笔记本和讨论大师以及比赛大师。在他的日常工作岗位上,他是 MTS 集团的机器学习工程师和技术负责人。他对自己的 Kaggle 经历有很多有趣的事情要说!

你最喜欢的比赛类型是什么?为什么?在技术、解决方法方面,你在 Kaggle 上的专长是什么?

我更喜欢那些解决方案足够通用,可以转移到其他数据集/领域的比赛。我对尝试各种神经网络架构、最先进的方法和后处理技巧感兴趣。我不喜欢那些需要逆向工程或创建某些“黄金特征”的比赛,因为这些方法在其他数据集中不适用。

当你在 Kaggle 上竞争时,你也成为了笔记本(排名第一)和讨论的大师。你在这两个目标上投入了吗?

我在编写笔记本上投入了大量的时间和精力,但讨论大师排名似乎是自然而然发生的。

让我们从笔记本排名开始。

2018 年有一个特别的比赛叫做 DonorsChoose.org 应用筛选。DonorsChoose 是一个基金,它赋予全国各地的公立学校教师请求他们学生所需的大量材料和体验的能力。它组织了一场比赛,获胜的解决方案不是基于排行榜上的分数,而是基于笔记本的点赞数。这看起来很有趣,我为比赛写了一个笔记本。许多参与者都在社交媒体上宣传他们的分析,我也是这样做的。结果,我获得了第二名,赢得了一台 Pixelbook(我还在使用它!)

这次成功让我非常兴奋,我继续写笔记本。起初,我只是想分享我的分析并得到反馈,因为我想要尝试比较我的分析和可视化技能与其他人,看看我能做什么,人们对此有何看法。人们开始喜欢我的内核,我想进一步提高我的技能。另一个动力是提高制作快速 MVP(最小可行产品)的技能。当一个新的比赛开始时,许多人开始写笔记本,如果你想成为其中之一,你必须能够快速完成而不牺牲质量。这很有挑战性,但很有趣,也很值得。

我能在 2019 年 2 月获得笔记本大师排名;过了一段时间,我达到了第一名,并保持了超过一年的记录。现在我不太频繁地写笔记本,但我仍然喜欢这样做。

至于讨论,我认为它似乎自然而然地发生了。我回答了 Notebooks 上的评论,并分享和讨论了我参与的比赛中的一些想法,我的讨论排名稳步上升。

请告诉我们您参加的一个特别具有挑战性的比赛,以及您使用了哪些见解来应对这项任务。

这是一场预测分子性质的比赛。我在这里详细写了一篇博客文章(towardsdatascience.com/a-story-of-my-first-gold-medal-in-one-kaggle-competition-things-done-and-lessons-learned-c269d9c233d1)。这是一场针对预测分子中原子之间相互作用的特定领域比赛。核磁共振(NMR)是一种使用与 MRI 类似原理的技术,用于理解蛋白质和分子的结构和动态。全球的研究人员通过进行 NMR 实验来进一步了解分子的结构和动态,涉及环境科学、药理学和材料科学等领域。在这场比赛中,我们试图预测分子中两个原子之间的磁相互作用(标量耦合常数)。量子力学中最先进的方法可以在仅提供 3D 分子结构作为输入的情况下计算出这些耦合常数。但这些计算非常资源密集,因此不能总是使用。如果机器学习方法能够预测这些值,这将真正帮助药物化学家更快、更便宜地获得结构洞察。

我通常为新的 Kaggle 比赛编写 EDA 内核,这次也不例外。在 Kaggle 比赛中,表格数据的常见方法是进行广泛的特征工程和使用梯度提升模型。我在早期的尝试中也使用了 LGBM,但我知道应该有更好的方法来处理图。我意识到领域专业知识将提供重大优势,所以我寻找了所有这样的信息。当然,我也注意到了几位活跃的专家,他们在论坛上撰写文章并创建了内核,所以我阅读了他们的一切。有一天,我收到了一位该领域专家的电子邮件,他认为我们的技能可以互补。通常,我更喜欢自己独立工作一段时间,但在这个情况下,联合力量似乎是一个好主意。而且这个决定证明是一个非常好的决定!随着时间的推移,我们能够聚集一个惊人的团队。

经过一段时间,我们注意到在比赛中神经网络有潜力:一位知名的 Kaggler,Heng,发布了一个 MPNN(消息传递神经网络)模型的示例。过了一段时间,我甚至能够运行它,但结果比我们的模型要差。尽管如此,我们的团队知道,如果我们想取得好成绩,我们就需要与这些神经网络合作。看到 Christof 能够极快地构建新的神经网络,真是令人惊叹。很快,我们就只专注于开发这些模型。

在那之后,我的角色转变为支持性角色。我对我们的神经网络进行了大量实验:尝试各种超参数、不同的架构、训练计划的各种小调整等等。有时我对我们的预测进行 EDA,以找到有趣或错误的案例,后来我们使用这些信息进一步改进了我们的模型。

我们获得了第 8 名,我在这次比赛中学到了很多。

Kaggle 是否帮助你在职业生涯中取得进展?如果是的话,是如何帮助的?

Kaggle 确实在很大程度上帮助了我,特别是在我的技能和个人品牌方面。撰写和发布 Kaggle 笔记本不仅教会了我 EDA 和 ML 技能,而且迫使我变得适应性强,能够快速理解新的主题和任务,在方法之间更有效地迭代。同时,它也为我提供了一定程度的可见性,因为人们欣赏我的工作。

我的第一个作品集(erlemar.github.io/)有很多不同的笔记本,其中一半是基于旧 Kaggle 比赛的。这无疑有助于我获得第一份工作。我的 Kaggle 成就也帮助我吸引了来自好公司的招聘人员,有时甚至可以跳过面试流程的某些步骤,甚至让我获得了几个咨询项目。

在你的经验中,缺乏经验的 Kaggler 通常忽略了什么?你现在知道什么,而当你刚开始时希望知道的呢?

我认为我们需要将缺乏经验的 Kaggler 分为两组:那些在数据科学方面缺乏经验的人和那些在 Kaggle 上缺乏经验的人。

那些在一般情况下缺乏经验的人会犯许多不同的错误(这是可以理解的,每个人都是从某个地方开始的):

  • 最严重的问题之一:缺乏批判性思维和不知道如何进行自己的研究;

  • 不知道何时以及使用哪些工具/方法;

  • 盲目地使用公开的笔记本,而不知道它们是如何工作的;

  • 专注于某个想法并花费太多时间追求它,即使它不起作用;

  • 当他们的实验失败时感到绝望和失去动力。

至于那些在数据科学方面有经验但没有 Kaggle 经验的人,我认为他们最严重的问题是低估了 Kaggle 的难度。他们没有预料到 Kaggle 竞争激烈,需要尝试许多不同的事情才能成功,有很多只在比赛中有效的技巧,还有专业参加比赛的人。

此外,人们往往高估了领域专业知识。我承认,有一些比赛是拥有领域专家的团队赢得了金牌和奖项,但在大多数情况下,经验丰富的 Kagglers 取得了胜利。

此外,我多次见过以下情况:有些人宣称赢得 Kaggle 很容易,并且他(或他的团队)将在不久的将来获得金牌或许多金牌。在大多数情况下,他们默默失败。

你在过去比赛中犯过哪些错误?

  • 对数据的观察不足。有时我无法生成更好的特征或应用更好的后处理,就是由于这一点。而且逆向工程和“黄金特征”是一个完全额外的主题。

  • 因为希望它能够成功,所以在单一想法上花费太多时间。这被称为沉没成本谬误。

  • 实验不足。努力会得到回报——如果你不花足够的时间和资源在比赛中,你不会在排行榜上获得高分。

  • 参加“错误”的比赛。有些比赛存在泄露、逆向工程等问题。有些比赛的公共和私有测试数据分配不合理,导致动荡。有些比赛对我来说不够有趣,我不应该开始参加。

  • 与错误的人组队。有些情况下,我的队友没有像我预期的那样活跃,这导致了更差的团队得分。

当人们参加比赛时,他们应该记住什么最重要的事情或做什么?

我认为重要的是记住你的目标,了解你愿意为这次比赛投入什么,并考虑可能的结果。人们在参加比赛时有许多可能的目标:

  • 赢得金钱或获得奖牌;

  • 获取新技能或提高现有技能;

  • 处理新的任务/领域;

  • 建立人脉;

  • 公共关系;

  • 等等;

当然,有多种动机是可能的。

至于你准备投入什么,通常是指你愿意投入的时间和精力,以及你拥有的硬件。

当我提到结果时,我的意思是比赛结束时会发生什么。你可能会在这个比赛中投入很多并赢得胜利,但你也可能失败。你准备好接受这个现实了吗?赢得某个特定的比赛对你来说至关重要吗?也许你需要准备投入更多的努力;另一方面,也许你有长期目标,一次失败的比赛不会造成太大的伤害。

目标检测问题的指标

近年来,在 Kaggle 上,深度学习竞赛越来越普遍。大多数这些竞赛,专注于图像识别或自然语言处理任务,并没有要求使用与我们迄今为止探索的不同的评估指标。然而,一些特定的问题需要一些特殊的指标来正确评估:与目标检测分割相关的问题。

图片

图 5.4:计算机视觉任务。(来源:cocodataset.org/#explore?id…, cocodataset.org/#explore?id…

目标检测中,你不需要对图像进行分类,而是需要找到图片中的相关部分并相应地进行标记。例如,在图 5.4 中,一个目标检测分类器被委托在照片中定位到有狗或猫存在的部分,并对每个部分使用适当的标签进行分类。左边的例子展示了使用矩形框(称为边界框)定位猫的位置。右边的例子展示了如何通过边界框检测图片中的多只猫和狗,并正确地进行分类(蓝色边界框用于狗,红色边界框用于猫)。

为了描述物体的空间位置,在目标检测中,我们使用边界框,它定义了一个矩形区域,其中包含该物体。边界框通常使用两个(x, y)坐标来指定:左上角和右下角。从机器学习算法的角度来看,找到边界框的坐标相当于将回归问题应用于多个目标。然而,你可能不会从头开始构建问题,而是依赖于预先构建的、通常是预先训练的模型,例如 Mask R-CNN (arxiv.org/abs/1703.06870)、RetinaNet (arxiv.org/abs/2106.05624v1)、FPN (arxiv.org/abs/1612.03144v2)、YOLO (arxiv.org/abs/1506.02640v1)、Faster R-CNN (arxiv.org/abs/1506.01497v1)或 SDD (arxiv.org/abs/1512.02325)。

分割中,你实际上是在像素级别进行分类,所以如果你有一个 320x200 的图像,你实际上需要进行 64,000 个像素分类。根据任务的不同,你可能需要进行语义分割,即对照片中的每个像素进行分类,或者进行实例分割,你只需要对代表特定类型感兴趣对象的像素进行分类(例如,如图 5.5 所示,我们例子中的猫):

图片

图 5.5:同一图像上的语义分割和实例分割。(来源:cocodataset.org/#explore?id…

让我们从这些任务的特定度量指标概述开始,这些指标可以很好地适用于这两个问题,因为在两种情况下,你都在预测整个区域(在目标检测中是矩形区域,在分割中是多边形区域),并且你必须将你的预测与真实情况进行比较,真实情况再次表示为区域。在分割方面,最简单的度量指标是像素精度,正如其名所示,是像素分类的准确性。

它不是一个很好的度量指标,因为,就像在二元和多类问题上的准确性一样,如果你的相关像素在图像中占的面积不大(你只是预测了主要主张,因此你没有分割),你的分数可能看起来很好。

因此,有两种度量指标被使用得更多,尤其是在竞赛中:交并比dice 系数

交并比(IoU)

交并比IoU)也被称为Jaccard 指数。在分割问题中使用 IoU 意味着你有两个图像要比较:一个是你的预测,另一个是揭示真实情况的掩码,这通常是一个二元矩阵,其中值 1 代表真实情况,否则为 0。在多个对象的情况下,你有多个掩码,每个掩码都标记了对象的类别。

当用于目标检测问题时,你有两个矩形区域的边界(预测和真实情况的边界),由它们的顶点坐标表示。对于每个分类类别,你计算你的预测和真实情况掩码之间的重叠面积,然后你将这个面积除以你的预测和真实情况之间的并集面积,这个总和考虑了任何重叠。这样,如果你预测的面积大于应有的面积(分母将更大)或更小(分子将更小),你都会按比例受到惩罚:

图 5.6:IoU 计算的视觉表示

图 5.6中,你可以看到涉及计算的区域视觉表示。通过想象方块重叠得更多,你可以弄清楚当你的预测,即使覆盖了真实情况,也超过了它(并集的面积变得更大)时,度量如何有效地惩罚你的解决方案。

这里有一些使用 IoU 的竞赛示例:

Dice

另一个有用的度量标准是Dice 系数,它是预测和真实值重叠区域的面积加倍,然后除以预测和真实值区域的总和:

图 5.7:Dice 计算的视觉表示

在这种情况下,与 Jaccard 指数相比,你不会在分母中考虑预测与真实值之间的重叠。这里,期望的是,随着你最大化重叠区域,你预测正确的区域大小。再次强调,如果你预测的区域大于你应该预测的区域,你会受到惩罚。事实上,这两个度量标准是正相关,对于单个分类问题,它们产生几乎相同的结果。

实际上,差异出现在你处理多个类别时。实际上,无论是使用 IoU 还是 Dice 系数,当你有多个类别时,你会平均所有类别的结果。然而,在这样做的时候,IoU 度量标准往往会因为单个类别的预测错误而更多地惩罚整体平均值,而 Dice 系数则更为宽容,更倾向于表示平均性能。

使用 Dice 系数的 Kaggle 竞赛示例(它常在具有医疗目的的竞赛中出现,但不仅限于此,因为它也可以用于云层和汽车):

IoU 和 Dice 构成了分割和目标检测中所有更复杂度量的基础。通过为 IoU 或 Dice 选择一个适当的阈值水平(通常为 0.5),你可以决定是否确认一个检测,即分类。在这个时候,你可以使用之前讨论的分类度量,如精确度、召回率和F1,就像在流行的目标检测和分割挑战赛(如 Pascal VOC host.robots.ox.ac.uk/pascal/VOC/voc2012)或 COCO cocodataset.org)中所做的那样。

多标签分类和推荐问题的度量标准

推荐系统是数据分析与机器学习最受欢迎的应用之一,在 Kaggle 上有很多使用推荐方法的竞赛。例如,Quick, Draw! Doodle Recognition Challenge被评估为推荐系统的一个预测。然而,Kaggle 上的一些其他竞赛真正致力于构建有效的推荐系统(例如Expedia Hotel Recommendationswww.kaggle.com/c/expedia-hotel-recommendations)和 RecSYS,推荐系统会议(recsys.acm.org/),甚至在其年度竞赛中在 Kaggle 上举办了一次(RecSYS 2013www.kaggle.com/c/yelp-recsys-2013)。

K 值平均平均精度MAP@{K})通常是评估推荐系统性能的指标,也是你在 Kaggle 上遇到的最常见指标,在所有试图将问题作为推荐系统构建或处理的竞赛中。

此外,还有一些其他指标,例如k 值精度,或P@K,以及k 值平均精度,或AP@K,这些都是损失函数,换句话说,是在每个单个预测的层面上计算的。了解它们是如何工作的可以帮助你更好地理解 MAP@K 以及它在推荐系统和多标签分类中的表现。

事实上,与推荐系统类似,多标签分类意味着你的模型输出一系列类别预测。这些结果可以使用一些二元分类指标的均值(例如在希腊媒体监控多标签分类(WISE 2014)中,使用了平均F1 分数:www.kaggle.com/c/wise-2014)以及更典型的推荐系统指标进行评估,例如 MAP@K。最终,你可以将推荐和多标签预测都视为排序任务,这在推荐系统中转化为一系列排序建议,在多标签分类中转化为一系列标签(没有精确的顺序)。

MAP@{K}

MAP@K 是一个复杂的指标,它源于许多计算。为了完全理解 MAP@K 指标,让我们从其最简单的组成部分开始,即k 值精度P@K)。在这种情况下,由于一个示例的预测是一个从最可能到最不可能的排序预测序列,该函数只考虑了前k个预测,然后计算它与真实情况的匹配数量,并将该数字除以k。简而言之,它与平均精度度量在k个预测上的平均相当。

在计算上稍微复杂一些,但在概念上很简单,平均精度 @ kAP@K)是所有从 1k 的值上计算的 P@K 的平均值。这样,该指标评估了预测的整体效果,使用最顶部的预测,然后是前两个预测,以此类推,直到前 k 个预测。

最后,MAP@K 是整个预测样本的 AP@K 的平均值,因为它包含了评估中的所有预测,所以它是一个指标。以下是你在 Expedia Hotel Recommendations 竞赛(www.kaggle.com/c/expedia-hotel-recommendations)中可以找到的 MAP@5 公式:

图片

在公式中,图片 是用户推荐的数量,P(k) 是截止 k 的精度,n 是预测的酒店集群数量(你可以为每个推荐预测最多 5 家酒店)。

这显然比我们的解释要复杂一些,但公式只是表达了 MAP@K 是所有预测的 AP@K 评估的平均值。

在完成了对不同回归和分类指标的特定指标的概述之后,让我们讨论如何在 Kaggle 竞赛中处理评估指标。

优化评估指标

总结我们到目前为止所讨论的内容,目标函数是学习算法内部的一个函数,用于衡量算法的内部模型如何拟合提供的数据。目标函数还向算法提供反馈,以便它在后续迭代中改进其拟合。显然,由于整个算法的努力都是为了根据目标函数表现良好,如果 Kaggle 评估指标完美匹配你的算法的目标函数,你将获得最佳结果。

不幸的是,这种情况并不常见。通常,提供的评估指标只能通过现有的目标函数来近似。获得一个好的近似,或者努力使你的预测在评估标准上表现得更好,是 Kaggle 竞赛中表现良好的秘诀。当你的目标函数与评估指标不匹配时,你有几种替代方案:

  1. 修改你的学习算法,使其包含一个与你的评估指标相匹配的目标函数,尽管并非所有算法都允许这样做(例如,LightGBM 和 XGBoost 算法允许你设置自定义目标函数,但大多数 Scikit-learn 模型不允许这样做)。

  2. 调整你模型的超参数,选择那些在使用评估指标时使结果最耀眼的选择。

  3. 后处理您的结果,使其更接近评估标准。例如,您可以为预测执行转换的优化器编写代码(概率校准算法是一个例子,我们将在本章末尾讨论它们)。

将竞赛指标纳入您的机器学习算法中,实际上是最有效的提高预测准确性的方法,尽管只有少数算法可以被修改为使用竞赛指标作为目标函数。因此,第二种方法更为常见,许多竞赛最终都陷入了一场为了使模型在评估指标上表现最佳而争夺最佳超参数的斗争。

如果您已经编写了评估函数的代码,那么进行正确的交叉验证或选择合适的测试集就占据了主导地位。如果您手头没有编码函数,您必须首先以合适的方式编写它,遵循 Kaggle 提供的公式。

不容置疑,执行以下操作将产生差异:

让我们更详细地讨论当评估指标与算法的目标函数不匹配时您可以选择的替代方案。我们将从探索自定义指标开始。

自定义指标和自定义目标函数

当目标函数与评估指标不匹配时,作为第一个选项,我们上面已经了解到您可以通过创建自己的自定义目标函数来解决这个问题,但只有少数算法可以轻松修改以包含特定的目标函数。

好消息是,允许这样做的一些算法在 Kaggle 竞赛和数据科学项目中是最有效的。当然,创建自己的自定义目标函数可能听起来有点棘手,但这是提高竞赛分数的一种非常有益的方法。例如,当使用 XGBoost、CatBoost 和 LightGBM 等梯度提升算法,以及所有基于 TensorFlow 或 PyTorch 的深度学习模型时,都有这样的选项。

您可以在这里找到关于 TensorFlow 和 PyTorch 中自定义指标和目标函数的精彩教程:

这些将为您提供基本的功能模板以及一些关于如何编写自定义目标或评估函数的有用建议。

如果您只想直接获取所需的自定义目标函数,可以尝试这个 RNA 的 Notebook(www.kaggle.com/bigironsphere):[www.kaggle.com/bigironsphere/loss-function-library-keras-pytorch/notebook](www.kaggle.com/bigironsphe… TensorFlow 和 PyTorch 的自定义损失函数,这些函数在不同的竞赛中都有出现。

如果您需要在 LightGBM、XGBoost 或 CatBoost 中创建自定义损失,如它们各自的文档中所述,您必须编写一个函数,该函数接受预测和真实值作为输入,并返回梯度和对角线作为输出。

您可以参考 Stack Overflow 上的这篇帖子,以更好地理解梯度和对角线是什么:stats.stackexchange.com/questions/2…

从代码实现的角度来看,您只需创建一个函数,如果您需要传递除预测标签和真实标签向量之外的更多参数,可以使用闭包。以下是一个简单的focal loss(一个旨在在损失计算中为少数类赋予较大权重的损失函数,如 Lin, T-Y. 等人在 Focal loss for dense object detection 中所述:arxiv.org/abs/1708.02002)函数示例,您可以用它作为自己自定义函数的模板:

from scipy.misc import derivative
import xgboost as xgb
def focal_loss(alpha, gamma):
    def loss_func(y_pred, y_true):
        a, g = alpha, gamma
        def get_loss(y_pred, y_true):
            p = 1 / (1 + np.exp(-y_pred))
            loss = (-(a * y_true + (1 - a)*(1 - y_true)) * 
                    ((1 - (y_true * p + (1 - y_true) * 
                     (1 - p)))**g) * (y_true * np.log(p) + 
                    (1 - y_true) * np.log(1 - p)))
            return loss
        partial_focal = lambda y_pred: get_loss(y_pred, y_true)
        grad = derivative(partial_focal, y_pred, n=1, dx=1e-6)
        hess = derivative(partial_focal, y_pred, n=2, dx=1e-6)
        return grad, hess
    return loss_func
xgb = xgb.XGBClassifier(objective=focal_loss(alpha=0.25, gamma=1)) 
focal_loss, which is then fed into an XGBoost instance’s object parameters. The example is worth showing because the focal loss requires the specification of some parameters in order to work properly on your problem (alpha and gamma). The more simplistic solution of having their values directly coded into the function is not ideal, since you may have to change them systematically as you are tuning your model. Instead, in the proposed function, when you input the parameters into the focal_loss function, they reside in memory and they are referenced by the loss_func function that is returned to XGBoost. The returned cost function, therefore, will work, referring to the alpha and gamma values that you have initially instantiated.

示例的另一个有趣方面是,它确实使得通过 SciPy 的导数函数计算成本函数的梯度和对偶函数变得容易。如果你的成本函数是可微分的,你不必担心手动进行任何计算。然而,创建一个自定义目标函数需要一些数学知识,并且需要相当多的努力来确保它适用于你的目的。你可以阅读关于Max Halford在实现 LightGBM 算法的焦点损失时遇到的困难以及他是如何克服它们的,这里:maxhalford.github.io/blog/lightgbm-focal-loss/。尽管困难重重,但能够创造出自定义损失函数确实可以决定你在 Kaggle 竞赛中的成功,在那里你必须从你的模型中提取最大可能的结果。

如果你构建自己的目标函数不起作用,你可以简单地降低你的雄心,放弃将你的函数作为优化器使用的目标函数,而是将其编码为自定义评估指标。尽管你的模型不会直接优化以执行此函数,但你仍然可以通过基于它的超参数优化来提高其预测性能。这是我们在上一节中讨论的第二个选项。

只需记住,如果你是从头开始编写一个指标,有时你可能需要遵守某些代码约定以确保你的函数正常工作。例如,如果你使用 Scikit-learn,你必须使用make_scorer函数来转换你的函数。make_scorer函数实际上是一个包装器,它使你的评估函数适合与 Scikit-learn API 一起工作。它将在考虑一些元信息的同时包装你的函数,例如是否使用概率估计或预测,是否需要指定预测的阈值,以及最后但同样重要的是,优化的方向性,即你是否希望最大化或最小化返回的分数:

from sklearn.metrics import make_scorer
from sklearn.metrics import average_precision_score
scorer = make_scorer(average_precision_score, 
average='weighted', greater_is_better=True, needs_proba=False) 

在上述示例中,你基于平均精度指标准备了一个评分器,指定它应该在使用多类分类问题时使用加权计算。

如果你正在优化你的评估指标,你可以应用网格搜索、随机搜索或更复杂的优化,如贝叶斯优化,并找到使你的算法在评估指标上表现最优的参数集,即使它与不同的成本函数一起工作。在讨论了模型验证之后,我们将探讨如何在 Kaggle 竞赛中最佳地安排参数优化并获得最佳结果,特别是在处理表格数据问题的章节中。

处理你的预测结果

后处理调优意味着你的预测通过一个函数转换成其他东西,以便更好地展示评估结果。在构建你自定义的损失函数或优化你的评估指标之后,你也可以通过应用一个特定的函数到你的预测上,利用你评估指标的特征来提高你的结果。以二次加权 Kappa 为例。我们之前提到,这个指标在处理有序值预测时很有用。为了回顾,原始的 Kappa 系数是算法与真实值之间一致性的调整概率指数。它是一种经过概率校正的准确度测量方法,该概率是指预测与真实值之间的匹配是由于幸运的机会。

这里是之前提到的 Kappa 系数的原始版本:

图片

在公式中,p[0] 是评分者之间观察到的相对一致性,而 p[e] 是假设的偶然一致性概率。在这里,你需要两个矩阵,一个是观察到的分数矩阵,另一个是基于偶然一致性预期的分数矩阵。当 Kappa 系数加权时,你还需要考虑一个权重矩阵,公式变为:

图片

矩阵 p[p] 包含了不同错误权重的惩罚,这对于有序预测非常有用,因为当预测偏离真实值更远时,这个矩阵可以施加更多的惩罚。使用二次形式,即对结果 k 进行平方,使得惩罚更加严重。然而,优化这样一个指标确实不容易,因为它很难将其实现为一个成本函数。后处理可以帮助你。

一个例子可以在 PetFinder.my 预测领养比赛 (www.kaggle.com/c/petfinder-adoption-prediction) 中找到。在这个比赛中,由于结果可能有 5 个可能的评级(0、1、2、3 或 4),你可以通过分类或回归来处理它们。如果你使用回归,对回归输出的后处理变换可以提高模型在二次加权 Kappa 度量标准上的性能,从而超越直接输出离散预测的分类方法。

在 PetFinder 竞赛的情况下,后处理包括一个优化过程,该过程首先将回归结果转换为整数,首先使用边界[0.5, 1.5, 2.5, 3.5]作为阈值,并通过迭代微调,找到一组更好的边界,以最大化性能。边界的微调需要计算优化器,如 SciPy 的optimize.minimize,它基于 Nelder-Mead 算法。优化器找到的边界通过交叉验证方案进行了验证。你可以直接从竞赛期间Abhishek Thakur发布的帖子中了解更多关于这种后处理细节:www.kaggle.com/c/petfinder-adoption-prediction/discussion/76107

除了 PetFinder 竞赛之外,许多其他竞赛已经证明,智能后处理可以提高结果和排名。我们在这里将指出几个例子:

不幸的是,后处理通常非常依赖于你使用的度量标准(理解度量标准对于设计任何有效的后处理至关重要)并且通常也针对特定数据,例如在时间序列数据和泄露的情况下。因此,为任何竞赛概括任何确定正确后处理程序的步骤都非常困难。尽管如此,始终要意识到这种可能性,并在竞赛中寻找任何表明后处理结果有利的线索。你可以从之前类似竞赛中获得有关后处理的提示,并通过论坛讨论——最终,有人会提出这个话题。

预测概率及其调整

在上述关于度量标准优化(预测的后处理)的讨论完成后,我们将讨论在预测正确概率至关重要,但你不确定你使用的算法是否做得好的情况下。正如我们之前详细说明的,分类概率涉及二分类和多分类问题,并且通常使用对数损失(也称为 log loss 或逻辑损失或交叉熵损失)的二元或多元版本进行评估(更多细节,请参阅关于分类度量标准(标签预测和概率)多分类度量标准的先前章节)。

然而,评估或优化对数损失可能并不足够。在努力使用你的模型实现正确的概率预测时,需要注意的主要问题包括:

  • 不返回真正概率估计的模型

  • 你在问题中的类别分布不平衡

  • 训练数据和测试数据之间的类别分布不同(在公共和私人排行榜上)

单独的第一点就提供了检查和验证分类预测质量(就建模不确定性而言)的理由。事实上,即使 Scikit-learn 包中提供了许多算法以及predict_proba方法,这也并不能保证它们会返回真正的概率。

以决策树为例,它是许多有效建模表格数据的有效方法的基石。分类决策树输出的概率基于终端叶子;也就是说,它依赖于包含待预测案例的叶子上类别的分布。如果树完全生长,案例很可能位于一个包含非常少其他案例的小叶子上,因此预测的概率会非常高。如果你改变max_depthmax_leaf_nodesmin_samples_leaf等参数,结果概率将随着树的生长从高值急剧变化到低值。

决策树是集成模型(如 bagging 模型和随机森林)以及提升模型(如梯度提升,包括其高性能实现 XGBoost、LightGBM 和 CatBoost)中最常见的基模型。但是,由于同样的原因——概率估计并非真正基于坚实的概率估计——这个问题影响了许多其他常用的模型,例如支持向量机和k最近邻。这些方面在 Kagglers 中大多鲜为人知,直到在Otto Group Product Classification Challenge([www.kaggle.com/c/otto-group-product-classification-challenge/overview/](www.kaggle.com/c/otto-grou… Bourguignat*和其他人在比赛中提出(参见www.kaggle.com/cbourguigna…),当时使用最近添加到 Scikit-learn 中的校准函数可以轻松解决。

除了你将使用的模型之外,你的问题中类别之间的不平衡也可能导致模型完全不可靠。因此,在处理不平衡分类问题时,一个好的方法是通过使用欠采样或过采样策略重新平衡类别,或者当算法计算损失时为每个类别应用不同的自定义权重。所有这些策略都可能使你的模型表现更佳;然而,它们肯定会扭曲概率估计,你可能需要调整它们以在排行榜上获得更好的模型分数。

最后,第三个需要关注的问题是关于测试集的分布。这类信息通常被隐藏,但通常有方法可以估计它并找出它(例如,通过基于公开排行榜结果的试错法,正如我们在第一章介绍 Kaggle 和其他数据科学竞赛中提到的)。

例如,这种情况发生在iMaterialist Furniture Challenge(www.kaggle.com/c/imaterialist-challenge-furniture-2018/)和更受欢迎的Quora Question Pairs(www.kaggle.com/c/quora-question-pairs)竞赛中。这两场竞赛都引发了关于如何进行后处理以调整概率以符合测试预期的各种讨论(参见swarbrickjones.wordpress.com/2017/03/28/cross-entropy-and-training-test-class-imbalance/www.kaggle.com/dowakin/probability-calibration-0-005-to-lb以获取关于所用方法的更多详细信息)。从一般的角度来看,即使你不知道要预测的类别的测试分布,根据从训练数据中获得的先验概率来正确预测概率仍然非常有好处(并且直到你得到相反的证据,这就是你的模型应该模仿的概率分布)。实际上,如果你的预测概率分布与训练集中的分布相匹配,那么纠正你的预测概率将会容易得多。

当你的预测概率与目标训练分布不匹配时,解决方案是使用 Scikit-learn 提供的校准函数CalibratedClassifierCV

sklearn.calibration.CalibratedClassifierCV(base_estimator=None, *,
    method='sigmoid', cv=None, n_jobs=None, ensemble=True) 

校准函数的目的是对你的预测概率应用一个后处理函数,以便使其更接近于在真实数据中看到的经验概率。假设你的模型是 Scikit-learn 模型或类似行为,该函数将作为你的模型包装器,并将其预测直接传递到后处理函数。你可以在两种后处理方法之间进行选择。第一种是sigmoid方法(也称为 Plat 的缩放),这实际上就是逻辑回归。第二种是等调回归,这是一种非参数回归;注意,如果示例很少,它往往会过拟合。

你还必须选择如何拟合这个校准器。记住,它是一个应用于你模型结果的模型,因此你必须通过系统地重新工作预测来避免过拟合。你可以使用交叉验证(关于这一点,下一章将详细介绍设计良好的验证),然后生成多个模型,一旦平均,将提供你的预测(ensemble=True)。否则,这是我们通常的选择,求助于折叠外预测(关于这一点,下一章将详细介绍)并使用所有可用数据对其进行校准(ensemble=False)。

即使CalibratedClassifierCV可以处理大多数情况,你还可以找出一些经验方法来调整测试时的概率估计,以获得最佳性能。你可以使用任何转换函数,从手工制作的到由遗传算法推导出的复杂函数,例如。你唯一的限制是应该交叉验证它,并可能从公共排行榜中获得一个好的最终结果(但不一定,因为你应该更信任你的本地交叉验证分数,正如我们将在下一章中讨论的那样)。这样的策略的一个好例子是由 Silogram (www.kaggle.com/psilogram)提供的,他在Microsoft Malware Classification Challenge中找到了一种方法,通过将输出提升到由网格搜索确定的幂来调整随机森林不可靠的概率输出,使其成为概率输出(见www.kaggle.com/c/malware-classification/discussion/13509))。

Sudalai_Rajkumar

Sudalai Rajkumar

www.kaggle.com/sudalairajkumar

在本章的最后一次采访中,我们与 Sudalai Rajkumar,SRK,这位在竞赛、数据集和笔记本方面的围棋大师,以及讨论大师进行了交谈。他在 Analytics Vidhya 数据科学平台上排名#1,并为初创公司担任 AI/ML 顾问。

你最喜欢的比赛类型是什么?为什么?在技术和解决方法方面,你在 Kaggle 上的专长是什么?

我最喜欢的竞赛类型是那些涉及大量特征工程的竞赛。我认为这也是我的优势。我通常对数据探索感兴趣,以深入理解数据(你可以从我的系列简单探索笔记本中推断出来[www.kaggle.com/sudalairajk…]),然后基于它创建特征。

你是如何处理 Kaggle 竞赛的?这种处理方式与你在日常工作中所做的是如何不同的?

竞赛的框架包括数据探索、找到合适的验证方法、特征工程、模型构建和集成/堆叠。所有这些都在我的日常工作中涉及。但除此之外,还有大量的利益相关者讨论、数据收集、数据标记、模型部署、模型监控和数据故事讲述。

告诉我们你参加的一个特别具有挑战性的竞赛,以及你使用了哪些见解来应对这项任务。

Santander 产品推荐是我们参加的一个令人难忘的竞赛。我和 Rohan 进行了大量的特征工程,并构建了多个模型。在最终的集成中,我们为不同的产品使用了不同的权重,其中一些权重加起来并不等于 1。从数据探索和理解中,我们手动挑选了这些权重,这帮了我们。这让我们意识到领域/数据在解决问题中的重要性,以及数据科学既是艺术也是科学。

Kaggle 是否帮助你在职业生涯中取得进步?如果是的话,你是如何做到的?

Kaggle 在我的职业生涯中发挥了非常重要的作用。我能够获得我最后两个工作主要是因为 Kaggle。此外,Kaggle 的成功帮助我轻松地与其他数据科学领域的杰出人物建立联系,并向他们学习。这也极大地帮助我在当前作为初创公司 AI/ML 顾问的角色中,因为它增加了我的可信度。

在你的经验中,不经验的 Kagglers 通常忽视了什么?你现在知道什么,而当你刚开始时希望知道的呢?

深入理解数据。这往往被忽视,人们直接进入模型构建阶段。探索数据在 Kaggle 竞赛的成功中扮演着非常重要的角色。这有助于创建适当的交叉验证,创建更好的特征,并从数据中提取更多价值。

你在过去竞赛中犯过哪些错误?

这是一个非常长的列表,我认为这些都是学习机会。在每一场竞赛中,我尝试了 20-30 个想法,可能只有 1 个会成功。这些错误/失败比实际的成功或有效的事物能带来更多的学习。例如,我在我参加的第一个竞赛中,由于过度拟合,从顶尖的十分之一跌到了最底部的十分之一,这是我对过度拟合的非常艰难的学习方式。但这次学习一直伴随着我。

有没有任何特定的工具或库,你会推荐用于数据分析/机器学习?

我主要在处理表格数据时使用 XGBoost/LightGBM。如今,我也使用开源的 AutoML 库和 Driverless AI 来获取早期的基准测试。对于深度学习模型,我使用 Keras、Transformers 和 PyTorch。

当人们参加竞赛时,他们应该记住或做最重要的事情是什么?

一致性是关键。每个竞赛都会有起有落。可能会有多天没有任何进展,但我们不应该放弃,继续尝试。我认为这适用于任何事,而不仅仅是 Kaggle 竞赛。

你使用其他竞赛平台吗?它们与 Kaggle 相比如何?

我也在其他平台如 Analytics Vidhya DataHack 平台、Driven Data、CrowdAnalytix 等参与过。它们也很好,但 Kaggle 的采用范围更广,具有全球性质,因此与其他平台相比,Kaggle 上的竞争量要大得多。

摘要

在本章中,我们讨论了 Kaggle 竞赛中的评估指标。首先,我们解释了评估指标如何与目标函数不同。我们还提到了回归问题和分类问题之间的区别。对于每种类型的问题,我们分析了在 Kaggle 竞赛中可以找到的最常见的指标。

之后,我们讨论了在竞赛中从未见过且不太可能再次出现的指标。最后,我们探索并研究了不同的常见指标,给出了它们在以前的 Kaggle 竞赛中使用的例子。然后,我们提出了一些优化评估指标的策略。特别是,我们建议尝试编写自己的自定义成本函数,并提供了可能的实用后处理步骤的建议。

你现在应该已经掌握了在 Kaggle 竞赛中评估指标的作用。你也应该有一个策略来处理每一个常见或不常见的指标,通过回顾过去的竞赛并全面理解指标的工作方式。在下一章中,我们将讨论如何通过验证策略使用评估指标,并正确估计你的 Kaggle 解决方案的性能。

加入我们书籍的 Discord 空间

加入我们书籍的 Discord 工作空间,参加每月的“问我任何问题”活动,与作者交流:

Kaggle Discord 链接

二维码