423. Tabular Playground Series - Feb 2021 | tabular-playground-series-feb-2021
首先,祝贺比赛的获胜者 @ryanzhang、@davidedwards1 和 @kntyshd。@ryanzhang 和 @davidedwards1 的 DAE(去噪自编码器)方案非常优雅。同样,感谢所有分享想法、思路和代码的人。这里有一些很棒的 EDA、优秀的笔记本,以及关于方法、模型类型、编码、噪声和预处理的精彩讨论,这些都非常有帮助。这真的很有趣!
我将把我的方案分为两部分:技术细节和一些有用的经验教训。我认为有用的经验教训可能更有见地,因为技术方案并不是特别新颖,实际上相当枯燥。我获得第4名的成绩实际上是运气和直觉的结合,特别是在信任自己的指标与公共排行榜方面。
我的提交结果是通过两层堆叠方法生成的:
第一层(Level 1):
第二层(Level 2):
我稍后会解释为什么我生成了这么多第一层模型。每个第一层模型都使用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_bin、cat_smooth 和 num_leaves 这样的参数,即使数值差异很大,也能生成不错的模型。我的想法是,每个模型都在以不同的方式调整噪声。如果这是真的,那么堆叠可能会比单一模型产生更好的结果,因为堆叠可以利用每个模型整体上不同的拟合方式。