返回列表

9th Place Solution, 9 Models in the Ensemble

651. Playground Series - Season 5, Episode 5 | playground-series-s5e5

开始: 2025-05-01 结束: 2025-05-31 大众健身 数据算法赛
第 9 名解决方案,集成 9 个模型
作者: Iqbal Syah Akbar (MASTER)
发布日期: 2025-06-01
竞赛排名: 第 9 名

第 9 名解决方案,集成 9 个模型

距离我上次参加 Kaggle 比赛至少已经一年了。我本来打算坚持到最后,但中途不得不离开,部分原因是工作优先级占了上风,部分原因是这个 Playground 系列赛一如既往,有好有坏。很高兴知道我完全没有生疏 :)

特征工程

我做了四项特征工程:

  1. 我用信任的编码器对所有模型编码了 Sex 特征:M-Estimate Encoder。
  2. 对于神经网络和线性回归,我将每个特征的倒数添加到模型中。例如:$$\frac{1}{Sex}\text{, }\frac{1}{Height}\text{, etc.}$$
  3. 具体对于线性回归,我必须使用 scikit-learn 的 PolynomialFeatures 生成特征的多项式组合包括它们的交互项。这是因为线性回归需要很多特征才能表现相对良好,而神经网络不需要,因为你可以将第一层的单元设置得足够高以达到该目的。
  4. 另一方面,对于 ridge,我使用了标准缩放和 Nystroem 与多项式核,原因同上。
  5. 如果你想以相对较快的速度生成数千个特征而不杀死你的 kernel(只要你不过度挑选参数),你可以使用随机森林嵌入。由于它是无监督的,你可以在训练和测试数据集的连接上训练它(如果你愿意,也可以是原始数据集)。遗憾的是我只来得及在 plain CatBoost 上使用这个。这里的目标不是找到绝对最好的单个模型;只是为了给集成提供多样性。

模型

如前所述,我使用了神经网络 (Tensorflow)、线性回归、ridge 和 plain CatBoost。我使用的其他模型除了编码外没有任何特征工程,分别是 Random Forest, XGBoost, LightGBM, 和两个具有不同 bootstrap 类型的 CatBoost。这 6 个模型除了 Random Forest 外都用 Optuna 进行了调优。总的来说,这只是 9 个模型。我当然可以像其他人那样做得更多 :)

集成

我首先使用 Ridge 检查本地 CV 分数,看看需要排除哪些模型。之后我使用 Optuna 找到实际的最佳权重。我本来打算尝试 Hill Climbing,但在放弃之前我太懒了。

注意事项

  1. 原始数据集可能不会显著改善 CV,但我总是发现包含它比不包含要好。
  2. 有时并不总是将所有模型调优到绝对最好。虽然提高单个模型的 CV 是好的,但有些模型不应该拥有最佳参数,以便为集成提供最佳多样性。我在 Random Forest 上有过这种经验。
  3. 始终确保你的 CV 是稳健的。如果你想包含原始数据集,始终在将数据集分割为训练和验证之后连接它,而不是之前。你真的想确保验证数据集反映了测试数据集。
  4. 我不知道其他人怎么样,但我的神经网络在不使用残差的情况下表现最佳。它的层结构只是 [256 > 64 > 16 > 4 > 1 (output)],反正每层激活函数之前都有批归一化。
同比赛其他方案