657. Playground Series - Season 5, Episode 6 | playground-series-s5e6
首先,我想感谢组织者本月举办了另一场极其有趣的 Playground 竞赛。
我也想感谢所有分享讨论、代码和各种见解的人。这是一次非常愉快且富有教育意义的经历。
我的解决方案是一个 3 层集成:
100 个 OOF 预测(来自 5 折 SKF) → L2 模型 (XGB, LGBM, LogReg, NN) → L3 爬山算法。
所有实验和提交均仅使用 Kaggle Notebooks 完成。
original 数据集上训练,而另一些则在 train + original 上训练(原始数据权重为 4.0)。original 数据上预训练,然后在 train 数据上微调。auc 和 merror 作为其 eval_metric。以下是主要 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,但显著提高了最终集成的性能。
我使用了 100 个 OOF 预测来训练 L2 堆叠模型:XGBoost、LightGBM、逻辑回归 和 神经网络。
最后,我使用 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)。
original 数据集显著更大的权重有时会导致性能提升。mAP@3 很困难(优化 mlogloss 通常是一个好的 proxy),但 Hill Climbing 似乎在直接优化 mAP@3 时比优化 logloss 更 stable。max_depth。