50

[译] 顶级 Kagglers 的心得和技巧

 5 years ago
source link: https://mp.weixin.qq.com/s/Z1TB9gjXXm1FQl07pmrewQ?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

这是一篇笔记,课程来自Coursera上的

How to Win a Data Science Competition: Learn from Top Kagglers

本篇可以算是顶级Kaggler大佬们,经过上百场比赛总结的心得和技巧。对准备开始参加数据挖掘竞赛的新人们极其有用,可以为你节省不少时间。

大部分内容我已经通过意会翻译成中文了,限于小编的视野,可能会出现些误解,有问题望指正。

Tips and tricks

如果觉得排版不适,可以下载notebook文件阅读。

https://github.com/wmpscc/DataMiningNotesAndPractice

Practical guide

经验之谈,这将节省你大量时间。

Before you enter a competition

当我们想参加比赛时,先确定你的目标和试着估计你的参与可以得到什么。

  • 你可能想了解有关这个问题的更多信息

  • 你可能希望熟悉新的软件工具包

  • 你可能想要尝试去获取奖牌

这些目标中的每一个都将影响您选择参加的竞赛。

如果您想了解更多有趣的问题,您可能希望在论坛上进行广泛讨论。例如,如果您对数据科学,医学应用感兴趣, 您可以尝试在2017年数据科学碗中预测肺癌。

如果您想熟悉新的软件工具,您可能希望比赛有必要的教程。 例如,如果您想学习神经网络库。您可以选择任何具有自然保护特征,有监督学习的图像比赛。

如果你想尝试得到奖牌,您可能想要检查参与者有多少次提交机会。 如果人们有超过一百个提交的点数,这可能是明显的问题或验证困难的明显标志。如果排在前列的人很少,这通常意味这应该有一个非平凡的方法来参加这场比赛,或者只有少数人发现了它。除此之外,你还需要关注一下排在前列团队的规模,如果他是一个人,那么你要是聚集一支优秀的团队,胜算会大一些。

After you enter a competition:

  • 1.组织你的想法

一旦熟悉了数据,开始写下你以后想要尝试的方法。什么东西可以在这里工作?你可能采取什么方法。

完成后,去论坛阅读帖子和话题高相关度的内容。强烈建议你参与论坛上的讨论,您可以在论坛上获得大量信息并结识新朋友。

  • 2.挑选一些重要的、有前途的想法

在初始管道准备好之后,你提出了一些想法,你可能想要开始改进你的解决方案

您可能希望将想法排序,将最重要和最有希望的首先实施。或者可以将它们归类到各自主题中,例如特征生成、验证、度量优化等。

  • 3.尝试去理解为什么它会或不会工作

现在选择一个想法并实施它,尝试在途中获得一些简介。特别是,试着理解为什么某些东西有效或无效。从某种意义上讲,分析工作的能力和在你尝试自己的想法时得出的结论将使您走上正确的轨道,去揭示隐藏的数据模式和泄露。

After you enter a competition:Everything is a hyperparameter

我喜欢按照这些原则对所有参数进行排序:

  • 1.重要性

    将参数从重要到不重要排序,这些可能取决于数据结构、目标、度量等等

  • 2.可行性

    例如Rate参数很容易调整,但这可能永远需要调整

  • 3.理解

    评价参数,我知道它在做什么或不知道。这里重要的是要了解每个参数在整个管道中的变化。

注意:改变一个参数可能影响整个管道

Data loading

一开始就对资源做一些优化,将节省大量时间和计算资源。

  • 从经典的处理方法开始然后将csv/txt文件转为hdf5/npy文件以更快的加载

我通常从基本数据预处理开始,如标签,编码,标签恢复,使用额外的数据。然后,我将结果数据转储为HDF5或npy格式。

HDF5是Pandas的数据帧,npy存储非bit数组。运行试验通常需要大量重启内核,这将导致重新加载所有数据,加载csv文件可能需要几分钟,从HDF5或npy格式加载数据只需几秒钟即可完成。

  • 将64位阵列转为32位,节省两倍内存

默认情况下,Pandas以64位阵列存储数据,这在大多数情况下是不必要的。将所有内容向下转换为32位将节省两倍的内存

  • 大数据集可以被分块处理

Pandas支持即时的数据重新链接。因此,大多数数据集可以在没有大量内存的情况下处理。例如您可以简单的对训练集进行拆分来验证你的模型,而不是使用完整数据来做交叉验证。

Performance evaluation

  • 并不总是需要进行广泛的验证

  • 从最快的模型开始-LightGBM

我通常从LightGBM开始,找到一些相当不错的参数,并评估我的特征的性能。

不要从SVM、随机森林、神经网络开始,你会浪费太多时间等待它们的训练。只有当我对特征工程感到满意时,才会转向去调整模型、采样和stacking。

MRbIbue.jpg!web

Fast and dirty always better

在某些方面,我将我的方法描述为“fast and dirty”,总是更好。

  • 不要过于关注代码质量

关注真正重要的事——数据。做数据探索,尝试不同的特征。谷歌特定领域的知识。您的代码是次要的。创建不必要的类和个人框架可能只会让事情更难以改变,这会导致浪费你的时间,所以要保持简单合理。

  • 把事情简单化:只保留重要的东西

不要跟踪每个小变化

  • 如果你对计算资源感到不爽-那就去租一台服务器

最后,如果您对给定的计算资源感到非常不舒服,不要挣扎数周,只需租一台更大的服务器。

Initial pipeline

  • 从简单甚至原始的解决方案开始

  • 用完整的管道调试

这种解决方案的主要目的不是建立一个好的模型,而是从数据的最开始到我们将提交文件写成确定的格式,建立完整的调试管道。我建议你从构建初始管道开始,通常你可以在kernel中找到组织者提供的baseline解决方案。我建议你仔细阅读并自己写。

  • “从见到到复杂”

另外,我建议你在其他方面遵循从简单到复杂的方法。例如我更喜欢随机森林而不是GBDT,至少随机森林工作得非常快,几乎不需要调整混合参数。

Best Practices from Software Development

  • 使用好的变量名

无论你多么聪明,如果你的变量名起的不好,你肯定会对它感到困惑,这是迟早会发生的。

  • 让你的研究可重复

    • 固定所有随机种子

    • 准确记下功能的生成方式

    • 将代码存储在版本控制系统下,例如git。

      很多时候,你需要回退你的模型到两星期前做模型集成。

  • 复用代码

在训练和测试阶段使用相同的代码非常重要。例如,为了保证它们以一致的方式训练,应该使用相同的代码准备和转换特征。这地方一般很难察觉到,所以最好小心点。我建议将可重用代码移动到单独的函数中,甚至是单独的模块。

Read papers

  • 这可以获取到ML相关的电子

    • 例如,如何去优化AUC

  • 便于熟悉相关领域问题

    • 尤其对特征生成有用

My pipeline

  • Read forums and examine kernels first

    • There are always discussions happening!

  • Start with EDA and a baseline

    • To make sure the data is loaded correctly

    • To check if validation is stable

  • I ad features in bulks

    • At start I create all the features I can make up

    • I evaluate many features at once(not “add one and evaluate”)

  • Hyperparameters optimization

    • First find the parameters to overfit train dataset

    • And then try to trim model

Code organization:keeping it clean

  • Very important to have reproducible results!

    • Keep important code clean

  • Long execution history leads to mistakes

  • Your notebooks can become a total mess

    s = qq.sum(1)
    ss = s[:,3]/qq.var()
    sss = ss[0]

    注意代码质量

  • One notebook per submission(and use git)

    NnQZjq7.jpg!web

  • Before creating a submission restart the kernel

    • Use “Restart and run all” button

阅读原文,获取jupyter notebook文件。

FzAF3mI.gif

长按识别二维码

获取更多AI资讯

IBRBVf6.jpg!web

zyI3eaE.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK