返回列表

1st Place - GPU Hill Climbing!

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

开始: 2025-05-01 结束: 2025-05-31 大众健身 数据算法赛
第一名 - GPU 爬山法!

第一名 - GPU 爬山法!

作者: Chris Deotte (Grandmaster)
发布日期: 2025 年 6 月 1 日
竞赛: Playground Series S5E5

感谢 Kaggle 举办的另一个有趣的游戏场竞赛。这个月与过去几个月不同,因为所有特征都是数值型的且没有缺失值 (NaN)。

GPU 爬山法

我的最终解决方案是将数百个 GBDT、神经网络 (NN) 和 NVIDIA cuDF cuML 模型输入到我的 GPU 爬山法启动笔记本中,详见这里。在 2025 年 5 月整个月期间,我利用 GPU 的速度和 NVIDIA cuDF cuML 构建了尽可能多的多样化模型。

爬山法很棒,因为它可以自动为我们选择模型。从数百个候选模型中,爬山法选择了以下 7 个模型:

权重 模型 备注 CV 得分
1/12 XGBoost cuML 目标编码特征 1 0.06084
1/12 XGBoost cuML 目标编码特征 2 0.06061
1/12 XGBoost cuML 目标编码特征 3 0.06053
1/4 XGBoost 乘积特征 0.05951
1/6 CatBoost 分箱特征和分组特征 0.05937
1/6 基于线性回归的神经网络 神经网络见这里 0.05999
1/6 基于神经网络的 XGB 神经网络见这里 0.05989

最终集成 CV 和 LB 得分

最终的爬山法集成模型具有:

  • RMSLE 交叉验证 (CV) = 0.05880
  • 公开排行榜 (LB) = 0.05677
  • 私有排行榜 (LB) = 0.05841

带有 cuML 目标编码器的 XGBoost (CV=0.06XX)

在我的最终集成中,25% 的权重是带有 NVIDIA cuML 目标编码器特征的 XGBoost。这表明多样性比单个模型的 CV 得分更重要。我的带有目标编码特征的 XGBoost 每个的 CV 得分较差,为 0.06XX,但它们改善了最终集成的 CV 0.05890 => 0.05880私有 LB 0.05847 => 0.05841

带有乘积特征的 XGBoost (CV = 0.05951)

对于每个特征,我创建了一个 log1p 版本,即 df[f'log1p_{c}'] = log1p( df[c] )。然后我创建了所有特征对之间的乘积、除法、和与差。

带有分箱特征和分组特征的 CatBoost (CV=0.05937)

CatBoost 喜欢分类特征,所以我将每个数值特征转换为 9 个等宽分箱值。我还创建了所有特征的 log1p 版本,并将它们转换为 9 个分箱值。之后,我创建了所有列对的组合。结果新列有 81 个唯一值,也是分类的。然后我们使用 cat_features = CATS

对于分组特征,我会选择一组人,如使用分箱的 Sex 和 Age,然后计算每个人关于其 heightz-score。然后计算他们关于 weightz-score,即对于 40 多岁的男性,他们的体重与其他 40 多岁的男性相比如何。

我创建了 26 个这样的特征。我会从 1 到 3 个特征组成组,然后计算另一个特征的 z-score。另一个例子是 [ ["Sex","Weight_bin","Body_Temp"], ["Heart_Rate"] ],。这意味着我从 Sex, Weight, Body_Temp 组成组,并计算 Heart_Rate 的 z-score

基于线性回归的神经网络 (CV=0.05999)

我在 NVIDIA cuML 线性回归模型的残差上训练了我的公开笔记本神经网络。这将 CV 从 0.0608 改善到 0.0599。线性回归模型在捕捉数据中的线性关系方面做得很好。然后它帮助神经网络更好地学习这些关系。

  • 使用 5 折交叉验证种子 42 训练线性回归。制作 OOF 预测和测试 PRED 预测。
  • 创建一个新目标new_target = old_target - LinearRegression_OOF
  • 使用训练数据和新目标训练神经网络 (使用 5 折交叉验证种子 42)
  • 在测试集上推断神经网络,然后 final_pred = NN_PRED + LinearRegression_PRED

基于神经网络的 XGB (CV=0.05989)

我在公开神经网络笔记本的残差上训练了带有乘积特征的 XGB。这并没有提高 XGB 的 CV 得分,但它创建了一个新的多样化模型,改善了我的爬山法集成 CV 得分。我们使用与上面“基于线性回归的神经网络”部分类似的要点来实现这一点。

锦上添花 - 使用 100% 训练数据重新训练

我在所有 Kaggle 竞赛中都使用以下技巧。我的 OOF 是 5 折交叉验证,我们使用爬山法从这些 OOF 中找到模型权重。然后我们使用 100% 的训练数据重新训练所有模型,并使用固定的迭代次数,等于 5 折交叉验证早停的平均迭代次数的 25% (即 1/(K-1)) 以上。然后我们使用基于 5 折交叉验证 OOF 的爬山法找到的权重,对这些 100% 测试预测进行加权平均。这在每个 Kaggle 竞赛中都能带来不错的提升!(我还使用不同的种子训练 K 个这样的模型并平均预测结果)。

同比赛其他方案