第 19 名解决方案:108 个 OOF 模型与 RidgeCV 融合
第 19 名解决方案:108 个 OOF 模型与 RidgeCV 融合
战略融合助力第 19 名成绩的深度剖析
我很激动地分享我们在最近的 Kaggle Playground Series 竞赛“银行数据集的二元分类”(第 5 季,第 8 集)中的解决方案,我们在数千名参与者中获得了最终第 19 名的成绩。
这次竞赛是一个经典的表格数据二元分类问题。我们成功的关键不在于单个复杂模型,而在于精心 crafted 的108 个多样化模型的融合集成,并使用 RidgeCV 进行正则化。以下是我们方法的分解。
核心策略:多样化融合
我们的最终解决方案是许多单个模型预测的加权平均(融合)。我们没有使用简单的平均,而是使用Ridge 交叉验证 (RidgeCV) 来学习组合这些模型的最佳权重,有效地让算法决定更信任哪些模型。
我们解决方案的整个架构可以可视化如下:
我们如何构建多样性
成功集成的基本规则是多样性。我们的目标是让模型犯错,但要以不同的方式犯错。一个以独特方式出错的模型可以通过其他模型的共识来纠正其错误。我们通过以下几种关键方式生成这种多样性:
- 特征工程: 我们创建了多个具有不同工程特征集的数据集。有些 heavily 包含原始特征,而另一些则更多地依赖新创建的特征。
- 目标编码: 这是多样性的主要来源。我们对分类特征应用了多种编码策略(均值、中位数、标准差、方差、最小值、最大值等),每种策略都为模型学习创建了略有不同的数据表示。
- 模型类型与超参数:
- ~70% 梯度提升 (XGBoost, LightGBM, CatBoost): 这些是我们的主力军,提供了最强的单个分数。我们广泛改变了它们的超参数、深度、学习率和随机种子。
- ~30% 神经网络 (TensorFlow/Keras): 虽然它们的单个性能低于最好的 GBDT 模型,但它们至关重要。它们的错误模式与树模型高度互补,为融合提供了不同的“视角”,显著提高了我们的分数。
- 随机性: 仅仅改变数据拆分或模型初始化的
random_state 就会产生meaningfully 不同的模型,可以添加到集成中。
最后阶段:线性直觉
在最后几个小时,我们尝试将一个简单的线性回归模型(其本身性能较差)添加到 RidgeCV 融合中。有趣的是,它将本地 CV 分数提高了 +0.000016。然而,在公共 leaderboard 上,它导致下降了 -0.00017。
这是关于过拟合以及信任 CV 与公共 LB 之间一致性的重要教训。我们决定提交两个解决方案:
- 最终提交(第 19 名): 融合不包含线性回归模型。
- CV 分数: 0.977242 | 公共 LB: 0.97784 | 私有 LB: 0.97744
- 替代提交(约第 21 名): 融合包含线性回归模型。
- CV 分数: 0.977258 | 公共 LB: 0.97767 | 私有 LB: 0.97740
关键要点与经验教训
行之有效的做法:
- 警惕数据泄露: 我们非常细致,特别是在目标编码方面,确保在每个交叉验证 fold 内正确计算以避免泄露。这建立了对我们 CV 分数的信任。
- CV-LB 相关性: 我们的本地 CV 分数是公共 leaderboard 性能的可靠指标。当一个变动时,另一个也朝同一方向跟随。这给了我们在实验中的信心。
- 社区参与: 积极学习竞赛的讨论帖非常有价值。我们在整个竞赛中 incorporated 了许多其他人分享的新技术。
下次需要改进的地方:
- 严格遵守 CV 方案: 纳入的 108 个模型中有些来自其他贡献者,使用了不同的验证拆分。虽然它们的 OOF 预测很有价值,但这种不一致性阻止了我们探索更高级的技术,如 stacking。下次,我将优先在统一的 CV 方案下重新训练所有模型。
- 模型管理: 拥有超过 100 个模型,组织成为一个挑战。我需要一个更好的系统来跟踪它们——更具描述性的命名约定,也许需要一个专用工具或电子表格来记录每个模型的参数、特征和性能。(我很想听听其他人如何管理这个!请在评论中分享您的技巧。)
这是一次非常有趣且富有教育意义的竞赛。非常感谢 Kaggle 举办 Playground Series,也感谢所有分享见解并营造协作环境的参与者,特别是 @cdeotte 和 @tilii7。
恭喜 @optimistix 和其他获奖者!