返回列表

1st Place - Single Model - Feature Engineering

634. Playground Series - Season 4, Episode 12 | playground-series-s4e12

开始: 2024-12-01 结束: 2024-12-31 保险科技 数据算法赛
第一名 - 单模型 - 特征工程

第一名 - 单模型 - 特征工程

作者: Chris Deotte (Grandmaster)

发布日期: 2025-01-01

比赛: Playground Series - Season 4, Episode 12

这是一场有趣的比赛。在我前两次 Playground 比赛(2024 年 9 月,2024 年 11 月)中,特征工程并没有太多地改善 CV 或 LB,所以在那些比赛中,我花时间构建了一个由多种模型组成的大型集成(GBDT, NN, SVM 等)。

在这次 12 月的 Kaggle 保险 Playground 比赛中,特征工程帮助提高了 CV 分数和 LB 分数,所以在这场比赛中,我能够花时间构建单个模型并进行特征工程。构建一个强大的单模型非常 enjoyable。我的最终提交是一个具有 611 个特征的单个 XGBoost 模型!感谢 Kaggle 提供了一场有趣的比赛,让 Kagglers 能够练习分类特征工程!

解决方案代码 Notebook

我在这里发布了我最终提交的一个简单版本 这里,实现了 CV = 1.019。完整版本模型实现了 CV = 1.016,在 1xA100 GPU 上进行特征工程和训练需要 6 小时。简单版本在 1xT4 GPU 上需要 2 小时。简单版本只使用了 611 个特征中的 229 个。它使用 learning_rate = 0.01 对比 0.001n_estimators = 2_000 对比 20_000,以及 target_encode(kfold=5) 对比 kfold=10。(这些简化缩短了训练时间但降低了 CV 分数和 LB 分数)。

分类列的特征工程

提高 GBDT(梯度提升决策树,如 XGB, CAT, LGBM)的 CV 分数和 LB 分数的一个常见方法是为分类特征提供各种编码。给定一个分类列,基本编码是 标签编码。更高级的是 目标编码均值(即 TE)和 计数编码(即 CE)。我们甚至可以 TE 中位数TE 最小值TE 最大值TE 唯一值数量。我们将原始列加上原始的 6 种不同表示形式提供给模型。所有这 7 种不同的编码都输入到模型中,使 GBDT 有多种方式来理解分类列,从而提高 CV 分数和 LB 分数。当然,我们甚至可以发明更多的编码。

创建新的分类列

由于编码分类列可以提高我们的 CV 分数和 LB 分数,我们可以通过组合现有的分类列来创建更多的分类列。然后我们可以从新列中工程化更多的编码,从而进一步提高 CV 分数和 LB 分数。在我发布的代码 这里,我们创建了 20 个新列(通过组合现有列)。我们在 9 月的 Playground 比赛中分享了这一想法 这里

例如,我们可以将 2 列组合在一起。如果我们有列 Occupation,它是分类的,有 3 个值 ['Self-Employed', 'Employed', 'Unemployed'],我们有列 Gender,它是分类的,有 2 个值 ['Female', 'Male']。然后我们可以通过 train['new'] = train.Occupation +"_" + train.Gender 组合这两列创建一个新列。那么新列是分类的,有 6 个值 ['Self-Employed_Female', 'Self-Employed_Male', 'Employed_Female', 'Employed_Male', 'Unemployed_Female', 'Unemployed_Male']。我们也可以组合 3,4,5,6 等列。

将数值列视为分类列

另一种通常有效的技术是将数值列视为分类列。然后我们可以用 TE 均值TE 中位数TE 最小值TE 最大值TE 唯一值数量CE 对它们进行编码。我们可以将数值列与其他数值和/或分类列组合,并对结果新列应用 TECE

使用 GPU RAPIDS cuDF-Pandas 进行搜索!

在这次比赛中,在分解 Policy Start Date(分为年、月、日、小时等)之后,我们有 23 个原始列。如果我们创建 2,3,4,5 和 6 列的所有组合,我们将有 145_000 个新列!这太多了,因此我们需要找到并使用最好的列。

对于每个组合,我们需要创建新列,计算 TE 和 CE,这需要嵌套的折叠分组聚合,然后训练一个 XGBoost 模型。评估单个组合需要时间。使用 GPU cuDF-Pandas,我们可以比使用 CPU 搜索多 10 倍到 100 倍的组合,哇!

在这次比赛期间,我让我的电脑日夜运行在一个 for 循环中,运行 GPU cuDF-Pandas 评估数千个随机组合。每当使用 TE 和 CE 进行特征工程的组合 improves CV score 时,代码将其保存到列表中。运行多天后,代码找到了 170 个强大的组合。我在我的解决方案代码 这里 中发布了最好的 20 个组合。

了解更多关于分类编码的信息

如果你想了解更多关于分类列特征工程的信息,NVIDIA KGMON 将在 2025 年 3 月 17 日至 25 日于加利福尼亚州圣何塞举行的 NVIDIA 2025 GTC(即 GPU 技术大会)上举办研讨会 这里。具体来说,我们将展示如何执行 TE(目标编码)和 CE(计数编码)并解释其工作原理。我们将展示如何将这些特征纳入模型以提高 CV 分数和 LB 分数!

同比赛其他方案