返回列表

2nd Place Solution - L3 Ensemble of 100+ OOFs

657. Playground Series - Season 5, Episode 6 | playground-series-s5e6

开始: 2025-06-01 结束: 2025-06-30 作物智能识别 数据算法赛
第二名解决方案 - 100+ OOF 的 L3 集成

第二名解决方案 - 100+ OOF 的 L3 集成

作者: Masaya Kawamata
发布时间: 2025 年 7 月 1 日
竞赛排名: 第 2 名

首先,我想感谢组织者本月举办了另一场极其有趣的 Playground 竞赛。
我也想感谢所有分享讨论、代码和各种见解的人。这是一次非常愉快且富有教育意义的经历。

我的解决方案是一个 3 层集成:
100 个 OOF 预测(来自 5 折 SKF)L2 模型 (XGB, LGBM, LogReg, NN)L3 爬山算法
所有实验和提交均仅使用 Kaggle Notebooks 完成。

Solution Diagram

L1 - 模型库

Model Zoo Diagram
  • 多个 XGBoost 模型,使用不同的分类特征组合进行训练。有些仅在 original 数据集上训练,而另一些则在 train + original 上训练(原始数据权重为 4.0)。
  • 一个 XGBoost 模型,先在 original 数据上预训练,然后在 train 数据上微调。
  • XGBoost 模型,使用额外的工程特征进行训练,如分箱特征、聚类特征和目标编码。
  • 一个 XGBoost 模型,包含了由监督自编码器生成的潜在特征。
  • XGBoost 模型,使用 aucmerror 作为其 eval_metric
  • ExtraTreesRandomForestNN 模型,使用 XGBoost 的预测作为特征进行训练。
  • 几个 LightGBM 模型,镜像了 XGBoost 的实验。
  • 逻辑回归 和三种类型的 神经网络(TabTransformer, 简单 NN)。

以下是主要 L1 模型的 CV 分数 summary:

模型 CV (mAP@3)
All Cat XGB 0.37768
All Cat LGBM 0.37483
CB over XGB 0.37707
Finetune XGB 0.37753
NN 0.36067
XGB + FE 0.345 - 0.365

大多数其他模型的分数在 0.34 到 0.369 之间。虽然它们 individually 表现不佳,但它们 contributed 了集成的多样性。值得注意的是,添加了如目标编码或来自监督自编码器的潜在特征等特征的模型,得分约为 0.35,但显著提高了最终集成的性能。


L2 & L3 - 堆叠与爬山算法

我使用了 100 个 OOF 预测来训练 L2 堆叠模型:XGBoostLightGBM逻辑回归神经网络

  • 对于 逻辑回归NN,我发现使用过多的 OOF 特征会损害 CV 和 LB 性能。我使用 Optuna 为这些模型选择了最佳的 OOF 子集。我想使用前向选择,但由于计算限制选择了 Optuna。
  • 对于 XGBoostLightGBM,我使用了所有 100 个 OOF 特征, without 任何参数调整。

最后,我使用 L3 爬山算法 混合了这些 L2 模型的预测,直接优化 mAP@3,以创建我的最终提交。

以下是 L2 和 L3 模型的 CV 分数:

模型 CV (mAP@3) CV (logloss)
L2_NN 0.38321 1.87040
L2_LGBM 0.38343 1.87014
L2_XGB 0.38348 1.86997
L2_LogReg 0.38362 1.87074
L3_Hill Climb 0.38418 1.86958

讨论与思考

正如我们许多人 discovered,XGBoost 在这次竞赛中表现 exceptional。很难用 CatBoost 达到类似的分数。我尚未得出令人满意的结论来解释为何存在如此显著的性能差距。

一个有趣的观察是最佳的 max_depth

  • 当将 所有列视为分类 时,最佳的 max_depth 大约在 7-8
  • 当将数值列视为数字时,最佳的 max_depth 要高得多,大约在 16-18

这是我的假设:
通过将数值列视为分类,模型可以用更少的 split 更有效地学习非线性和交互,同时对异常值也不太敏感。这种组合可能允许用较浅的 max_depth (7-8) 构建更 robust 和 generalizable 的模型。当使用原始数值特征时,16 的非常高 max_depth 可能是模型试图通过一系列线性 split 强行拟合数据的复杂关系的迹象,可能导致过拟合。分类似乎提供了一个“提示”,帮助模型更适当地解释这些复杂性。

向社区提问: 我仍然不确定是否将 Hill Climb 用作 L2 模型。由于它是纯线性组合,我怀疑 cross-validation 可能不是 strictly 必要的,尽管感觉是最安全的方法。它作为 L2 模型有效吗,还是最好保留为最终的 L3 混合?我非常感激听到你们在这个话题上的想法、经验或理论解释。
(顺便说一句,在我的实验中,选定的 OOF 组合 across folds 几乎相同,这表明 CV 可能不是 essential)。


本次竞赛的关键收获

  • 集成是关键: 当使用 Hill Climb 时,拥有 多样化的模型(即使分数不同)比收集类似的高分模型更重要。
  • 与树模型堆叠: XGBoost 和 LightGBM 作为堆叠器时相对 robust 于噪声,使得 OOF 特征选择 less critical。
  • 与线性/NN 模型堆叠: 逻辑回归和 NN 对噪声更敏感,它们的性能通常通过仔细的 OOF 特征选择得到改善。
  • 加权原始数据: 给予 original 数据集显著更大的权重有时会导致性能提升。
  • 优化目标: 虽然直接优化 mAP@3 很困难(优化 mlogloss 通常是一个好的 proxy),但 Hill Climbing 似乎在直接优化 mAP@3 时比优化 logloss 更 stable。
  • 特征工程: 将所有特征视为分类(或分箱)可以是一个非常有效的策略,但要注意它可能会改变最佳超参数,如 max_depth
  • 最后一周: 最好在最后一周忽略 Public Leaderboard,以避免过拟合和 second-guessing 你的 CV 策略。
同比赛其他方案