返回列表

[1st Place Solution AutoML Grand Prix] AutoML Grandmasters: AutoGluon Distributed + Post-Hoc Ensembling

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

开始: 2024-08-01 结束: 2024-08-31 临床决策支持 数据算法赛
[第一名解决方案 AutoML 大奖赛] AutoML 大师:AutoGluon 分布式 + 事后集成

[第一名解决方案 AutoML 大奖赛] AutoML 大师:AutoGluon 分布式 + 事后集成

作者: Lennart Purucker (以及 Nick Erickson, Arjun Krishnakumar)

发布日期: 2024-08-02

竞赛: Playground Series S4E8 (AutoML Grand Prix)

大家好!

又一个激动人心的 24 小时自动拟合机器学习模型比赛!向所有参赛者致敬,并特别感谢 Team AGA,他们早期取得的 0.98533 分数让我们倍感压力,我们在接下来的 12 个小时里一直在试图超越这个分数。最终,胜负取决于微小的分数差异,甚至 Kaggle leaderboard 都无法可视化这种差异,所以我们觉得自己很幸运能够险胜。以下是我们对第四届大奖赛方法的详细介绍。

但首先,我们要强调的是,2024 年国际自动化机器学习会议 (AutoML 2024) 将于 9 月 9 日至 12 日在巴黎举行 (见 https://2024.automl.cc/)!我们将参加会议,很高兴能在会议上见到来自 Kaggle 的其他 (Auto)ML 爱好者 :)


概述图

SolutionOverview

总结

我们使用 AutoGluon 作为我们的 AutoML 系统,通过源码安装最新主线版本并进行调整以启用分布式计算(见下文)。在此基础上,我们本次比赛的方法总结如下:

预处理

  1. 我们替换了数据中的噪声观测值。没有其他操作能 improve 我们的离线交叉验证 (CV) 分数。

模型拟合

我们运行了一小时的默认版本 AutoGluon 和四小时的自定义版本 AutoGluon。对于自定义版本,我们使用了以下设置:

  1. 我们使用 log loss 作为早停指标,同时基于目标指标 MCC 进行优化/选择。我们不确定这是否有帮助,但它提高了我们的离线 CV 分数。
  2. 我们使用了 16 折交叉验证和 AutoGluon 的多层 stacking 实现。
  3. 我们训练了一个自定义模型组合,元学习自 TabRepo (即零样本 HPO)。
  4. 我们对 事后 集成 使用了 100 次迭代(而不是默认的 25 次)。

Kaggle 技巧

  1. AutoGluon 在确定最终加权集成期间的决胜局时,将分数四舍五入到前 6 位小数。事实证明,对于我们正在寻找的 delta 来说,这太少了,所以我们在最后将其提高到 8 位,以获得微小的改进。
  2. 我们手动为此比赛创建了事后集成逻辑,试图从 0.98531 提升到 0.98533。我们缓存了所有实验中所有模型的所有预测概率,然后为最终解决方案运行了事后集成。这使我们能够勉强超越 Team AGA!

计算资源

在上一次比赛之后,我们觉得需要为这些(非常)大数据比赛扩展我们的计算能力。因此,除了使用单个 AWS 计算实例外,我们还努力使用跨计算节点分布的 AutoGluon。

  1. 我们使用了分布式版本 AutoGluon 的原型,以便在计算资源上并行化 AutoGluon。
  2. 我们使用了内部 SLURM 集群(来自弗莱堡大学)以及 Ray,将 AutoGluon 的模型训练分布在 1000 个 CPU 上。

代码

本 write-up 的补充代码仓库可以在这里找到:https://github.com/AutoML-Grandmasters/Fourth-AutoML-Grand-Prix/tree/main

我们自定义运行 AutoGluon 的可复制设置可以在这个 文件 中找到。

预处理

我们使用以下代码清理测试预测中不存在的不噪声观测值,将它们设置为 nan。

import numpy as np
import pandas as pd

train_data = pd.read_csv("./train.csv")
test_data = pd.read_csv("./test.csv")

weird_columns = [
    "cap-shape",
    "cap-surface",
    "cap-color",
    "gill-attachment",
    "gill-spacing",
    "gill-color",
    "veil-type",
    "veil-color",
    "has-ring",
    "ring-type",
    "spore-print-color",
    "habitat",
    "does-bruise-or-bleed",
    "stem-root",
    "stem-surface",
    "stem-color",
]

for col in weird_columns:
    allowed_vals = test_data[col].unique()
    train_data.loc[~train_data[col].isin(allowed_vals), col] = np.nan
    test_data.loc[~test_data[col].isin(allowed_vals), col] = np.nan

早停指标

要在 log_loss 上早停,请将以下内容传递给 AutoGluon 的 fit 调用:ag_args_fit={"stopping_metric": "log_loss"}。这有时会有所帮助,因为在基于阈值的指标(如 MCC)上早停可能过早。

分布式 AutoGluon & 计算

这是当前版本的分布式 AutoGluon:https://github.com/LennartPurucker/autogluon/tree/distributed_autogluon
有关如何使用它的更多细节的示例脚本可以在这里找到:https://github.com/AutoML-Grandmasters/Fourth-AutoML-Grand-Prix/blob/main/autogluon_distributed_example.py

根据我们的经验,它 mostly 稳定,但有一些与 GPU 相关的问题,我们希望在原型中修复这些问题。我们计划在未来将此更成熟的版本集成到主线 AutoGluon 中(并且已经在进行中)。

我们使用了 1000 个 CPU,分布在具有 20 或 32 个 Intel(R) Xeon(R) Gold 6242 CPUs @ 2.80GHz 的节点上,每个节点约有 150 GB 的 RAM。集群由 SLURM 管理,我们使用 Ray 创建一个子集群,AutoGluon 可以(原生地)使用该集群来拟合模型。要运行分布式 AutoGluon,只需要一个 Ray 集群,可以在本地计算、SLURM 集群或云资源上创建。

此外,我们使用了一个具有 192 个 vCPUs 的 AWS m7i.48xlarge EC2 实例来运行默认 AutoGluon。

自定义模型组合 (Portfolio)

为了获得比 AutoGluon 中现有的更好的模型组合,我们重新运行了 TabRepo 论文(将在 AutoML 会议上展示)的工作,但使用大小为 200 的组合,而不是 AutoGluon 的 best_quality 设置中使用的 100 大小组合。我们还包含了更多的模型族:线性模型和 KNN,尽管我们最终禁用了一些模型,因为它们没有帮助,有时推断需要很长时间。

我们还为 LightGBM、XGBoost 和 CatBoost 添加了具有更大 max_bin 值的配置。此外,我们移除了一组我们发现对于大数据集预测时间过长的配置。你可以在这个 文件 中找到最终组合。我们过滤了表现良好的模型组合(见 这里)。

更多的事后集成迭代

我们希望通过给 AutoGluon 中的 贪婪集成选择 更多迭代来找到更好的最终事后集成。遗憾的是,到目前为止,还没有简单的界面来增加这个数字。因此,我们简单地修改了本地安装的 AutoGluon 源码。为此,需要将 此行 中的值设置为 100。

Kaggle 技巧

  • 要调整四舍五入的小数位数,请将 autogluon.core.models.greedy_ensemble.ensemble_selection.EnsembleSelection 第 112 行中的 round_decimals 变量设置为 8 (见 GitHub 上的 这里)。
  • 我们的手动事后集成逻辑可以在这个 文件 中找到。它假设你磁盘上有一个完成的 AutoGluon 运行(在我们的例子中,我们为此使用了一小时的默认运行),以及来自另一个 AutoGluon 运行的以下工件:a) 测试数据上的 预测概率,b) 训练数据上的 折外预测概率,以及 c) 测试数据上的 预测

此致,
Lennart, Nick (@innixma), 和 Arjun (@neonkraft), 代表 "AutoML 大师" 团队

prior Grand Prix 竞赛 Write-ups: 第一届 AutoML 大奖赛竞赛, 第二届 AutoML 大奖赛竞赛, 第三届 AutoML 大奖赛竞赛

同比赛其他方案