
* 农场 -(来自英国的农场)-为特定目的(获取经验,获取资源等)而反复进行某些无聊的游戏动作。
引言
最近(10月1日), 又开设了新的DS / ML精品课程 (我强烈建议任何想“现在”进入DS作为初始课程的人)。 而且,像往常一样,完成任何课程后,毕业生都会有一个问题-现在可以从哪里获得实践经验,以巩固尚未获得的理论知识。 如果您在任何个人资料论坛上提出此问题,那么答案很可能是一个-请解决Kaggle。 Kaggle是的,但是从哪里开始以及如何最有效地利用该平台来获得实践技能呢? 在本文中,作者将尝试根据自己的经验回答这些问题,并描述主要耙在竞争性DS领域的位置,以加快抽水过程并从中获得粉丝。
创建者对这门课程的几句话:
mlcourse.ai课程是OpenDataScience社区的大型活动之一。 @yorko和公司(约60人)证明,可以在大学外获得炫酷技能,甚至完全免费。 该课程的主要思想是理论与实践的最佳结合。 一方面,没有数学就不会出现基本概念,另一方面,很多作业,Kaggle Inclass竞赛和项目将为您提供出色的机器学习技能,而您需要付出一定的努力。 不可能不注意课程的竞争性质-正在对学生进行总体评分,这会极大地激发学生的积极性。 该课程也不同,因为它发生在一个真正充满活力的社区中。
该课程包括两个Kaggle Inclass比赛。 两者都很有趣,它们在标牌的构造中效果很好。 首先是通过访问站点的顺序来识别用户 。 第二个是对媒体上一篇文章受欢迎程度的预测 。 主要优点来自两个作业,在这些作业中,您需要机灵并战胜基准。
向课程及其创建者致敬之后,我们继续我们的故事...
我记得自己一年半以前,完成了安德鲁·伍 ( Andrew Ng)的一门课程(仍然是第一版),完成了莫斯科物理技术学院的专业课程 ,读了大量的书-理论上充实了,但是当您尝试解决任何基本的战斗任务时-都会出现昏迷感。 不,如何解决问题-显然可以应用哪种算法-也是可以理解的,但是代码很难编写,每分钟都可以访问sklearn / pandas帮助,等等。 为什么这样-没有累积的管道,而且代码“触手可及”的感觉。
作者想,这行不通,然后去了Kaggle。 从战斗竞赛开始就令人恐惧,竞争之家 “ 房屋价格:先进的回归技术 ”成为第一个迹象,形成了本文所述的有效抽水方法。
在后面将要描述的内容中,没有专有技术,所有技术,方法和技术都是显而易见的和可预测的,但这并不影响其有效性。 至少跟随他们,作者设法使Kaggle竞赛大师死亡六个月,并以独奏方式参加了三场比赛,并且在撰写本文时,进入了Kaggle世界排名前200名 。 顺便说一句,这回答了为什么作者甚至允许自己鼓起勇气写这样的文章的问题。
简而言之,什么是Kaggle

Kaggle是举办数据科学竞赛的最著名平台之一,在每次竞赛中,组织者都上载问题的描述,解决问题的数据,评估解决方案的指标-并设定期限和奖励。 每天(根据组织者的意愿)给参与者3至5次尝试以“提交”(发送自己的解决方案)。
数据分为训练样本(训练)和测试(测试)。 对于训练部分,测试部分的目标变量(target)的值是已知的-不。 参与者的任务是创建一个模型,该模型在数据的训练部分进行训练,将在测试中产生最大的结果。
每个参与者对测试样本进行预测-并将结果发送给Kaggle,然后机器人(谁知道测试的目标变量)评估发送的结果,该结果显示在页首横幅上。
但是,并非所有事情都那么简单-测试数据又按一定比例分为公共(公共)部分和私有(私有)部分。 在比赛期间,根据组织者设置的度量标准,对发送的决定进行评估,以数据的公开部分为基础,并排在排行榜(所谓的公共排行榜)上,参与者可以评估模型的质量。 最终决定(通常由参与者决定是两个)由测试数据的私有部分进行评估-结果落在私有排行榜上,排行榜只有在比赛结束后才可用,实际上,最终结果将通过评估来分配,奖品,发,和奖牌。
因此,在比赛期间,由于参与者的模型在测试数据的公开部分上的行为(结果或显示的速度),因此仅向参与者提供信息。 如果在真空中使用球形马,则数据的私有部分与公众在分布和统计上重合-一切都很好,但是如果不是-那么在公共场合表现良好的模型可能不适用于私有部分,即过大(再训练)。 这就是所谓的“飞行”,这是因为由于他们选择的模型已经过重新训练并且无法提供必要的准确性,因此来自第10位的人在公共场所从1000-2000个地方飞到了私人位置。新数据。

如何避免这种情况? 为此,首先,有必要建立正确的验证方案,这在几乎所有DS课程的第一节课中都有讲授。 因为 如果您的模型无法针对从未见过的数据给出正确的预测-那么无论您使用哪种复杂的技术,无论您构建的神经网络如何复杂,这种模型都无法在生产中生产,因为 其结果毫无价值。
对于Kaggle上的每次竞赛,都会创建一个单独的页面,在该页面上有一个包含数据的部分,其中包含指标的描述-对我们来说最有趣的是-论坛和内核。
他在论坛和Kaggle论坛上,人们写作,讨论和分享想法。 但是内核已经变得更有趣了。 实际上,这是一种运行自己的代码的能力,该代码可以直接访问Kaggle云中的竞争数据(类似于Amazon AWS,Google GCE等),为每个内核分配了有限的资源,因此,如果没有太多数据,则可以使用通过它们,您可以直接从Kaggle网站上的浏览器中-编写代码,运行该代码以执行,然后提交结果。 两年前,Kaggle被Google收购,因此该功能“在幕后”使用Google Cloud Engine也就不足为奇了。
而且,有几个竞赛(最近是Mercari ),您通常只能通过内核来处理数据。 这是一种非常有趣的格式,它可以平分参与者之间的硬件差异,并迫使大脑打开以优化代码和方法,因为自然地,内核当时具有严格的资源限制-4核/ 16 GB RAM / 60分钟运行时间/ 1 GB暂存和输出磁盘空间。 在从事这项竞赛的过程中,作者比任何理论课程都学到了更多关于神经网络优化的知识。 有点不足以赢得金牌,在23日独奏,但是几乎获得了经验和乐趣...
借此机会,我要再次感谢ods.ai的同事-Arthur Stepanenko(亚瑟) , Konstantin Lopukhin(科斯蒂亚) , Sergey Fironov(sergeif)在这次比赛中的建议和支持。 总的来说,有很多有趣的观点, 康斯坦丁·洛普欣(Kostia) ,他与PawełJankiewicz并列 第一 ,然后在聊天室中布置了所谓的“ 75行参考屈辱 ”-75行代码的内核,将结果输出到排行榜的黄金区域。 当然,必须注意:)
好吧,分散注意力,等等-人们编写代码,并为内核布置解决方案,有趣的想法等。 通常,在每场比赛中,几周后,就会出现一个或两个出色的内核EDA(探索性数据分析),并详细说明数据集,统计信息,特征等。 还有一些基准(基本解决方案),虽然它们在排行榜上的显示效果最佳,但是可以用作创建自己的解决方案的起点。
为什么选择Kaggle?

实际上,无论您将在哪个平台上运行,Kaggle都是第一个也是最受欢迎的平台之一,它拥有出色的社区和相当舒适的环境(我希望他们会改进内核以实现稳定性和性能,否则许多人会记住Mercari )但是,总的来说,该平台非常方便且自给自足,其骰子仍然值得赞赏。
总的来说,关于竞争性DS的话题很少。 很多时候,在文章,对话和其他交流中,人们认为这都是胡说八道,比赛经验与实际任务无关,那里的人都在调节小数点后第五位,这是疯狂的,与现实。 让我们更详细地看一下这个问题:
与学术和科学不同,作为执业DS专家,我们在工作中必须而且将解决业务问题。 也就是说(这里是对CRISP-DM的引用)来解决必要的任务:
- 了解业务挑战
- 评估有关主题的数据,是否可以将其中隐藏此业务任务的答案
- 如果现有数据不足以获取答案,则收集其他数据
- 选择最接近业务目标的指标
- 并且只有在选择了模型之后,才将数据转换为选定的模型并“排水hgbusta”。 (C)
此列表中的前四点不会在任何地方教授(对我,如果出现了这样的课程,我会毫不犹豫地报名参加),在这里我们只能从从事该行业的同事的经验中学习。 这是最后一点-从模型的选择及其他方面出发,有可能并且有必要参加比赛。
在任何比赛中,我们的大部分工作都是由组织者完成的。 我们已经描述了业务目标,已经选择了近似指标,已经收集了数据-我们的任务是从所有这些法律法规中构建工作管道。 在这里,技能得到了提升-如何处理过程,如何为神经网络和树准备数据(以及为什么神经网络需要特殊方法),如何正确地建立验证,如何不重新训练,如何选择超参数,如何.......一打或两个“如何做”,他们出色的表现使优秀的专家与在我们行业中经历过的人区分开来。
您可以在Kaggle上“耕种”什么

基本上,这是合理的,所有新手来到Kaggle都是为了汲取并积累实践经验,但不要忘记,除此之外,至少还有两个目标:
要记住的主要事情是,这三个目标是完全不同的,需要不同的方法来实现它们,尤其是在初始阶段,您不应该将它们混淆!
泵送时要在“初始阶段”强调它不是没有意思的-这三个目标将合并为一个并并行解决,但在您刚开始时- 请勿将它们混在一起 ! 这样,您将避免在这个不公正的世界上遭受痛苦,失望和怨恨。
让我们从下至上简单地完成目标:
- 声誉 -通过在论坛上撰写良好的帖子(和评论)并创建有用的内核来提升声誉 。 例如,EDA内核(请参见上文),描述非标准技术的帖子等。
- 奖牌是一个很有争议且令人讨厌的话题,但是哦。 通过混合公共内核(*),在经验上有偏差的团队参与以及创建自己的顶级渠道来激发它。
- 经验 -通过决策分析和错误处理而获得的经验。
(*) 公共内核混合是一种农场奖章技术,其中选择在公共排行榜上以最快速度布置的内核,将其预测取平均(混合),然后提交结果。 通常,此方法会导致过度拟合(训练后再训练)并以女贞飞行,但是有时,它使您几乎可以用白银获得意见书。 作者在起步阶段不建议采用类似的方法(有关皮带和裤子的信息,请参见下文)。
我建议选择“经验”并坚持下去的第一个目标,直到您感觉准备好同时完成两个/三个目标为止。
还有两点值得一提(弗拉基米尔·伊格洛维科夫(ternaus) -感谢您的提醒)。
首先是将在Kaggle上投入的精力转换为新的,更有趣的和/或高薪的工作场所。 不管现在如何调整Kaggle模具的死度,对于理解人们而言,Kaggle竞赛大师摘要中的内容以及其他成就仍然是值得的。
为了说明这一点,我们可以列举对同事谢尔盖·穆欣斯基(cepera_ang)和亚历山大·布斯拉耶夫( albu)的两次访谈( 一 两次 )。
还有Valery Babushkin ( venheads)的意见 :
Valery Babushkin-X5 Retail Group数据科学负责人(自2019年以来,现有员工人数为30人+ 20个职位空缺)
分析小组负责人Yandex Advisor
Kaggle Competition Master是评估未来团队成员的出色代理指标。 当然,对于由30人组成的小组和未伪装的机车组成的最新事件,需要比以前更全面地研究其特性,但这仍然需要几分钟。 一个获得了大师级头衔的人,很有可能知道如何编写至少具有平均质量的代码,非常精通机器学习,知道如何清理数据并构建稳定的解决方案。 如果您仍然不敢说大师级的语言,那么参与的事实也是一个加分,至少应聘者知道Kagl的存在,并且不太懒惰,花时间来掌握它。 而且,如果启动了除公共内核之外的其他程序,并且结果解决方案超出了其结果(这很容易检查),那么这是对技术细节进行详细讨论的机会,这比经典理论问题更好,更有趣,其答案给出了对一个人未来的工作方式的了解较少。 我唯一应该担心的是,有些人认为DS的工作类似于Kagl,这从根本上是错误的。 许多人认为DS = ML,这也是一个错误
第二点是,许多问题的解决方案可以用预印本或文章的形式来描述,一方面,这使集体意识在比赛中产生的知识不会在论坛的荒野中消亡,但另一方面,又增加了作者作品集的界限。 +1的可见度,无论如何对职业和引文索引都有积极影响。
例如,根据几次比赛的结果得出的同事的作品清单作者(按字母顺序):
Andrei O.,Ilya,albu,aleksart,alex.radionov,almln,alxndrkalinin,cepera_ang,dautovri,davydov,fartuk,golovanov,ikibardin,kes,mpavlov,mvakhrushev,n01z3,rakhlin,racut,atorator,resolatorut snikolenko,ternaus,twoleggedeye,与vicident,zfturbo
如何避免失去奖牌的痛苦

得分!
我会解释。 在几乎每场比赛中,接近尾声的时候,内核都会公开发布,其解决方案可使整个排行榜上移,但对您而言,您的决定将相应下移。 每次论坛开始痛苦! 我对银牌有什么决定,现在我什至没有拉铜牌。 怎么了,找回来。
记住-Kaggle是竞争激烈的DS。 排行榜上的位置取决于您。 , , , .
— .
, — . , , , - . , — . , - .
, , — … . , , — — .
, . — . ( Talking Data , 8- ) , (ppleskov) : " , , — ". , .
— :
" "()
, .

— python 3.6 jupyter notebook ubuntu . Python - DS, , jupyter , jupyter_contrib_nbextensions , , ubuntu — , bash :)
jupyter_contrib_nbextensions :
- Collapsible headings ( )
- Code folding ( )
- Split cells (, - )
.
- , . — . — .
, jupyter notebook , , . ( , , ( (ternaus) )
, jupyter - IDE, pycharm .
, , " ". , .
/OOF (.) .
(*) OOF — out of folds , -. . .
怎么了 :
通常,在社区中,有一种趋势逐渐转向第三种选择,因为 第一个和第二个都有其缺点,但是它们简单,可靠,坦白地说,对于Kaggle来说已经足够了。

是的,更多有关不是程序员的人的python-不要害怕。 您的任务是了解代码的基本结构和语言的基本本质,以便了解其他人的内核并编写您的库。 Web上有很多针对初学者的好课程,也许他们在评论中会告诉您确切的位置。 不幸的是(或者幸运的是)我无法评估此类课程的质量,因此我没有在文章中提供链接。
因此,让我们继续框架。

注意事项
所有进一步的描述都将基于表格和文本数据。 图片现在在Kaggle上非常流行,它们是具有单独框架的单独主题。 从根本上讲,如果仅通过诸如ResNet / VGG之类的功能并提取功能,便能够对其进行处理是一件好事,但是与它们进行更深入,更微妙的合作是一个单独且非常广泛的主题,本文在本文的框架中未予考虑。
作者坦率地承认,他的照片不是很好。 吸引美女参加的唯一尝试是在“ 相机识别”竞赛中,顺便说一句,带有[ ods.ai ]标签的团队炸毁了整个排行榜 ,以至于Kaggle管理员不得不懈怠地访问我们以确保所有内容都在其中规则-使社区放心。 因此,在这次比赛中,我获得了第46名的荣誉银奖,当我阅读同事们对最佳解决方案的描述时,我意识到自己无法再提高了,他们真正使用了增强能力的黑魔法,数据量高达300GB,牺牲等等。
通常,如果您想从图片开始,那么您需要其他框架和其他指南。
主要目标
您的任务是为以下任务编写管道(设计为jupyter笔记本+模块):
- EDA(探索性数据分析) 。 在这里,我们需要发表评论-Kaggle有受过专门训练的人员:)在每次比赛中都看到了令人赞叹的EDA内核。 您很难成功超越它们,但是您仍然必须了解如何查看数据,因为 在战斗任务中,这个受过专门训练的人将是您。 因此,我们研究方法,扩展我们的图书馆。
- 数据清理 -有关数据清理的一切。 排放物,遗漏等
- 数据准备 -与模型数据准备有关的一切。 一些块:
- 型号
- 线性模型
- 树模型
- 神经网络
- 异国情调(FM / FFM)
- 功能选择
- 超参数搜索
- 合奏
在内核中,通常将所有这些任务收集在单个代码中,这是可以理解的,但是我强烈建议为每个子任务创建一个单独的笔记本电脑和一个单独的模块(一组模块)。 因此,以后您会更轻松。
警告可能的holivar-这个框架的结构不是最终的真理,还有许多其他方法来构建管道-这只是其中之一。
数据以CSV或羽毛/泡菜/ hdf的形式在模块之间传输-这对于您以及您习惯的内容或灵魂所在更方便。
实际上,很多情况仍然取决于数据量,例如,在TalkingData中,在为lgb创建数据集时, 我必须经过memmap来解决内存不足的问题。
在其他情况下,主数据存储在hdf / feather中,而小数据(例如一组选定的属性)则存储在CSV中 。 我再说一遍-没有模板,谁习惯了这个模板。
初期阶段

我们参加了任何入门竞赛(如上所述,作者从“ 房价:高级回归技术”入手 ),并开始创建笔记本电脑。 我们阅读公共内核,复制代码,过程,方法等。 等 我们通过管道运行数据,提交-查看结果,改进,等等。
此阶段的任务是收集一个有效的全周期管道 ,从加载和清理数据到最终提交。
在继续下一步之前,应准备就绪并可以100%工作的示例清单:
- EDA 。 (有关数据集,箱线图,类别范围的统计信息,...)
- 数据清理。 (通过fillna,清洁类别,组合类别)
- 资料准备
- 常规(处理类别-标签/ ohe /频率,类别上的数字投影,数字转换,装箱)
- 对于回归(各种缩放比例)
- 型号
- 功能选择
- 合奏
去战斗

选择任何您喜欢的比赛,然后开始:)
虽然没有有效的验证方案-没有进一步的步骤!
- 通过我们生成的管道运行数据并提交结果
- 我们抓紧头,疯狂,冷静下来……并继续……
- 我们阅读了有关使用的技术和方法的所有内核。
- 阅读所有论坛讨论
- 我们用新技术改造/补充管道
- 我们转到步骤1
记住-我们现阶段的目标是获得经验 ! 用可行的方法和方法填充我们的管道,用可行的代码填充我们的模块。 我们不会为奖牌而烦恼-或者,如果您可以立即在排行榜上占据一席之地,那就太好了,但是如果没有,不要担心。 我们已经五分钟没来了,奖牌和骰子不会消失。
比赛已经结束,您在哪里,似乎每个人都在争夺下一个?
不行
接下来您要做什么:
- 等待五天。 不要阅读论坛,此时不要忘记Kaggle。 让您的大脑放松并模糊您的眼睛。
- 回到比赛。 在这五天中,根据良好品味的规则,所有高层将以内核的形式,以github存储库的形式在论坛上的帖子中发布其决策的描述。
从这里开始您的个人地狱!
- 您需要几张A4格式的纸,每张纸上都写有上述框架中的模块名称(EDA /准备工作/模型/合奏/特征选择/超参数搜索/ ...)
- 始终如一地阅读所有解决方案,并在相应的传单上写出新的技术,方法和方法。
最糟糕的是:
- 对于每个模块,一致地编写(监视)这些方法和方法的实现,从而扩展您的管道和库。
- 在提交后模式下,通过更新后的管道运行数据,直到您在黄金区域中找到解决方案,或者直到耐心和神经耗尽为止。
只有在那之后,我们才能进行下一场比赛。
不,我没有操。 是的,这是可能且容易的。 你决定
为什么要等5天而又不立即阅读,因为您可以在论坛上提问? 在此阶段(我认为)最好阅读已经形成的线程,并讨论解决方案,您可能遇到的问题-有人已经提出过,或者最好根本不问他们,而是自己寻找答案)
为什么所有这些都这样做? 好吧,再次-此阶段的任务是开发解决方案,方法和方法的数据库。 作战基地。 这样您就不会在下一场比赛中浪费时间,而是立即说-是的,这意味着可以加入目标编码 ,顺便说一句,我可以通过折叠显示正确的代码。 还是哦! 我记得那时合奏经过scipy.optimize ,顺便说一下,代码已经为我准备好了。
那样的东西...
进入工作模式

在这种模式下,我们解决了几个比赛。 每次我们注意到工作表上的记录越来越少,模块中的代码越来越多。 逐渐地,分析的任务简化为您只阅读了解决方案的说明,说,哇,哦,是的! 并为您的存钱罐添加一两个新的咒语或方法。
此后,模式更改为错误处理模式。 基础已经为您准备好了,现在只需正确应用即可。 每次比赛之后,请阅读解决方案的说明,以了解您没有做过的事情,可以做的更好的事情,错过的事情或进入的地方,就像我在《 有毒》中一样 。 他走在黄金的腹部,走得很好,并私下飞了1500个职位。 泪流满面是一种耻辱...但是冷静下来,发现了一个错误,懒洋洋地写了一篇文章,并吸取了教训。
最终退出操作模式的迹象可能是这样的事实,即将使用您的昵称写出最佳解决方案的描述之一。
到本阶段结束时,管道中应大致包含什么:
- 用于预处理和创建数字特征的各种选项-投影,关系,
- 使用类别的各种方法-以正确的版本,频率,标签/ ohe,
- 在文本上的各种嵌入方案(Glove,Word2Vec,Fasttext)
- 各种文本向量化方案(Count,TF-IDF,Hash)
- 几种验证方案(N * M用于标准交叉验证,基于时间,按组)
- 贝叶斯优化/ hyperopt /用于选择超参数的其他方法
- 随机播放/目标排列/ Boruta / RFE-用于选择功能
- 线性模型-同一样式的一个数据集
- LGB / XGB / Catboost-在一个数据集上以相同的样式
作者使用线性外部模型和基于树的模型分别制作了元类,并使用单个外部接口来调整不同模型的API的差异。 但是现在您可以在一个键的一行中运行,例如,在单个处理的数据集上运行LGB或XGB。
- 适用于各种场合的几种神经网络(我们暂时不拍照)-嵌入/ CNN / RNN(用于文本),RNN(用于序列),前馈(用于其他所有功能)。 理解并能够自动编码非常好 。
- 基于lgb / regression / scipy的合奏-用于回归和分类任务
- 能够使用遗传算法是一件好事,有时它们进展顺利
总结一下
任何一项运动,而竞争性DS也是一项运动,它需要大量的汗水和大量的工作。 这既不是好事也不是坏事,这是事实。 参加比赛(如果您正确地采用了这种方法)可以很好地发挥技术技能,加上它在您确实不想做某事时或多或少地动摇了体育精神,直接破坏了一切-但是您起身使用笔记本电脑,重做模型,开始进行计算,以便这个不幸的小数点后第五位。
因此,请决定Kaggle-农场经验,奖牌和粉丝!
关于作者管道的几句话

在本节中,我将尝试描述一年半以来收集的管道和模块的主要思想。 再说一遍-这种方法并不声称是通用的或独特的,但是突然有人会提供帮助。
- 除均值目标编码外,所有功能工程代码均以功能形式在单独的模块中提取。 我试图通过对象进行收集,结果非常麻烦,在这种情况下也没有必要。
- 要素工程的所有要素均以相同的样式制作,并且具有单个调用和返回签名:
def do_cat_dummy(data, attrs, prefix_sep='_ohe_', params=None): # do something return _data, new_attrs
我们将数据集,工作属性,新属性的前缀以及其他参数传递给输入。 在输出中,我们获得了一个具有新属性的新数据集以及这些属性的列表。 此外,此新数据集保存在单独的泡菜/羽毛中。
这提供了我们有机会快速组合数据集以从预生成的多维数据集进行训练。 例如,对于类别,我们一次执行三个处理-标签编码/ OHE /频率,将其保存在三个单独的羽毛中,然后在建模阶段,我们简单地使用这些块,以一种优雅的动作创建各种训练数据集。
pickle_list = [ 'attrs_base', 'cat67_ohe', # 'cat67_freq', ] short_prefix = 'base_ohe' _attrs, use_columns, data = load_attrs_from_pickle(pickle_list) cat_columns = []
如果需要构建另一个数据集,请更改pickle_list
,重新启动并使用新数据集。
表格数据(真实和分类)的主要功能集包括类别的各种编码,类别上数字属性的投影以及各种转换。
def do_cat_le(data, attrs, params=None, prefix='le_'): def do_cat_dummy(data, attrs, prefix_sep='_ohe_', params=None): def do_cat_cnt(data, attrs, params=None, prefix='cnt_'): def do_cat_fact(data, attrs, params=None, prefix='bin_'): def do_cat_comb(data, attrs_op, params=None, prefix='cat_'): def do_proj_num_2cat(data, attrs_op, params=None, prefix='prj_'):
一把通用的瑞士刀,用于组合属性,在输出时,我们照常获得源属性列表和转换函数列表,照常获得数据集和新属性列表。
def do_iter_num(data, attrs_op, params=None, prefix='comb_'):
加上各种其他特定的转换器。
为了处理文本数据,使用了一个单独的模块,该模块包括各种预处理,标记化,词干化/词干化,转换为频率表等方法。 等 一切都是使用sklearn , nltk和keras的标准配置 。
时间序列也由一个单独的模块处理,具有将原始数据集转换为普通任务(回归/分类)和序列到序列的功能。 感谢FrançoisChollet完成了keras,以便seq-2-seq模型的构建不会类似于召唤恶魔的伏都教仪式。
顺便说一下,在同一个模块中,具有序列的常规统计分析的功能-检查平稳性,STL分解等。...在分析的初始阶段“感觉”序列并了解序列是非常有用的。
_fpreproc = fpr_target_enc _fpreproc_params = fpr_target_enc_params _fpreproc_params.update(**{ 'use_columns' : cat_columns, })
- 为了进行建模,创建了一个元类,该类使用抽象方法概括了模型的概念:fit / predict / set_params / etc。 对于每个特定的库(LGB,XGB,Catboost,SKLearn,RGF等),都会创建此元类的实现。
也就是说,与LGB合作,我们创建了一个模型
model_to_use = 'lgb' model = KudsonLGB(task='classification')
对于XGB:
model_to_use = 'xgb' metric_name= 'auc' task='classification' model = KudsonXGB(task=task, metric_name=metric_name)
并且所有功能都可以通过model
进行操作。
为了进行验证,已创建了多个函数,这些函数可在交叉验证期间立即为多个种子计算预测和OOF,以及用于通过train_test_split进行常规验证的单独函数。 所有验证功能均使用元模型方法进行操作,该方法提供了与模型无关的代码,并有助于连接到任何其他库的管道。
res = cv_make_oof( model, model_params, fit_params, dataset_params, XX_train[use_columns], yy_train, XX_Kaggle[use_columns], folds, scorer=scorer, metric_name=metric_name, fpreproc=_fpreproc, fpreproc_params=_fpreproc_params, model_seed=model_seed, silence=True ) score = res['score']
XX_train [use_columns],yy_train,XX_Kaggle [use_columns],折叠,射手=射手,METRIC_NAME = METRIC_NAME,fpreproc = _fpreproc,fpreproc_params = _fpreproc_params,model_seed = model_seed,沉默=真 res = cv_make_oof( model, model_params, fit_params, dataset_params, XX_train[use_columns], yy_train, XX_Kaggle[use_columns], folds, scorer=scorer, metric_name=metric_name, fpreproc=_fpreproc, fpreproc_params=_fpreproc_params, model_seed=model_seed, silence=True ) score = res['score']
对于功能选择-没什么有趣的,标准的RFE和我最喜欢的随机排列方式。
为了搜索超参数,再次以统一形式主要使用贝叶斯优化,以便您可以搜索任何模型(通过交叉验证模块)。 该单元与模拟设备位于同一台笔记本电脑中。
基于Ridge / Logreg,LGB,神经网络和我最喜欢的scipy.optimize,为合奏制作了几个函数,对回归和分类任务进行了统一。
一个简短的解释-管道中的每个模型给出两个文件作为结果: sub_xxx和oof_xxx ,它们是测试的预测和火车的OOF预测。 接下来,在来自指定目录的集合模块中,我们将来自所有模型的预测对上传到两个数据帧-df_sub / df_oof中 。 好吧,接下来我们看一下相关性,选择最佳,然后在df_oof上构建2级模型,并将其应用于df_sub 。
有时,要搜索模型的最佳子集,通过遗传算法进行的搜索很好(作者使用此库 ),有时使用Caruana的方法 。 在最简单的情况下,标准回归和scipy.optimize可以正常工作。
神经网络生活在一个单独的模块中,作者使用功能性样式的 keras ,是的,不像pytorch那样灵活,但到目前为止已经足够了。 同样,编写了通用训练函数,这些函数对于网络的类型是不变的。
在最近一次来自Home Credit的竞争中, 对这条管道进行了测试,对所有模块和模块的谨慎而准确的使用获得了第94位和银牌。
作者通常准备表达煽动性的想法,即对于表格数据和正常制作的管道,任何比赛的最终提交都应进入前100名的排行榜。 当然,也有例外,但总的来说,这种说法似乎是正确的。
关于团队合作

决定团队中的Kaggle还是独奏并不是一件容易的事,这在很大程度上取决于个人(和团队),但是我对刚起步的人的建议是尝试独奏。 怎么了 我将尝试解释我的观点:
- 首先,您将了解自己的优势,发现劣势,并且总体上能够评估自己作为DS实践的潜力。
- 其次,即使在团队中工作(除非这是一个已建立的角色分离的团队),他们仍将在等待您提供现成的完整解决方案-也就是说,您应该已经有工作管道。 (“是否提交 ”)(C)
- 第三,当团队中的球员水平大致相同(并且相当高)时,这是最佳选择,然后您就可以学到真正有用的东西了)在弱小的团队中(没有贬义,我说的是Kaggle的训练水平和经验)很难学任何东西,最好咬一下论坛和内核。 是的,您可以种植奖牌,但请参阅上方的目标和用于固定裤子的皮带)
机长提供的有用提示,以作为证据和答应的佣金卡:)

这些技巧反映了作者的经验,不是教条,可以(并且应该)通过我们自己的实验进行验证
始终从建立有效的验证开始 -不会进行任何其他工作;所有其他工作都会飞入熔炉。 再看一下梅赛德斯排行榜 。
作者非常高兴,他在这场比赛中建立了一个稳定的交叉验证方案(3x10倍),该方案保持了速度并获得了第42名的合法身份)
如果建立了有效的验证,请始终信任您的验证结果 。 如果模型的速度在验证时有所提高,但在公开场合却有所恶化,那么信任验证就更合理了。 分析时,只需读取公共排行榜被视为另一折的那段数据。 您不想让模型超额填充一倍吗?
如果模型和方案允许,请始终进行OOF预测 ,并使它们与模型接近。 在合奏阶段,您永远不知道会发生什么。
始终将/ OOF代码保留在结果旁边以进行接收 。 在github,本地或任何地方都没有关系。 事实证明,有两次是在合奏中最好的模型是两周前开箱即用的模型,并且没有保存代码。 痛
锤击选择“正确的” sid进行交叉验证时 ,他本人首先犯了罪。 最好选择三个,然后进行3xN交叉验证。 结果将更加稳定和容易。
不要在整体中追逐模型的数量 -最好少一些,但要多样化-在模型,预处理,数据集中的多样性更多。 在最坏的情况下,根据参数,例如,一棵具有刚性正则化的深树,一棵浅树。
使用shuffle / boruta / RFE选择要素,请记住,在各种基于树的模型中,要素重要性是衡量木屑袋上鹦鹉的度量。
作者的个人观点(可能与读者的观点不一致) 贝叶斯优化 >随机搜索> hyperopt用于选择超参数。 (“>” ==更好)
布置在公共内核上的撕裂排行榜最好按以下方式处理:
- 有时间-我们看看有什么新鲜事物并自己构建
- 更少的时间-重做以供我们验证,执行OOF-并将其固定到整体
- 根本没有时间-我们愚蠢地结合了我们最好的解决方案,并且看起来很快。
当然,如何根据直觉选择两个最终的提交 。 但认真的是,通常每个人都会实践以下方法:
- 保守提交(关于可持续模型)/风险提交。
- 最佳OOF /公共排行榜
请记住-一切都是数字,并且其处理的可能性仅取决于您的想象力。 使用分类而不是回归,将序列视为图片等。
最后:
有用的链接

一般
http://ods.ai/-适用于想要加入最佳DS社区的人:)
https://mlcourse.ai/-ods.ai课程网站
https://www.Kaggle.com/general/68205-关于Kaggle课程的帖子
通常,我强烈建议您以与文章中所述相同的方式观看mltrainings视频周期 -有很多有趣的方法和技术。
录影带
课程设置
从专业第二年的“ 如何赢得数据科学竞赛:向顶级Kagglers学习”,您可以在Kaggle上了解有关解决问题的方法和方法的更多信息。
课外阅读:
结论

通用数据科学,尤其是竞争性数据科学中的数据科学,就像原子(C)一样,取之不尽。 在本文中,作者仅略微揭示了使用竞争性平台提升实践技能的主题。 如果它变得有趣-连接,环顾四周,积累经验-并撰写您的文章。 内容越丰富,对我们所有人都越好!
预料到这些问题-不,还没有免费提供作者的管道和库。
非常感谢ods.ai的同事: Vladimir Iglovikov(ternaus) , Yuri Kashnitsky(yorko) , Valery Babushkin ( venheads) , Alexei Pronkin(pronkin_alexey) , Dmitry Petrov(dmitry_petrov) , Arthur Kuzin(n01z3)和您阅读过的所有人发布前的文章,以供编辑和审阅。
特别感谢Nikita Zavgorodnoy(njz)的最终校对。
感谢您的关注,希望本文对某人有用。
我在Kaggle / ods.ai的昵称: kruegger