第1名方案:回归任务之鲍鱼数据集竞赛
作者:Johannes Heller · 发布于 2024‑05‑01
背景
业务背景:https://www.kaggle.com/competitions/playground-series-s4e4
数据背景:https://www.kaggle.com/competitions/playground-series-s4e4/data
方法概述
在本次竞赛中,我尝试最大化集成学习(ensemble)的 GBDT 策略的价值。之前在另一个表格数据竞赛中,我尝试了各种神经网络架构,却发现没有一个具有竞争力。我认为那些声称 ANNs 已经在表格数据上与 GBDTs 持平的论文没有做好充分的预处理和调参。因此在这里我主要聚焦于 GBDTs。AutoGluon 间接地为集成加入了少量 ANN。
- 使用 AutoML 方案(OpenFE,Zhang et al. (2022) OpenFE: Automated Feature Generation with Expert‑level Performance,https://github.com/IIIS-Li-Group/OpenFE)进行特征工程。
- 使用序列特征选择(Sequential Feature Selection)为 LGBM、XGB、CatBoost 各自挑选约 20 个特征(除原始列外)。示例:
freq(Shell_weight)、(Length-Shell_weight)、(Whole_weight/Shucked_weight)、freq(Whole_weight)、(Whole_weight+Shell_weight)、(Length/Shell_weight)、residual(Whole_weight)、log(Whole_weight)、max(Whole_weight,Height)。
- 使用贝叶斯优化(WandB Sweeps)为 LGBM、XGB、CatBoost、HistGB 与 RandomForest Regression 寻找好的超参数组合。尝试自定义 MLP 的工作很快被放弃,见上面的评论 😞
- 训练这些模型(10‑折交叉验证),保存 OOF 预测。每折使用完整的原始鲍鱼数据集进行训练,绝不用于验证。
- AutoGluon(最初我有几次超过 Kaggle 时间限制或未返回合适 OOF 预测的失败尝试)。
- 两步集成:
- 该集成共计 49 个模型。我使用 OOF 预测和 Nelder‑Mead 算法对权重进行优化。最佳结果包含负系数,总和为 0.997。虽然看起来有点取巧,但该方案始终优于将系数限制在最小 0.0 并归一化为 1.0 的方式。因此我保留了优化后的系数来混合模型预测。
- 尝试将表现良好的公开笔记本提交加入集成。在没有 OOF 的情况下,我使用了若干提交在公开 LB 上寻找最佳权重,最终发现 17% 的权重最优,并只采用了一个基于 ANN 的提交(来自 endofnight17j03)👋
我的第二次提交跳过了外部公开笔记本,得分为 0.14372/0.14379(公开/私有 LB),也就是说它同样可以获得第一名。
提交细节
RMSLE 指标的处理
…在可能的情况下使用合适的损失函数和评估指标:
- LGBM:自定义 MSLE 损失(类似 broccoli beef 在本 讨论 中提出的方案)👋 —— 顺便说,‘gamma’ 目标得分仅略低。
- XGB:
reg:squaredlogerror
- 其它模型:使用
np.log1p / np.expm1
最佳单一模型(CV RMSLE)
- LGBM:0.14611
- CatBoost:0.14620
- XGB:0.14616
- 带自定义回归头的 XGB 分类器:0.14680
- HistGB:0.14648
- AutoGluon:0.14592
- 集成:0.14514
使用自定义回归头的分类方法
Prajwal Anagani 提出了一种与众不同的 方法👋:使用 XGB 分类器的 multi:softprob 目标,并额外加入基于 Softmax 的回归头。我仍不清楚它为何有效(可能与合成数据集的性质以及离散回归目标有关),但尽管其单独的 CV 结果比传统 XGB 回归器差,优化的集成权重仍将它包括在内。
无效的尝试
多项式特征、更复杂的堆叠/混合/元模型、传统机器学习、Stratified KFold、以及对 “Sex” 特征的任意编码(除了对不能原生接受分类特征的那些模型使用 One‑Hot 编码)都没有帮助。
高价值目标
我的模型从未预测超过 20 圈的数值(训练数据中最高为 29 圈)。任何试图填补这一差距的方法(如 SMOTE、数据增强)都会显著降低 CV 得分。同样剔除异常样本也没有帮助。
我在本次竞赛中学到的:
- AutoML 方案(如 AutoFE、AutoGluon)确实有效,但需要手动后处理才能取得竞争力。
- Kaggle API 非常棒,可以在本地 PyCharm 中编写代码,然后点击几次即可在 Kaggle 上运行。
- 将常用的代码(例如用于交叉验证和预测的 Trainer)封装成自定义 Python 包,以保证在实验时的结果可复现。Kaggle API 同样有助于自动化部署。
感谢所有组织者和共享宝贵见解的其他 Kaggle 选手 👍