返回列表

1st place solution

536. Playground Series - Season 3, Episode 7 | playground-series-s3e7

开始: 2023-02-14 结束: 2023-02-27 数据算法赛
第一名解决方案

第一名解决方案

作者:Hardy Xu
排名:第 1 名

特征工程

虽然所有数据都是数值型的,但查看数据描述后发现,type_of_meal_planroom_type_reservedmarket_segment_type 这些特征实际上属于分类变量。我通过以下 3 种不同方式处理了这些变量:

  1. 保持原样
  2. 独热编码
  3. 标记为分类特征(用于 LGBM)

我尝试创建额外的特征,但没有发现任何能显著提高交叉验证(CV)分数的方法。

数据泄露

在训练集和测试集中,如果去掉预订状态,共有 1531 对重复记录。

  1. 其中 562 对位于训练集中,仔细观察后发现,每一对记录都有相反的预订状态。
  2. 其中 253 对位于测试集中。
  3. 剩下的 716 对包含 1 条训练集记录和 1 条测试集记录。

出于好奇,我尝试修改提交结果,将测试集中这 716 条记录的预测值设为训练集中对应记录的相反值,结果我的排行榜分数提升了 +0.014。我天真地希望把这个秘密藏在心里,但社区很快也发现了这一点 😅。不过,我要感谢 @siukeitin 建议“对测试集中 253 对重复记录预测为 0.5”。这让我的分数又提升了 +0.003,我认为这个技巧当时并没有那么广为人知。

此外,我从训练集中移除了 562 对重复记录,以及 716 条在测试集中有重复的记录,因为我发现这样做能提高我为此测试构建的留出集的分数。不过,我认为这对我的私榜分数提升甚微。但是,我确实认为移除训练集中的重复对可能有助于提高 CV 的可靠性。

数据清洗

在训练集和原始数据集之间进行对抗验证时,我绘制了原始数据集属于训练集的预测概率,得到了如下双峰分布:

对抗验证概率分布图

这促使我尝试移除原始数据集中看起来最不像训练集的那部分数据。最终,我使用的模型既包含了整个原始数据集,也使用了移除了约 17% 最不像训练集数据的原始数据集。

我也尝试过修正日期等操作,但并未发现 CV 分数有显著提升。

建模

我的 CV 设置是分层 3 折交叉验证并重复 3 次。创建提交结果时,取各折预测值的平均值。在调整超参数时,我注意到增加树的表达能力似乎比以往更能提高性能。这意味着在 XGBoost 中使用 'exact' 算法而不是 'hist',并将 max_depth 设在 12-13 左右;在 LGBM 中使用更大的 max_leaves 和 max_bin 值。

我获胜的提交结果是以下 4 个 XGB 提交和 2 个 LGBM 提交的平均值:

  • XGB
  • XGB(分类变量独热编码)
  • XGB(缩减后的原始数据集)
  • XGB(分类变量独热编码 + 缩减后的原始数据集)
  • LGBM(缩减后的原始数据集)
  • LGBM(分类特征 + 缩减后的原始数据集)
同比赛其他方案