664. Playground Series - Season 5, Episode 8 | playground-series-s5e8
我第一次真正参加 Kaggle 竞赛的实验、错误与学习之旅
这是我第一次认真尝试 Kaggle 竞赛,通过特征工程实验不同的特征集,我学到了很多。
最终,我得到了两个不同的特征工程 pipeline,并使用 AutoGluon 融合了它们的预测结果。
我的解决方案的整体架构如下所示:
.png?generation=1756703169336333&alt=media)
我使用简单的 CatBoost 模型和 5 折交叉验证 (CV) 测试了每个特征工程的想法:
我最关注的特征是数值转类别转换。许多其他参赛者 simply 将数值特征转换为类别特征,我注意到这个简单的步骤可以大幅提升性能(使用简单的 CatBoost 从 0.965 提升到 0.972)。
所以我尝试逐个对特征进行分类,结果如下:
.png?generation=1756704796643914&alt=media)
两个特征被证明具有最显著的影响。它们的分布都很广泛,所以我假设它们可能受到某些周期模式或特定值的影响。
当我按值对这些特征进行分组并统计目标值时,我发现某些值的样本量比邻近值大得多,在某些情况下,目标值全为 0 或全为 1。
基于此,我创建了一个新特征,根据目标分布分配标签(例如,全 1 目标 → 1,全 0 目标 → 0,混合 → -1),这提高了性能。(它未用于最终特征集,但我仅用于验证目的进行了测试)
起初,我认为这种分类可能只在 CV 或公开排行榜上表现良好,因此作为替代方案,我还尝试使用商和余数变换来捕捉周期性。然而,事实证明,即使在私有排行榜上,类别转换也是有效的。回顾过去,我认为这个错误的假设阻止我运行更多可能进一步改进解决方案的实验。
起初,我使用了三种类型的模型:XGBoost、LightGBM 和 CatBoost。我从它们的默认参数开始,然后使用 Optuna 进行超参数调优。对于初始化,我要么使用 ChatGPT 的参数建议,要么从其他 notebook 借用参数,然后用 Optuna 进行微调。
之后,我通过结合不同的特征集和不同的超参数构建了多个模型,最后使用元模型和爬山法 (hill climbing) 对它们进行集成。
在调整超参数时,我觉得性能并没有像我预期的那样容易提升。那时,我决定尝试 AutoML 并 switched 到 AutoGluon。我对它的预定义超参数设置和分布式训练的简便性印象深刻。
我从 5 折、1 个特征集、1 个堆叠层和中等质量(表示为 5,1,1,medium)的配置开始,后来扩展到 (10,2,2,medium) 和 (8,2,2,best)。
对于其中一个提交,我选择了 (8,2,2,best) 设置。为了进一步测试分类的有效性,我创建了一个新的特征集,从原始集中移除了一些特征并添加了目标编码和类别转换,然后再次使用 (8,2,2,best) 配置进行训练。
最后,我融合了特征集 1 和特征集 2。然而,由于 AutoGluon 的推理时间非常长,而且时间紧迫,我无法进行基于 CV 的融合,不得不采用盲融合 (blind blending)。讽刺的是,这种盲融合给了我最好的性能。
| 方法 | CV 分数 | 公开榜 | 私有榜 |
|---|---|---|---|
| 基础特征集 (特征集 1) + CatBoost optuna | 0.97441 | 0.97524 | 0.97510 |
| 基础特征集 (特征集 1) + LGBM optuna | 0.97337 | 0.97422 | 0.97405 |
| 基础特征集 (特征集 1) + 融合 16 个模型 (爬山法) | 0.97556 | 0.97612 | 0.97600 |
| 基础特征集 (特征集 1) + Autogluon(5,1,1,medium) | 0.9758 | 0.97660 | 0.97646 |
| 基础特征集 (特征集 1) + Autogluon(5,1,1,best) | 0.97601 | 0.97667 | 0.97659 |
| 基础特征集 (特征集 1) + Autogluon(10,2,2,medium) | 0.97578 | 0.97636 | 0.97624 |
| 基础特征集 (特征集 1) + Autogluon(8,2,1,best) | 0.97640 | 0.97688 | 0.97685 |
| * 基础特征集 (特征集 1) + Autogluon(8,2,2,best) | 0.97647 | 0.97693 | 0.97687 |
| 类别特征集 (特征集 2) + Autogluon(8,2,2,best) | 0.97689 | 0.97746 | 0.97704 |
| * 盲融合 (0.5, 0.5)(特征集 1, 特征集 2) | --- | 0.97787 | 0.97766 |
这次竞赛不仅给了我第一次尝试 AutoML 模型的机会,也让我重新审视了 EDA、特征工程、特征选择、超参数调优和集成学习。虽然我犯了一些错误也有一些遗憾,但我很幸运最终取得了一个不错的结果。我的下一步是将这次竞赛中学到的知识应用到我的工作中, aiming for 更好的结果。