返回列表

Rank8 approach - trust the CV score

678. Playground Series - Season 5, Episode 11 | playground-series-s5e11

开始: 2025-11-01 结束: 2025-11-30 信贷风控 数据算法赛
Rank 8 方案 - 相信 CV 分数

Rank 8 方案 - 相信 CV 分数

副标题: Rank 8 方案 - 多样的特征、大量的模型和两阶段集成策略

作者: Ravi Ramakrishnan (Grandmaster)

发布时间: 2025-12-01

竞赛: Playground Season 5 Episode 11

私有 leaderboard 排名: 8

大家好,

我很高兴展示我在 Playground 第 5 季 第 11 集竞赛的解决方案 writeup。对我来说,这是一个非常动荡的月份,前两周有很多严重的健康问题,但我很高兴现在身体健康并恢复了竞技长跑,而且在我看来,基于我所支配的可用时间,我在竞赛中的表现也不错。我想向在我月初困难时期给予支持的亲密家人和朋友表示衷心的感谢。

我想向 Kaggle 举办这个有趣的挑战以及我的 fellow 参与者在整个月份中的慷慨分享表示衷心的感谢。我的解决方案是许多公开想法和我私人输入的产物。让我们深入探讨以下细节 -

任务详情

  • 目标 - 预测主体客户偿还贷款的机会
  • 模型类型 - 二分类表格分类器
  • 评估指标 - ROC-AUC 分数
  • 参赛者 = 3724
  • 公共 leaderboard 排名 = 12
  • 私有 leaderboard 排名 = 8

整体架构

如下图所示,我的整体解决方案架构依赖于 3 个主要支柱 -

  • 来自过去 playground 解决方案讨论和我过去 pipeline 的多样特征
  • 具有广泛和多样参数的模型,以引起结果的多样性
  • 一个强大的集成,以 CV 分数为基础,采用 3-4 种方法,在单一模型框架之后尽可能多地 elicited 信号提升

我在这里尝试了很多想法,其中很多在不同阶段失败了。我们将在后面的部分单独考虑这些。

整体架构示意图

特征工程

这是本次竞赛的核心元素。我从最初几天就发现,这个数据集很大,相当稳定,对集成中度敏感,但对所选特征极其敏感。1-2 个好特征会大幅提升 CV 分数,而一系列中等特征不会超过我 0.92630 的私有 baseline 分数。在某些情况下,添加某些特征甚至会 considerably 降低 CV 分数。我的初步实验和论坛上的一些相关公开意见促使我在这个月可用的时间内尝试尽可能多的特征想法。我的关键特征想法包括 -

  • 数值列的类别孪生 (category twins)
  • 涉及 2-3 个数值列的算术运算
  • 与类别特征的 n-gram 目标编码器交互
  • 原始数据作为行
  • 目标编码的原始数据列作为添加列
  • 特征编码器 - group-by 特征,1 个特征作为分组器,另一个高基数特征作为聚合器
  • 所有类别列的全局计数编码器
  • 保留低基数类别列不变,不进行目标编码
  • 根据公开想法和 kernels 进行列四舍五入
  • 从数值列中提取数字
  • 从多个数值列中合成数字组件

我使用所有这些想法创建了超过 1000 个特征,并在整个月中从我的特征存储中使用了多个特征子集。使用这样的主特征存储很方便,通常在迭代实验想法时节省时间和精力。使用 GitHub 仓库组织相关代码也有助于版本控制。

我的单一模型通常使用 65-800 个特征。相关模型的 CV 分数随后呈现。

单一模型

我在整个月中使用了很多具有不同参数的单一模型,很多想法表现不错,但也有很多失败了。让我们在这里详细讨论它们,以及组件模型的 CV 分数 -

模型类型 关键想法和思路 CV 分数范围 LB 分数范围 关键失败和成功点
XgBoost - 提供了最好的单一模型选项
- 较小的特征集,最少目标编码和 n-grams 表现最好
- 降低学习率有效,我使用 0.0010 - 0.0030 的学习率,CV 分数有所提高
- 6+ 的深度适得其反
- 随着模型中特征增多,增加 reg_lambda 富有成效
0.92630 - 0.92778 0.92610 - 0.92770 - 伪标签单独表现良好但在 blend 中失败
- 使用预训练和微调类型的安排完全失败
- 原始数据作为列的表现优于作为行
- 像 init_model 和 base_preds 这样的结构失败了
- 使用其他特征为剩余 11 个原始数据集列构建伪模型失败了
LightGBM - 提供了良好的竞争性单一模型选项
- 较小的特征集,最少目标编码和 n-grams 表现最好
- 0.0050 - 0.0070 的学习率在此模型类型中最佳
- Max-leaves 是这里的关键参数
0.92640 - 0.92774 0.92620 - 0.92772 - 伪标签单独表现良好但在 blend 中失败
- 使用预训练和微调类型的安排完全失败
- 像 init_model 和 base_preds 这样的结构失败了
- goss 变体是一个很好的多样性选项
Catboost - 提供的单一模型性能有限
- 中等特征集,100-150 列,最少目标编码和 n-grams 表现最好
- 0.01 的学习率在此模型类型中最佳
- 其他参数在 CV 性能上没有产生显著差异
0.92630 - 0.92748 0.92624 - 0.92740 - 伪标签在这里完全失败
- 整体模型类型单独来看是失败的,但我保留了一些单一模型以增加多样性
TABM - 非常好的性能,经常在 leaderboard 上媲美 XgBoost 模型性能
- 四舍五入的特征对此模型提升最大
- tabm-normal 是选项中最好的架构
- 模型训练时间高于 gbdt 对应模型,但使用更大的 GPU 如 A100/ A6000Ada 大大减少了时间
0.92665 - 0.92721 0.92698 - 0.92765 - 在集成中提供了适量的多样性,并单独为 leaderboard 分数提供了良好的提升
REALMLP - 在 leaderboard 上表现类似于 TABM 对应模型,但 CV 分数较低
- 四舍五入的特征和 bigrams 对此模型提升最大
- 模型训练时间高于 gbdt 对应模型,但使用更大的 GPU 如 A100/ A6000Ada 大大减少了时间
0.92650 - 0.92695 0.92690 - 0.92769 - 在集成中提供了适量的多样性,并单独为 leaderboard 分数提供了良好的提升

所有这些模型都使用以下 CV 方案进行训练 -
StratifiedKFold(5, random_state = 42, shuffle = True)

模型融合

这是本次竞赛的关键步骤,因为与其他 playground 竞赛不同,这不是最有效的步骤。选择一个 robust 的 blend 策略对于最大化收益至关重要。我的模型融合策略分为 3 个部分 -

部分 策略 CV LB
1 使用 autogluon stacking 0.92781-0.92820 0.92776 - 0.92787
2 使用逻辑回归 blending 0.92781-0.92784 0.92776 - 0.92788
3 多种集成方法和过去提交文件的简单平均 0.92778-0.92806 0.92778 - 0.92788

总而言之,一个好的单一模型这里是关键,很多集成候选者 elicited 更好的 CV 但与好的单一模型相比 LB 分数更差。这对于此类 Kaggle 竞赛来说是不寻常的。

使用的训练 GPU

这是一个相对较快的训练 pipeline,所以我在不同模型中采用了以下 GPU

模型类型 GPU
XgBoost L4 Colab, A100 Colab (80GB)
LightGBM L4 Colab, A100 Colab (80GB)
CatBoost A6000Ada
TABM A100 (80GB)
REALMLP A100 (80GB)

关键经验教训

  • 单一模型有时比传统的 blending 和 stacking 方法更有效
  • 依赖 CV
  • 一个好的特征存储、一个 functioning 的 GitHub repo 和有组织的文件夹结构是黄金
  • VSCode 上的 Colab 扩展很棒!

结语

衷心祝贺获奖者,并祝愿即将到来的假期季节愉快!也祝愿大家在 2025 年最后一个 Playground 集中取得最佳成绩!

同比赛其他方案