14岁初中生,从零开始拿到了Kaggle竞赛冠军
Kaggle
转自:机器之心
因为对数学感兴趣,勇敢的少年决定投身 Kaggle。
数学是一切的基础,线性代数和微积分是使用的机器学习中最重要的概念。几乎所有的机器学习算法都以这样或那样的方式与这两个领域相关。数据以向量和矩阵的形式表示和处理,因此,理解矩阵的基本运算是必要的。在机器学习中,微积分最常见的用法之一是梯度下降。梯度下降是一种算法,通过使用函数的梯度迭代一步步逼近全局最小值来最小化目标函数;
统计也非常重要,顾名思义,数据科学是关于数据的。虽然计算机可以预测数据的某些趋势,但只有人类可以分析它们,计算某些属性,并最终对数据得出结论。数据的预处理和特征工程在很大程度上依赖于统计学。我零碎地学习统计学,从网上搜集资料,寻找合适的在线课程;
在了解了基础知识后,我开始着手编写代码。有了面向对象编程(OOP)和 Python 的基础知识,我找到了在线课程,教我机器学习中常用的库。与简单地遵循代码和复制粘贴不同,我确保自己理解了代码背后的数学原理。如果你不了解代码的内在运作,你就不可能充分利用所学知识。我从简单的算法开始,例如线性回归,到更复杂的算法,例如神经网络。
仔细阅读数据描述和概述。如有可能,可以稍微探索领域知识;
在阅读任何论文、讨论或笔记之前,尝试自己创建一个基准。这样做可以使你的思维不宥于他人的观点,并产生一些全新的 idea;
制定一个可行的交叉验证策略并提交至排行榜。确保自己的交叉验证策略同样适用于排行榜非常重要。
阅读和学习。全身心地投入到与主题相关的论文中,并从论坛和公开笔记中汲取灵感;
在模型或特征层面对基准进行调整。每次只调整一个内容,这样就知道模型提升或表现更差的原因是什么;
尽可能多地探索新方法,不要将时间和精力浪费在无法发挥作用的内容上;
集成。如果一切别的 neirong 都不起作用,集成或堆叠则可能是实现提升的最稳健方法;
提交结果时选择具有好的交叉验证分数的,并确保自己知道它为何表现良好。
稍微调整模型使其具有非线性拓扑结构或者为表格数据创建类 ResNet 结构的网络。这样做取得了意料之外的结果,在 MoA 竞赛和 Jane Street Market Prediction 竞赛中,我们在 4,200 个参赛团队中排名 16 位;
探索去噪、变分和稀疏编码器等不同类型的自编码器可以为数据带来意想不到的变化,远远超出了简单特征工程和选择所能实现的结果;
集成。结合不同模型的结果可以增加解决方案的多样性,使其更加稳健和稳定。不管建模技巧起到了什么作用或者没起作用,集成往往是我在竞赛中的最后杀手锏;
实时关注新论文,并探索论坛中没有提到的内容。稍稍改进激活函数(尝试以 swish 替代 ReLu)和优化器(以 AdaBelief 替代 Adam 等)或许可以从模型中「榨出」一些额外性能;
不走寻常路。使用 1D CNN 在表格数据上执行特征提取,或者利用 CNN 的优势,使用 DeepInsight 将表格数据转换为图像。
在这些情况下,不要纠结于一些「以往竞赛中有效」或「对其他竞赛有效」的解决方案,要向前看,并花更多时间探索那些可以带来提升的新东西。
浏览讨论帖和阅读公开的笔记非常有用。新的 idea 每天都会出现。我就从论坛中提到的论文以及公开笔记中使用的库中了解到了一些最新、吸引人的模型和工具。以 TabNet 为例,它是一种建模表格数据的新方法,使用序列注意力合并模型内部的特征选择。借助 TabNet,我在 MoA 竞赛中拿到了银牌;
创建一个稳健的 pipeline 对于在最终的私人排行榜中取得好成绩最为重要。将时间浪费在过拟合以在公共排行榜中额外获得 .0001 没有意义。始终信任自己的本地交叉验证分数,因为训练数据的数量大于公共排行榜的数量。
Fold 数值>3。当 fold 数值越低时,训练分割(training split)将不足以表示整体数据;
确保数据不出现泄露。尤其是在时间序列预测等情况下,常规交叉验证会导致未来数据的泄露,应该使用某种形式的序列分割;
当目标不平衡时使用 Stratified KFold,这种方法能够在多个 fold 中平均地分割目标;
确保自己知道为什么会出现提升。这一点非常重要,因为随机种子和其他未知因素都可能影响到结果。这也可能导致未见过数据中出现显著不稳定性。
往期精彩: