538. Playground Series - Season 3, Episode 8 | playground-series-s3e8
大家好!感谢 Kaggle 的所有参赛者和组织者带来了这场激动人心的比赛!
在分享我的解决方案之前,我想提一下,我过去经历过几次具有挑战性的“大洗牌”🙃,因此,我在本次比赛中的主要目标是能够在可能发生的任何洗牌中生存下来。虽然我们最终没有经历任何重大的洗牌,但多亏了我宝贵的随机种子,我的解决方案表现良好。
我必须感谢这些精彩的 Notebook,向它们的作者致敬:
基本上,我尝试使用尽可能多的特征/特征组合。然后,我准备了一个自定义脚本,在该脚本内部,给定 n 等于 X 的长度,一个 LGBM 模型会迭代运行 n-1 列。目的是确定哪些特征是有用的,哪些是无用的。如果丢弃某个特征会降低我模型的成功率,我会果断丢弃该特征。在这样做时,使用多种种子至关重要,因此我使用了不同的种子,并取分数的平均值。但是,RMSE 的微小改进可能很棘手,如果折数的标准差高于默认值(即使用 n 列完全训练的模型),它可能会损害您的模型。
因此,根据上述方法,我制作了几个不同的数据集。起初,我试图降低 RMSE,甚至没有看标准差的数值。然后,一旦我检查了标准差,我又准备了另外两个数据集。在第二次尝试中,我试图同时降低标准差和 RMSE;在第三次尝试中,我试图仅降低分数的标准差。(我对 RMSE 的容忍阈值是 0.015,所以如果丢弃一个特征导致 RMSE 增加 +0.015 且标准差减少 -0.01,我会接受它。)一旦我看到我的 std_avg 从 4.5 左右下降到 3.8 左右,我就停止了该过程。
在建模部分,我使用 Optuna 调整参数,默认值为 n_iterations = 1000 / learning_rate = 0.1。调整参数后,我将 n_iterations 增加到 10000,并将学习率降低到 0.01(ESR = 300)。我的最终解决方案包括来自这些不同数据集的 XGBoost + LightGBM + CatBoost 预测(如 xgb1, xgb2, xgb3, lgb1, lgb2, lgb3 ..)。
(顺便说一句,我在参数调整和建模中也使用了不同的种子组合!在我最后一次提交中,我的预测来自一个具有 10 个不同种子的训练-预测循环。这就是为什么我将其命名为 'thats_the_code',我想 :P)