其实写这篇文章比赛君纠结了许久,为什么呢?人工智能的某些方向这么卷,在写这个的时候,我就很焦虑。但是转念一想,这篇分享里面主要传达的内容是,学习经验,学习思路。大部分打比赛的人都值得借鉴一下,特别是刚开始学习机器学习的同学们。
现在就让我们一起来认识一下这个少年,学习一下他的经验。
这位在kaggle比赛上拿了2枚银牌1枚金牌的Andy是一名高中新生,他对数学,人工智能和计算机科学有非常大的兴趣。他在kaggle上学习并利用比赛提高自己的技能。
“数据科学”和“机器学习”这两个专业词汇给人的感觉就是需要专业的技能才能掌握,开始进入这两个领域会让人不知所措,看了代码,读了论文,却不知从何下手。
Andy认为:
Kaggle比赛无疑是进行理论实践,提高动手能力和进一步深入运用机器学习领域的好“工具”。
最开始Andy是对数学有着非常大的兴趣,并且自学比学校教授的更高一级的数学知识。因为从小就对计算机感兴趣,接下来就他开始研究编程。利用在线课程学习了Python和基本编码概念的课程,然后就开始自己使用回溯算法制作了“数独求解器”这个小项目。
果然兴趣是最好的老师啊!
但是Andy这个时候不知道自己所掌握的知识还能够做什么事情,怎么学习更深入的知识。
很多人都有这个阶段,学姐也有这样的时候。
只要你有深入学习的想法,老天爷就会派人来告诉你怎么做。这时候Andy的朋友就和他聊到了数据科学和机器学习领域,并让Andy对这两个领域有了初步的认识。接着Andy找到了kaggle这个“学习平台”,他说:“kaggle扩展了我对当前计算和人工智能技术的可能性的认识。”
高中没有学校教授数据科学和机器学习概念,Andy想要在kaggle上取得成绩就智能靠自己。Andy对编程和机器学习概念的了解主要来自互联网,他也着重表示说,有疑问时,互联网是您最好的老师。
所以当大家的程序报错的时候,请把报错复制到搜索引擎搜索框,也许自己能先尝试找到答案!
“数据科学”和“机器学习”相关的领域太多,这导致大多数同学不知道从何学起,因为要精通所有的类别是不可能的事情。对于初学者Andy的建议是:最重要的是需要找到自己感兴趣的东西,并充分探索它潜在的实现(就是该技术的现实应用)。
1、数学是一切的基础
线性代数和微积分是机器学习中使用的两个最重要的数学概念。几乎所有的机器学习算法都以某种方式与这两个领域相关。数据以向量和矩阵的形式表示和处理。因此,需要了解矩阵的基本运算。
机器学习中微积分最常见的用途之一是梯度下降。它是一种算法,旨在通过使用函数的梯度迭代地对全局最小值采取步骤来最小化目标函数。
(线性代数、微积分,梯度下降学习视频链接放在了文章底部)
2、不能忽略的统计数据
数据科学都是关于数据的。虽然计算机可以预测数据中的某些趋势,但人类是唯一可以对其进行分析、计算某些属性并最终对数据得出结论的人。数据的预处理和特征工程在很大程度上依赖于统计。
Andy学习统计学的方法是从互联网上爬取相关统计学文章,筛选并找到合适的在线课程。
Andy在了解了基础知识后,开始着手编写代码。凭借面向对象编程(OOP) 和 Python的基本知识,找到了一些在线课程,利用这些课程学会了机器学习中常用的所有库。
不要简单地遵循所提供的代码或只懂复制粘贴,确保能理解所写内容背后的数学原理。如果不了解其内部工作原理,就不可能充分利用任何东西来提高技术能力。
从简单的算法开始,比如线性回归,到更复杂的算法,比如梯度提升和神经网络。
Andy:“一点一滴的学习,一开始学到的知识,将来可以轻松积累成复杂的东西。”
最初Andy以自己对kaggle的了解为基础参加了《使用回归技术预测房价的初学者竞赛》,里面涉及到的部分知识,Andy已经自己在网上找到学习过。但是他发现,以前的知识来打初学者竞赛也远远不够,真正缺的是经验。
最好的学习方法是通过失败和尝试新事物。Andy开始熟悉kaggle环境,浏览讨论和笔记本获取有关于这个比赛的解释、经验分享。当作好了比赛准备的时候他找到了一个朋友一起参加了《Mechanism of Action 比赛》。
这也说明,如果你是初次打比赛,找个小伙伴或者找个起步差不多的人一起会更容易坚持下去。
但是Andy和他的朋友Andre Ye都是比赛新手,论坛里所有看起来很专业的代码和技术讨论让他们目瞪口呆。他们决定从头开始,在讨论帖的帮助下,在短时间内建立基线。
创新对于在竞争中取得成功很重要。他们翻阅了有关该问题的论文和文章,然后将所获得的知识与论坛上提供的方法相结合,让他们的解决方案进入前4%。
后来,有了更多的经验,他们又参加了两场比赛,又获得了银牌和第一枚金牌。Andy觉得结果对他们来说是一个真正的惊喜,非常感谢 Kaggle 社区指导。
接下来说一说Andy在参加比赛时观察和学习的一些技巧和窍门。
从我参加的比赛中,我遵循了一个通用的流程,它不仅可以组织工作,还可以有效地产生有意义的结果。
仔细阅读数据描述和概述。尝试探索该领域知识。
在阅读任何论文、讨论或笔记之前,尝试自己创建一个基线。这有助于保持自己的思路不被看到其他人所说的内容而产生的新的想法扰乱。
建立可行的交叉验证策略并提交到排行榜。确保CV策略也适用于 LB(很重要)。
阅读和学习!充分搜集与该主题相关的论文,在论坛和笔记中寻找灵感。
开始在模型方面或功能方面调整基线。一次只调整一件事,这样能够准确的知道是什么导致模型改进/表现更差。
尽可能多地探索新方法,不要在行不通的事情上纠缠太久。
如果其他一切都无法解决问题,集成或堆叠是最稳定的改进方式。
只选择具有良好 CV 分数的提交(并确保您知道它为什么表现良好)。
随着我参加越来越多的比赛,从特征工程到神经网络的结构,我对一些解决方案的复杂性感到惊讶。比如下面这个:来自 RANZCR 竞赛的惊人第一名解决方案。
一般来说,机器学习算法只能从信息数据中学习到相当好的东西。但是,在某些情况下,能够使用与预期略有不同的算法可能会有所帮助。例如,使用主成分分析 (PCA)来减少数据的维度,然后将减少的特征连接回原始特征,这种方法帮助我解决了不止一种情况。
特征工程带来了特征选择。删除不重要的特征有助于减少数据中的噪声。在 Mechanism of Action 竞赛期间,论坛和讨论帖中的方法对我们设计的模型没有帮助。在这种情况下,不要害怕深入研究并阅读论文。
由于我处理的案例多,标签分类并不常见,因此我找不到任何简单的教程。我找到了一篇论文,旨在比较《使用问题转换的多标签特征选择》。(论文链接在文章末尾)
论文
提起读论文总是让人又爱又恨,但是能够浏览它们并从一长页的技术术语中掌握关键字是一项关键技能。
对于初学者来说,试图理解每一篇论文的每一个细节是不可能的。只有当找到需要和将使用的论文时,才会尝试理解论文中的每一个单词和引用。
创造力
在建模过程中,Andy学到的是创造力。不仅在模型结构中,而且要跳出框框思考模型如何从根本上处理不同类型的数据。
将模型调整为具有非线性拓扑结构或为表格数据构建,类似 ResNet 的结构化网络不仅在 MoA 竞赛中获得了一些惊人的结果,而且在接下来的 Jane Street Market Prediction 中也获得了一些惊人的结果,其中我们在其中排名第 16 4.2k 团队。
探索不同类型的自动编码器,例如去噪、变分和稀疏编码器,可以为您的数据带来令人惊讶的变化,而不仅仅是简单的特征工程和选择可以实现的。
组合不同模型的结果可以为解决方案增加多样性,从而使其更加稳健和稳定。无论什么建模技巧奏效,比赛期间,集合总是我的“最后手段”。
始终关注新论文并探索论坛中提到的内容之外的内容。调整激活函数(尝试swish而不是 ReLU)和优化器(尝试AdaBelief而不是Adam等)之类的小东西可能会从模型中挤出一些性能。
跳出原有的框架思考,比如使用一维CNN对表格数据进行特征提取,或者使用DeepInsight,将表格数据转换为图像,利用CNN的优势。
在一场比赛中奏效的策略可能不一定能改善你在另一场比赛中的解决方案。比如,在 Jane Street Market Prediction 挑战赛期间,我发现特征工程对结果根本没有帮助。相反,我发现了建模的魔力。
在这种情况下,不要沉迷于“以前有用”或“为他人工作”的事情,继续前进并花更多时间探索可以带来改进的新事物。
参加Kaggle比赛并获得奖牌并非易事,但通过正确的学习方法和工具,这个过程可以变得更容易。
检查讨论帖子和阅读公共笔记本非常有帮助,每天都有新想法出现。
比如:通过论坛中提到的论文和笔记本中使用的库了解了一些最新且引人入胜的模型和工具。其中之一是TabNet,这是一种通过使用顺序注意将特征选择合并到模型中来对表格数据进行建模的新方法。这个模型让Andy在MoA比赛中获得银牌。
最后,拥有稳定而强大的管道对于在最终的私人排行榜中取得出色表现最为关键。浪费时间过度拟合以在公共排行榜中获得额外的0.0001是没有意义的。始终相信您当地的交叉验证分数,因为训练数据量大于公共排行榜的数据量。
尽管有所有提示和技巧,但我成功的最重要部分是我一致的modeling pipeline and a stable CV。
对于一个强大的CV,设置本地交叉验证方案时。以下是我经常考虑的几件事:
折叠数>3。使用较小的折叠数,训练分割不足以表示整个数据。
确保没有数据泄漏。特别是在时间序列预测等情况下,正常的交叉验证会引入未来数据的泄漏,应使用某种形式的时间序列拆分。
当目标不平衡时使用分层折叠。分层 KFold 方法试图在折叠中平均分割目标。
确保你知道为什么事情会有所改善。这是非常重要的,因为结果可能会受到随机种子和其他未知因素的影响。这可能导致看不见的数据(私人排行榜)存在重大不确定性。
只是按复制粘贴对学习或赢得比赛没有帮助。Andy的座右铭就是永远不要复制别人的工作,我可以从他们的想法中得到启发,甚至使用他们的建模方法,但我从不提交其他人已经写好的代码作为我的解决方案,在接触新事物时,要养成查找所有自己不理解的东西的习惯,直到自己能够向其他人解释这个项目。
也许这个文章不能帮助你拿到kaggle金牌,但是它已经给你说明了,身为一个初学者靠自己怎么做才能进入到kaggle比赛,并进行学习,提高,深入了解数据科学和机器学习。
本篇文章的学习经验流程,大致就是:感兴趣——研究——搜索相关学习资料——初步学习——思考如何深入——初步了解——查找资料——找到kaggle平台——从别人的分享中学习——读论文,学思路,总结自己的经验——尝试不同的解决办法——然后成功。
需要80场比赛Baseline及Top方案私信“比赛君”领取
学习一定要主动,要善于利用互联网,要主动去探索,遇到问题先自己搜索,视频,论文,百度,google都是学习的工具。
(本文内容仅建议,不是必须要按照这个做,如有用词不当,评论区可以提出,没下班的话会改)
参考文档:
https://en.wikipedia.org/wiki/Principal_component_analysis
https://en.wikipedia.org/wiki/Gradient_descent
https://en.wikipedia.org/wiki/Artificial_neural_network
https://en.wikipedia.org/wiki/Gradient_boosting
https://en.wikipedia.org/wiki/Object-oriented_programming
https://en.wikipedia.org/wiki/Linear_regression
线性代数:
https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab
微积分:
https://www.youtube.com/playlist?list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr
论文:
https://www.sciencedirect.com/science/article/pii/S1571066113000121
https://arxiv.org/abs/1908.07442
其他:
https://www.kaggle.com/c/ranzcr-clip-catheter-line-classification/discussion/226633
https://www.kaggle.com/washingtongold
https://www.kaggle.com/andy1010
https://towardsdatascience.com/my-journey-to-kaggle-master-at-the-age-of-14-e2c42b19c6f7