返回列表

4th Place Solution

423. Tabular Playground Series - Feb 2021 | tabular-playground-series-feb-2021

开始: 2021-02-01 结束: 2021-02-28 保险科技 数据算法赛
TPS Feb 2021 - 第4名方案

TPS Feb 2021 - 第4名方案

首先,祝贺比赛的获胜者 @ryanzhang@davidedwards1@kntyshd@ryanzhang@davidedwards1 的 DAE(去噪自编码器)方案非常优雅。同样,感谢所有分享想法、思路和代码的人。这里有一些很棒的 EDA、优秀的笔记本,以及关于方法、模型类型、编码、噪声和预处理的精彩讨论,这些都非常有帮助。这真的很有趣!

我将把我的方案分为两部分:技术细节和一些有用的经验教训。我认为有用的经验教训可能更有见地,因为技术方案并不是特别新颖,实际上相当枯燥。我获得第4名的成绩实际上是运气和直觉的结合,特别是在信任自己的指标与公共排行榜方面。

技术信息

我的提交结果是通过两层堆叠方法生成的:

  • 第一层(Level 1):

    • 14个 CatBoost 模型(类别变量使用 CatBoost 编码处理)
    • 17个 XGBoost 模型(类别变量使用留一法编码处理)
    • 27个 LightGBM 模型(类别变量使用标签编码处理)
    • 10个随机森林模型(类别变量使用留一法编码处理)
    • 10个岭回归模型(类别变量使用留一法编码处理)
  • 第二层(Level 2):

    • 1个岭回归模型

我稍后会解释为什么我生成了这么多第一层模型。每个第一层模型都使用10折交叉验证进行训练(重要的是,每个模型在训练期间使用相同的折数据)。每一折的训练预测结果被保存下来,作为第二层的训练集。对测试数据的预测是折外生成的,并成为第二层的测试输入。

第二层模型在上一层的训练预测结果上进行训练,同样使用10折交叉验证。上一层的折外测试预测被用作测试集,最终的测试预测也是折外生成的。最终模型的交叉验证 RMSE 分数为 0.84159,公共排行榜分数为 0.84190。

所有这些模型都是使用自定义的 Python 框架训练的。其目的是创建一个抽象的回归模型类,隐藏构建 CatBoost、XGBoost、LightGBM、随机森林和岭回归模型(以及其他一些我没时间整合的模型)的内部细节。受 @hamzaghanmi 发布的关于 LGBM Hyperparameter Tuning Using Optuna 的讨论帖和笔记本的启发,该框架对每个模型的参数空间进行随机搜索,并保存低于特定 RMSE 分数阈值的模型和折外训练及测试预测。然后,框架可以聚合多个模型的结果,将它们转化为第二层的训练集和测试集。理论上它可以堆叠任意多层,尽管我自己的测试表明,堆叠超过2层效果不佳。此外,第二层模型本可以是 LightGBM 或 CatBoost 模型,但我自己的测试和交叉验证表明,这些模型的表现不如岭回归。感兴趣的人可以知道,使用两台机器组合生成这些模型大约花费了36小时,一台配备第3代酷睿 i5 和 24GB 内存,另一台配备 Ryzen 5 3600X、32GB 内存和 GTX 1060 GPU。

经验教训

以下是我认为可以提供更多有用信息的地方。

噪声

在比赛初期,几次 EDA 显示特征之间的相关性不高,实验表明,删除重要性低的特征产生的模型表现不如保留所有特征的模型。其他特征工程实验,如多项式特征生成、分箱、归一化、缩放等,效果都不佳。我在各种编码方法上也发现了类似的结果。所有这些都意味着,比赛将取决于模型处理数据中噪声的能力。回顾上个月(我没来得及参加),DAE 似乎是非常优越的解决方案。虽然我花了不少时间尝试 DAE,但在寻找最佳噪声混合方面没能取得太大进展(但下个月还有机会)。

多模型策略

那时,我开始尝试单个 LightGBM 模型,看看能调优到什么程度。深入研究后,我学到了两件事:

  • max_bincat_smoothnum_leaves 这样的参数,即使数值差异很大,也能生成不错的模型。我的想法是,每个模型都在以不同的方式调整噪声。如果这是真的,那么堆叠可能会比单一模型产生更好的结果,因为堆叠可以利用每个模型整体上不同的拟合方式。