返回列表

Winning approach- Team Cross Sellers

619. Playground Series - Season 4, Episode 7 | playground-series-s4e7

开始: 2024-06-30 结束: 2024-07-31 保险科技 数据算法赛
获胜方案 - Cross Sellers 团队

作者: Ravi Ramakrishnan (Grandmaster), Minato Namikaze (Grandmaster)

团队: Team Cross Sellers

发布日期: 2024-08-01

竞赛: Playground Series Season 4 Episode 7

获胜方案 - Cross Sellers 团队

大家好,

我非常感谢 Kaggle 提供的 Playground 系列竞赛 episode。我要感谢所有 fellow 参与者以及我的团队成员 @arunklenin 成功组建了团队。我也想赞扬 @uryednap @tilii7 @optimistix 在整个月的竞赛过程中带来的激烈且健康的竞争。

以下是我们本次任务的方案:

策略概述

  1. 我们从 episode 一开始就意识到,该数据集具有近乎完美的 CV-LB(交叉验证 - 排行榜)关系,且数据量使其几乎完全免受过拟合风险的影响。
  2. 本任务需要高性能的 GPU 资源来进行高效的模型开发和实验。我们决定不使用 Kaggle 免费资源,而是依赖更好的 GPU 硬件,包括 A6000x2, A6000Adax2, A100, A5000x2, RTX4090, RTX3090 (本地 PC) 用于我们的临时实验。
  3. 我们很清楚在本次任务中使用神经网络的优势。我们在此使用了多种神经网络,所有尝试都非常成功。
  4. 时间管理和资源管理是本任务的关键。模型训练必须精准,集成模型也必须很好地管理内存资源和完成时间。我们计划在最终集成中混合多种多样的模型,并在整个竞赛过程中依赖相同的 CV 方案,以促进有效的模型比较。
  5. 数据组织是我们成功的关键。我们采用了标准的文件和模型命名约定,定期跟踪实验,并控制 individual CV-LB 分数,使我们能够在最终集成中选择正确的模型组合。一些微小但相关的步骤,如文件命名标准化、代码自动化、使用组织良好的 GitHub 仓库以及带有 CV 导向特征包含的计划特征存储设计,帮助我们建立了 robust、快速、有效且有意义的模型训练机制。
  6. 我们相信,使用多样化的训练数据集、多种特征组合、多种模型参数和选项,以及神经网络架构与 boosted tree 模型的多样组合会产生结果,也许我们的信念 prevailed!我们在本任务中采用了 3 种训练数据集思路:
  • 仅来自竞赛的训练数据(完全忽略补充数据集)
  • 由竞赛和补充数据集创建的训练数据
  • 来自竞赛的训练数据,补充数据集完整地添加到每个 fold 中 - 这种方法将我们的 CV 提升到了最大
  • 我们一致使用以下 CV 方案:
    StratifiedKFold(n_splits = 5, shuffle = True, random_state =42)

特征工程

  1. 我们借鉴了竞赛 AutoML 部分中顶尖帖子的想法,但仅在竞赛合成训练数据上测试特征(以避免补充数据的偏差)。我们坚持仅使用一个简单的 Catboost 模型在一个 fold 上测试特征重要性。
  2. 我们设计了特征存储来整理我们的特征想法,并在此步骤结束时为所有后续实验创建了即用型数据集。该存储的示例 Kernel 在此处。我们实际的特征存储包含 12 个版本(版本 V1-V12),此 Kernel 仅作说明。
  3. 使用这样一个集中式的特征存储,包含经过测试的特征,帮助我们很好地快速迭代暴力实验。

模型训练过程

我们采用了如下所示的 3 步训练过程:

模型阶段 包含模型 模型训练选项和策略
阶段 1 模型 1. LightGBM (手动)
2. LAMA lgb
3. Catboost
4. Denselight NN 和 MLP
5. Tab-Resnet
6. Tab-Transformer
7. Autoint
* 完整训练数据
* 基于先前投保 (2 个模型)、车辆损坏 (2 个模型)、先前投保 + 车辆损坏 (4 个模型) 的组件模型
阶段 2 模型 1. LightGBM (手动)
2. LAMA lgb
3. Catboost
4. Denselight NN 和 MLP
5. Tab-Resnet
6. Tab-Transformer
7. Autoint
* 完整训练数据
* 基于先前投保 (2 个模型)、车辆损坏 (2 个模型)、先前投保 + 车辆损坏 (4 个模型) 的组件模型
阶段 3 模型 XgBoost * 来自阶段 1 和 2 模型选项的选定 OOF 预测

这可以可视化如下:

训练过程可视化

关键说明

  1. 我们使用了来自此处工作的公共 Kernel 输出。
  2. 我们在弱学习器中没有使用 XgBoost 和 max_bins
  3. 我们将 tree 模型与神经网络堆叠,反之亦然。
  4. XgBoost 堆叠器作为最后一步是 CV-LB 关系最有效的选项。
  5. 除了公共 Kernel 输出外,我们在过程中的任何地方都没有使用 max_bins。
  6. 我们在最终模型中使用了78 个弱学习器,并在整个月内训练了超过 125 个实验

辅助资源

我们已经公开了我们的单一模型和一些选定的堆叠和混合。欢迎使用以下的 Kernels 和数据集:

Kernel/ 数据集 内容 链接
PlaygroundS4E07-ModelPP * 所有组件模型的 OOF 分数
* 最终堆叠器模型的数据准备
https://www.kaggle.com/code/ravi20076/playgrounds4e07-modelpp
PlaygroundS4E07-ModelCollation * 单一模型和一些混合及堆叠 https://www.kaggle.com/datasets/ravi20076/playgrounds4e07modelcollation
PlaygroundS4E07- * 来自选定私人实验的堆叠示例
* 包含 train-original 和 test-original 之间重复项的后处理数据集,用于反转标签
https://www.kaggle.com/datasets/ravi20076/playgrounds4e07privatefiles

后处理

  • 我们在第 1 天发现了此处讨论的目标反转,并在 Auto ML 提交中也使用了它。
  • 我们所有的提交都全程包含目标反转后处理。
  • 我们的最终提交都保留了后处理元素。

对我们有效的做法

  1. 单一模型和集成模型之间的有效时间管理和资源分配
  2. Catboost - 这是最好的单一模型,结合 category_features,被证明是最好的单一模型选项
  3. 所有神经网络选项对我们都有效。将它们与 Catboost 模型堆叠一起提升了我们的 CV-LB
  4. LightGBM 在这里也非常有效,并为最终堆叠提供了良好的多样性提升
  5. 使用公共 Kernel 在竞赛结束前对我们有所帮助

对我们无效的做法

  1. Catboost 堆叠器
  2. 线性方法、Optuna、Hill Climb
  3. XgBoost 弱学习器 - 它们单独使用时很好,但当我们将其包含在最终模型中时并未提高最终 CV 分数
  4. 调和平均数/几何平均数泛化
  5. LAMA 密集模型 - 它们在堆叠方法中导致内存溢出

关键心得

  1. 在此类任务中,时间和资源管理是关键 - 有效的实验跟踪是关键。MLOps 对于 Kaggle 也很重要,尽管这没有直接测试和评估。
  2. 必要时必须为竞赛投入资源。使用更好的资源使我们能够更好地实验。
  3. 有时偏离规范很重要 - 不使用 XgBoost 阶段 1 模型使我们受益匪浅。

结语

  1. 我们向所有人致以诚挚的祝愿,希望在下一次 episode 中见到大家!
  2. 我们可能认为,尽管我们集体努力了一个月,但数据集中现在仍有很多未开发的信号。也许如果时间允许,可以考虑在此基础上继续工作并进一步提高分数。

祝大家一切顺利,学习愉快!

此致,
Ravi Ramakrishnan

同比赛其他方案