14 岁时,我成为了最年轻的 Kaggle 竞赛大师

有些人可能会觉得“数据科学”和“机器学习”这两个术语看起来很高大上,觉得需要很专业的技能才能在这两个领域取得成就。乍一看,数据科学和机器学习的领域可能会让人不知所措,新手眼巴巴望着无穷无尽的代码和技术术语,不知道从哪里入门。

Kaggle 是许多人在这一领域探索的起点之一。对于其他人来说,Kaggle 是他们在机器学习行业参与竞赛、赢得声誉和深入研究的去处。

在本文中,我将带你了解我如何在 14 岁时成为一名最年轻的 Kaggle 竞赛大师。


作者的 Kaggle主页

自我介绍

我是 AndyWang,一名高中新生,对数学、人工智能和计算机科学有着浓厚的兴趣。我在 Kaggle 上参与竞赛以学习和提高我的技能,并获得了 2 枚银牌和 1 枚金牌。


作者照片

早期经历

几年前我对数学产生了兴趣,并开始自学比我在学校所学主题更高级的内容。不久之后我开始研究编程,因为我从小就对计算机科学着迷。我搜索线上教学内容后,找到了几门教授 Python 和基本编程概念的课程。不久之后我就开始自己编程了,还制作了一些小项目,例如用回溯算法制作一个数独求解器。


来自我的数独求解器的代码片段

彼时我有点迷惘,不知道自己手中的知识应该用在什么地方。直到有一天,当我的朋友向我介绍机器学习和数据科学领域时,我才真正意识到了编程的力量所在。然后我找到了 Kaggle 这个网站,它扩展了我对当前计算和人工智能技术的能力边界的认知。

我是如何进步和学习的

我对编程和机器学习概念的了解主要来自互联网。有疑问时,互联网是你最好的老师。中学阶段没有学校会教授数据科学或神经网络知识,如果我想在 Kaggle 上取得成就,只能靠自己了。

数据科学和机器学习对许多人来说是一项艰巨的任务。面对浩如烟海的资源和主题,人们不知道从哪里开始或如何学习。因为与术语“数据科学”和“机器学习”相关的领域太多,精通每个类别几乎是不可能的。ML 和 DS 的力量太惊人了。对于像我这样的初学者来说,你首先需要找到自己感兴趣的东西,并充分挖掘它所能实现的潜力。


机器学习的不同领域

根据初学者已经掌握的知识水平,学习 ML 和 DS 对许多人来说会有不同的路径,以下则是我取得成功的路径。

  1. 我知道数学是未来一切的基础。线性代数和微积分是机器学习中使用的两个最重要的数学概念。几乎所有的机器学习算法都在某种程度上与这两个领域相关。数据以向量和矩阵的形式表示和处理。因此,我们需要了解矩阵的基本运算原理。机器学习中微积分最常见的用途之一是梯度下降。这是一种算法,旨在使用函数的梯度迭代地对全局最小值采取多个步骤来最小化目标函数。

  2. 统计学也是要掌握的。顾名思义,数据科学研究的都是数据。尽管计算机可以预测数据中的某些趋势,但只有人类才能对其进行分析、计算某些属性并最终得出关于数据的结论。数据的预处理和特征工程在很大程度上依赖于统计学。我零零碎碎地学习了一些统计学知识,在互联网上浏览了很多文章,并找到了一些不错的在线课程。

  3. 在了解了基础知识后,我开始着手编写代码。凭借面向对象编程(OOP)和 Python 的基本知识,我找到了一些在线课程,这些课程教会了我如何使用机器学习中常用的那些库。我并不会简单地遵循课程所提供的代码,复制粘贴了事,而是确保自己理解课程所写内容背后的数学原理。如果你不了解事物的内部运作方式,就不可能充分利用这些东西来为你带来优势。我从简单的算法(如线性回归)开始,一点点提升到更复杂的算法(如梯度提升和神经网络)。

学习要脚踏实地,步步为营,每天学到的知识可以轻松积累成非常复杂的东西。

加入 Kaggle

这时,我想通过 Kaggle 竞赛来构建自己的知识体系。我参加了使用回归技术预测房价的初学者竞赛,才发现我学到的东西还远远不够。我最缺的是经验。通过失败和尝试新事物来学习是最佳途径。我熟悉了 Kaggle 的环境,浏览了很多相关讨论和笔记本来研究围绕目标问题的各种解释。不久之后,我觉得自己已经为第一次真正的比赛做好了准备。我和我的朋友Andre Ye一起参加了 Mechanism of Action竞赛


我们的第一场竞赛,MoA

当时我们都是比赛的新手。论坛里那些看起来很专业的代码和技术讨论让我们目瞪口呆。我决定从头开始,而不是 fork 一个入门笔记本。在讨论帖的帮助下,我得以在很短的时间内就做好了基础工作。创新是赢得竞赛的关键要素。我翻阅了关于这一问题的许多论文和文章,然后将它们与论坛上提供的方法相结合,让我们的解决方案进入了排行榜的前 4%。

后来,有了更多的经验后,我们又参加了两场比赛,获得了银牌和第一枚金牌。这样的结果对我来说真的是一个惊喜,我非常感谢 Kaggle 社区指导我实现这一成就。以下是我在参加比赛时观察和学习到的一些技巧和窍门。

我的 Kaggle 竞赛通用管道

在我参加的比赛中我遵循了一个通用的管道,它不仅可以用来安排工作,还可以高效率地产生有意义的结果。

  1. 仔细阅读数据描述和概述。如果可能,再稍稍探索一些领域知识。

  2. 在阅读任何论文、讨论或笔记本之前,尝试自己创建一个基线。这样就不会被其他人的言论禁锢自己的大脑,有助于产生一些全新的想法。

  3. 建立一个可行的交叉验证策略并提交到排行榜。确保你的 CV 策略也适用于 LB,这一点很重要。

  4. 阅读,阅读和学习!充分探索与主题相关的论文,在论坛和笔记本中寻找灵感。

  5. 开始在模型方面或特性方面调整你的基线。一次只调整一件事,这样你就能知道是什么导致模型获得改进/表现更差。

  6. 尽可能多地探索新方法,不要在行不通的事情上纠缠太久。

  7. 集成!如果其他办法都不奏效,我发现集成或堆叠是最稳定的改进方式。

  8. 只选择有良好 CV 分数的提交(并且要清楚它为什么表现出色)。

我学到和运用的东西

随着我参加的比赛越来越多,一些解决方案的复杂性让我大受震撼,这些方案从特征工程到神经网络结构都有涉及。


来自 RANZCR 竞赛的头名,令人惊叹的方案

一般来说,机器学习算法只能从包含信息的数据中学习,并且可以学得很好。在某些情况下,使用与预期略有不同的算法可能会有所帮助。例如,使用主成分分析(PCA)来减少数据的维度,然后将减少的特征连接回原始特征,这种方法帮助我解决了不止一种问题。

有了特征工程就有了特征选择。删除不重要的特征有助于减少数据中的噪声。在 Mechanism of Action 比赛中,论坛和讨论帖中的方法对我们设计的模型并没有什么帮助。在这种情况下,你应该大胆地去阅读和深入研究各种论文。由于我处理的案例(多标签分类)并不常见,因此我找不到什么简单的教程。我找到了一篇论文,旨在对比使用问题转换方法的多标签特征选择。

阅读和研究论文看起来是很困难的事情,但浏览它们并从长篇技术术语中掌握关键词是一项至关重要的技能。对于像我这样的初学者来说,试图理解你遇到的每一篇论文的每一个细节是不可能做到的。只有当我找到自己需要和将要使用的论文时,我才会尝试理解论文中的每一个单词和引用。

在建模过程中,我学到的最大的一课就是创造力。不仅要在模型结构中保持创造性,而且要跳出框框,思考模型如何从根本上处理不同类型的数据。

  • 将模型调整为具有非线性拓扑结构,或为表格数据构建类似 ResNet 的结构化网络,不仅在 MoA 竞赛中获得了一些惊人的成果,而且在接下来的 Jane Street Market Prediction 比赛中也获得了一些出色的结果,我们在这一比赛中的 4.2k 团队中排名第 16。

  • 探索不同类型的自动编码器,例如去噪、变分和稀疏编码器,可以为你的数据带来令人惊讶的变化,这不是简单的特征工程和选择可以实现的。

  • 集成。组合不同模型的结果可以为你的解决方案增加多样性,从而使其更加稳健和稳定。无论最后起作用或者不起作用的是哪些建模技巧,集成始终是我在比赛中的“最后手段”。

  • 始终关注新出现的论文,并探索论坛中提到的内容以外的知识。调整激活函数(尝试swish代替 ReLU)和优化器(尝试AdaBelief代替 Adam 等)之类的小东西可能会从模型中挤出一些性能。

  • 跳出框框思考!使用一维 CNN 对表格数据进行特征提取。或者使用DeepInsight,利用 CNN 的优势将表格数据转换为图像。


图片来自Kaggle

最后,在一场比赛中奏效的策略不一定能在另一场比赛中改善你的解决方案。在 Jane Street Market Prediction 挑战赛期间,我发现特征工程对结果根本没有帮助。相反,我发现了建模中隐藏的魔力。这里要记住的一般经验法则是:

在这样的情况下,不要纠结于“以前有效”或“对他人有效”的事情,你应该继续前进并花更多时间探索可以带来改进的新事物。参加 Kaggle 比赛并获得奖牌并非易事,但使用正确的学习方法和工具可以让这个过程变得容易许多。

  • 查看各种讨论帖和阅读公共笔记本是非常有帮助的。社区每天都会有新的想法出现,我通过论坛中提到的论文和笔记本中所使用的库了解了一些最新的、迷人的模型和工具。其中之一是TabNet,这是一种使用顺序注意力将特征选择合并到模型中来对表格数据进行建模的新方法。这个模型让我在 MoA 比赛中获得银牌。

  • 最后,一个稳定而强大的管道是在私有排行榜中获得出色表现的关键因素。浪费时间过度拟合以在公共排行榜中获得额外的.0001 分是没有意义的。要一直相信你的本地交叉验证分数,因为训练数据量大于公共排行榜的数据量。

除了所有提示和技巧外,我成功的最重要因素是我一致的建模管道和稳定的 CV。

要做一个强大、健壮的 CV……

设置本地交叉验证方案时。以下是应该记住的几个要点:

  1. 折叠数>3。折叠数太小的话,训练分割不足以代表整个数据。

  2. 确保数据没有泄漏。特别是在时间序列预测等情况下,正常的交叉验证会引入未来数据的泄漏,应使用某种形式的时间序列拆分。

  3. 当目标不平衡时使用分层折叠。分层 KFold 方法试图在折叠中平均分割目标。

  4. 确保自己知道为什么事情会有所改善。这是非常重要的,因为结果可能会受到随机种子和其他未知因素的影响。这可能导致看不见的数据(私有排行榜)存在重大不确定性。简单地复制粘贴代码是没法帮助你学习或赢得比赛的。我在 Kaggle 中最重要的座右铭是永远不要复制别人的工作,我可以从他们的想法中得到启发,甚至使用他们的建模方法,但我从不提交其他人的工作作为我的解决方案。在接触新事物时,我养成了对于所有我不理解的东西查找资料的习惯,直到我可以自信地向其他人解释这个主题为止。

写在最后……

本文可能无法帮助你赢得比赛,但我向你保证,它们可以帮助你在 ML 和 DS 的旅程中减少失败的痛苦。

原文链接:https://towardsdatascience.com/my-journey-to-kaggle-master-at-the-age-of-14-e2c42b19c6f7

本文文字及图片出自 InfoQ

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注