返回列表

1st Place Solution - CatBoost All The Way Down

627. Playground Series - Season 4, Episode 10 | playground-series-s4e10

开始: 2024-09-30 结束: 2024-10-31 信贷风控 数据算法赛
第一名解决方案 - CatBoost 贯穿始终

第一名解决方案 - CatBoost 贯穿始终

作者: Hardy Xu
发布时间: 2024-11-01

嘿 Kagglers!我以前在这些 Playground 系列竞赛中非常活跃,但在 2023 年 12 月的比赛后,我休息了一段时间。大约 10 天前,我一兴起决定开始参加这个比赛,它的刺激感一如既往。获得第一名确实是个惊喜,但也是个令人愉快的惊喜!

交叉验证

我相信你们以前听过这个,但在这些竞赛中要想取得好成绩,建立一个稳健的交叉验证(Cross-Validation)方案来评估预测性能是非常重要的。我看到很多人问该做什么样的特征工程,或者如何最好地集成模型、填补数据、工程化特征等等。对于绝大多数这些问题,没有任何一个单一的答案是普遍适用于任何数据集的。找出什么对特定数据集有效的唯一方法是尝试各种选项,看看什么表现最好,这就是交叉验证的作用。在这些 Playground 竞赛中,数据通常在训练集和测试集之间按 60-40 分割,测试集的 20% 用于公共排行榜。这意味着 CV 分数衡量了你在整个数据集60%上的表现,而公共排行榜仅衡量了你在全数据集上8%的表现,这使得交叉验证性能比公共排行榜性能成为更可靠的进度指标。以下做出的所有决定都是基于优化我的交叉验证性能。

数据预处理

特别感谢社区成员提供的将数值特征视为类别特征的提示。我发现最有效的方法是同时保留数值特征及其类别副本。我没有做其他特征工程,因为我过去在 Playground 竞赛中的经验通常是特征工程用处不大。我确实包含了原始数据集。

建模

我这里的总体方法与上次竞赛中使用的方法相同。对于 XGBoost、LightGBM 和 CatBoost,我使用 Optuna 寻找 10 组不同的“最优超参数”,并对它们的预测结果取平均,以获得每个模型的整体预测。特别感谢 @omidbaghchehsaraei 的帖子 这里 提供的关于使用较大 max_bin 值的提示。我还添加了一个神经网络,其灵感 heavily 来自 @paddykb 的 Notebook 这里。每个模型的性能如下:

模型 CV 分数 公共榜 私有榜
LightGBM .96811 .97005 .96637
XGBoost .96767 .96989 .96540
CatBoost .96972 .97299 .96865
NN .96678 .97088 .96577


我认为我的秘诀可能是,对于这些模型预测中的每一个,我都训练了一个 CatBoost 模型,使用初始模型预测作为基线。如何做到这一点的示例可以在 这里 找到。我不确定是什么启发我这样做的,也许是看到 CatBoost 在这份数据上表现惊人,但令我惊讶的是,CatBoost 能够显著提高每个模型预测的性能,即使是那些最初由 CatBoost 生成的预测。这些经 CatBoost 改进的模型性能如下:

初始模型 CV 分数 公共榜 私有榜
LightGBM .96856 .97048 .96713
XGBoost .96815 .97024 .96611
CatBoost .96997 .97334 .96903
NN .96732 .97117 .96667


我发现令人印象深刻的是,使用 CatBoost 预测作为基线的 CatBoost 模型本身就足以获得第 3 名。CatBoost 是这次竞赛的王者!最后一步是用一个神经网络将这 4 个预测堆叠在一起。这挤出了最后一点性能提升,使解决方案达到了顶峰。

CV 分数 公共榜 私有榜
.97059 .97344 .96938
同比赛其他方案