返回列表

1st Place Solution: 72 OOFs, a whole lotta Autogluon, and 31 scores of 0.98512 or above (on the private LB)

622. Playground Series - Season 4, Episode 8 | playground-series-s4e8

开始: 2024-08-01 结束: 2024-08-31 临床决策支持 数据算法赛
第一名解决方案:72 个 OOF,大量的 Autogluon,以及 31 个 0.98512 或以上的分数

第一名解决方案:72 个 OOF,大量的 Autogluon,以及 31 个 0.98512 或以上的分数(私有排行榜)

作者: Optimistix (MASTER)
发布时间: 2024-09-03
竞赛排名: 1

抱歉帖子这么长——借用布莱兹·帕斯卡的名言,我没有时间把它写得更短些。

这确实是一场令人非常满意的比赛!我成功的核心与上个月描述的一样(连同一些背景故事)(第 4 名解决方案,PSS4E8)——大型集成,以及在 Kaggle 之外缺乏 serious 资源的情况下的大量努力。

虽然这个月不如上个月那么令人沮丧,样本量“只有”300 万,而不是上个月的 1100 万,但变量数量大约是上个月的两倍。不过在空间和存储方面一切都更易于管理,尽管我确实面临着一些熟悉的挫折,比如 Kaggle 上的 GPU 配额和 12 小时的运行限制。

太长不看版 (TLDR) 类似:

  • 收集了各式各样的模型,将它们集成,关注交叉验证 (CV) 和模型多样性,只要分数提高就继续集成
  • 在 Kaggle 上不断耗尽 GPU 和执行时间(12 小时限制)
  • 更多地实验了 Autogluon
  • 不断实验所有内容:新模型、超参数、集成方法等。
    最终积累了近 80 个 OOF 数组,最后使用了 72 个
  • 最终获得了 31 个 0.98512 或以上的分数(0.98511 是私有排行榜上的第二高分),其中第一个分数是在 8 月 17 日取得的,当时比赛还剩两周。

在我继续之前,让我感谢那些分享见解、发现和代码的慷慨人士,包括但不限于:

@ambrosm, @siukeitin, @nischaydnk, @gauravduttakiit, @rzatemizel, @ravaghi, @oscarm524, @ravi20076, @tilii7, @roberthatch, @omidbaghchehsaraei, @trupologhelper, @arunklenin, @carlmcbrideellis

很高兴这个月 @ambrosm 回来了,他的另一个精彩的 EDA 笔记本帮助我们许多人起步——它(以及一些混合)帮助我在第一天就达到了 0.98516 的分数(私有:0.98498)。第一天就有几件事很明显,包括 Autogluon 在这个数据集上表现非常好,我在 @gauravduttakiit 的 LazyPredict 结果笔记本中注意到,随机森林 (Random Forests) 和 Extra Trees 这次非常有竞争力,并 mentally note 要将它们包含在我的集成中。一旦我看到 @siukeitin 关于原始数据集精确解决方案的精彩帖子,我就添加了有毒概率作为一个新特征,理由是它可以作为当前数据集中仍然存在的原始“信号”的代理。它帮助提高了一些模型的分数,就像包含原始数据一样——即使它们没有提高分数,也增加了集成的多样性。@carlmcbrideellis@siukeitin 这项工作的催化剂,因为他提供了一个基于原始数据集的包含一百万个蘑菇的数据集。他还发起了一项竞赛,旨在用最少的时间完美预测他数据集上的标签——玩弄这个帮助我发现可以通过设置 "num_threads" = CPU 核心数来加速 LGBM。

这个月我在 Autogluon (AG) 上花了不少时间,因为有太多的笔记本用它来在公共排行榜上取得好成绩。@gauravduttakiit 也展示了在 AG 上使用 GPU 和长时间运行的重要性,仅仅使用 GPU 就让分数从 0.98482 跳到了 0.98524,而没有更改其余代码。与此同时,我不得不集成几十个模型才能接近那个分数。我立即启动了一个长时间的 AG GPU 运行,这导致了比赛中最令人沮丧的时刻,Kaggle 在 12 小时后杀死了笔记本,就在生成输出文件的中间 😡

从一开始,我就探索了使用各种方法进行集成,包括爬山算法 (Hill Climbing),这比上个月更可行,上个月超过 10-15 个模型就无法启动了。这个月我一直用到最后,尽管一旦超过 60 个模型左右,就需要 2 个多小时。我的突破分数之一(0.98530,没有任何混合)是通过结合 Ridge 和 GBDTs 进行集成得来的。然而,Ridge 通常提供了速度和排行榜分数的最佳组合,所以我大多数提交都使用了它。它帮助我达到了第一个让我开始感到自信的分数,一个约 50 个模型的集成达到了 0.98525,没有任何“盲目混合”。我不知道的是,这也达到了 0.98512 的私有排行榜分数(还剩 2 周),这可能足以获胜。所以在某种意义上,在此之后我是在扩大(微小的)优势,当然我无法知道这一点。

Autogluon (AG) 实验的高低起伏

大约还剩 10 天时,我决定投入更多时间实验 AG,这似乎有助于进一步推动我的分数。在浏览了几个笔记本后,我注意到 XGBoost 和 CatBoost 是 AG 内最弱的模型,这很有趣,尤其是因为 XGBoost 在 AG/AutoML 之外表现最好。我推测排除它们可能会通过给表现更好的模型更多时间来提高 AG 的分数——它没有提高,但也没有恶化,而且可以在大约一半的时间内达到相同的分数。然后我注意到顶级集成几乎总是仅由 GBM 和 XT 组成,所以我放弃了其他所有内容,分数只少了约 0.0001。最后,我决定通过 AG 单独运行 individual 模型,然后自己集成它们,看看这是否能让每个模型有更多时间,从而导致更好的集成分数,确实如此,但也只提高了约 0.0001。最后,我决定把我的 OOF 扔进 AG 里——但那是后来的故事(大约两段之后)。

通往 0.98535 的三种方式,直至 0.98537

在六月的“惨败”之后,当时我在下半个月持有第 1 名的位置却过度拟合到 oblivion,我仍然专注于构建一个稳健的集成。但当当天 submission 剩余时间太少而无法获得新结果添加到集成时,我也不排斥一些“盲目混合”,事实上这就是我本月第一次达到第 1 名的部分原因。我确实尝试使用另外两个解决方案(Gaurav 和 @nischaydnk 的),它们的构建方式与我不同,但分数约为 0.98525,最终得到了 0.98532。几天后,我与 @arunklenin 的 0.98527 进行了两次这样的混合,使我达到了 0.98534 并进入领先位置。最后,我使用了“插入自信分歧”的方法,如果另一个模型/集成产生了足够高的概率(例如 > 0.99),则用其预测覆盖我的预测,这产生了我的第一个 0.98535 的排行榜分数,尽管基础相当 shaky(这个的私有排行榜结果仅为 0.98506)。

到目前为止,我的 CV 分数通常 < 0.98510(集成), solo 模型 < 0.9850(范围:0.97844 - 0.98494)。我开始将 AG OOF 与 solo 模型一起使用,这终于帮助我在 66 个 OOF 的情况下达到了 0.985087 的 CV,和 0.98533 的排行榜分数(私有:0.98513)。此时,我开始感觉良好,因为这是我没有任何与其他 submission 混合的情况下获得的最好分数。与此同时,使用 CPU 的 AG 给了我约 0.98524 的分数。

最后,我决定将一些 OOF 扔进 AG 里——我担心太多的 OOF 会耗尽 Kaggle 上的运行时间,所以我使用爬山算法来决定使用哪些 OOF,并在得分最高的 AG OOF 之上添加了爬山算法选出的 8 个。将这个混合投入 AG,我启动了运行并疯狂地监控中间结果,直到运行结束,AG 排行榜分数为 0.985124。兴奋地,我怀着期待提交了, bingo!排行榜分数是 0.98532(私有:0.98516)。有了 0.98533 和 0.98532 的集成,我感觉越来越好,尽管我很清楚任何数量的 brilliant Kagglers 都可能随时超越我(有些可能也隐藏在附近潜伏的混合大军中)。

终于,我决定抛开谨慎,将所有 72 个 OOF 扔进 AG,令我高兴的是,即使是 CPU 运行也在排行榜上产生了 0.98535(私有:0.98512),这个 0.98535 比我第一个更有信心。与此同时,我看到许多人卡在 0.98533 和 0.98534 好几天,所以 0.98535 似乎可能接近获胜分数。

我没有 GPU 配额了,所以在 Kaggle 之外搜索,徒劳无功。Saturn Cloud 每月提供 15 小时,但你不能一次性运行那么长时间而得不到他们团队的协助。Lightning.ai 每月提供 22 小时,但每次 GPU 不超过 4 小时。尽管如此,我试图在那里重复 72 个 OOF 的 AG 运行,并很快意识到他们缺少几个我在 Kaggle 上认为理所当然的包,因为它们是为深度学习设置的。所以没有 LGBM(最初很震惊!),等等。我注意到他们有一个使用 32 个 CPU 的选项,所以我决定在那里运行 3 小时,理由是这可能比 Kaggle 上 4 个 CPU 运行 12 小时更好。我担心结果可能会令人失望,但令我大大 relieved 的是,它产生了另一个 0.98535(私有:0.98513)。

此时,有很多人紧跟在我后面——我更担心像 0.98533 的 @tilii7 和 0.98532 的 @oscarm524 这样的已知强者,因为我知道他们在做扎实的工作,而不仅仅是混合到虚无中。我 indulged 在我的 0.98535 上进行了一次不那么盲目的混合,导致公共排行榜分数为 0.98537(私有:0.98513)——我知道它在私有排行榜上不一定会得分更高,但至少可能会让一些追求者 pause 😀

我也对我的两个 solid 0.98535 进行了一些试错集成,但没有选择其中任何一个作为最终的两个,因为它们的分数为 0.98535 或更低。有趣的是,我最好的私有排行榜分数来自这里——50-50 混合产生了 0.98517 的私有分数,这是我的最高分;其他几个产生了 0.98514。我的最高 0.98535 与 66 个模型的 Ridge 集成的 0.98533 的 90-10 混合产生了 0.98533 的公共分数,但私有分数为 0.98516(第二高)。

故事的教训——信任你的 CV 分数,并在保持 CV 和排行榜一致的同时继续构建。尽可能避免盲目混合,尽管它可能很诱人。

最后几天我有一些伟大的计划,但家庭紧急情况与精力耗尽的结合意味着大部分计划未能实现。我无法遵循 @tilii7 关于学习 xLearn 的建议,没有运行像我上次运行过的 TabNet 这样的模型,也没有足够深入地优化任何一个模型,比如将 XGBoost 推过 0.9850 (CV),或将 CatBoost 从 CV < 0.9848 范围中拯救出来等。

一直以来,我的公共排行榜分数比我的 Ridge CV 分数高约 0.0002,比我的爬山算法 CV 分数高 0.0001。所以我预计私有排行榜分数会与我的 CV 分数差不多,事实证明确实如此。月初,许多人表示相信不会有重大变动,因为我们有数百万样本,而有些人,如 @oscarm524,预计会有变动,因为人们会以各种方式处理噪声数据,这可能无法泛化到私有数据。最后,混合者证明了即使有数百万样本的数据集也确实可能过拟合,因为确实发生了相当大的变动。另一方面,像 @neupane9sujal, @bwandowando, @co000l, @ravaghi, @roberthatch 等人在排行榜上取得了 50-200 名的 impressive 跳跃!祝贺他们以及所有进入前 10 或前 25 名的人。就我个人而言,在两个月前从第 1 名跌到第 113 名之后,这个月感觉作为一名 Kagglers 成长了一点。

整个月,我一直打算远离 Kaggle,花更多时间在我(应该)也在做的 LLM 课程上,但我几乎痴迷了。上个月,我得了第 4 名,但因为 @tilii7 已经在前三名 finished 而获得了一件 T 恤。我当时说过,总有一天,我会赢得别人得到的那件 T 恤——已经实现这一点令人 immensely gratifying。

既然我已经 managed 获得了一件 T 恤和第 1 名的位置,我将退一步,更 judiciously 地参与,因为我真的需要花时间在上 LLM 课程上(有任何有趣的 LLM 项目数据集的建议吗?提前感谢!)。我会时不时提交,但会将 intense 参与保留到每月的最后一周,如果有的话。祝大家一切顺利!在 Playground 系列中追逐排行榜的六个月令人惊叹!非常感谢沿途帮助过的每个人。我现在想开始花更多时间在 Kaggle 的其余部分(和其他地方),但将继续参与 Playground 系列,这是我困难一年中最好的事情之一——非常感谢 Kaggle,以及所有让这变得如此有趣和 engaging 体验的你们。

Happy Kaggling!

同比赛其他方案