651. Playground Series - Season 5, Episode 5 | playground-series-s5e5
感谢 Kaggle 举办的另一个有趣的游戏场竞赛。这个月与过去几个月不同,因为所有特征都是数值型的且没有缺失值 (NaN)。
我的最终解决方案是将数百个 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 |
最终的爬山法集成模型具有:
在我的最终集成中,25% 的权重是带有 NVIDIA cuML 目标编码器特征的 XGBoost。这表明多样性比单个模型的 CV 得分更重要。我的带有目标编码特征的 XGBoost 每个的 CV 得分较差,为 0.06XX,但它们改善了最终集成的 CV 0.05890 => 0.05880 和 私有 LB 0.05847 => 0.05841。
对于每个特征,我创建了一个 log1p 版本,即 df[f'log1p_{c}'] = log1p( df[c] )。然后我创建了所有特征对之间的乘积、除法、和与差。
CatBoost 喜欢分类特征,所以我将每个数值特征转换为 9 个等宽分箱值。我还创建了所有特征的 log1p 版本,并将它们转换为 9 个分箱值。之后,我创建了所有列对的组合。结果新列有 81 个唯一值,也是分类的。然后我们使用 cat_features = CATS。
对于分组特征,我会选择一组人,如使用分箱的 Sex 和 Age,然后计算每个人关于其 height 的 z-score。然后计算他们关于 weight 的 z-score,即对于 40 多岁的男性,他们的体重与其他 40 多岁的男性相比如何。
我创建了 26 个这样的特征。我会从 1 到 3 个特征组成组,然后计算另一个特征的 z-score。另一个例子是 [ ["Sex","Weight_bin","Body_Temp"], ["Heart_Rate"] ],。这意味着我从 Sex, Weight, Body_Temp 组成组,并计算 Heart_Rate 的 z-score。
我在 NVIDIA cuML 线性回归模型的残差上训练了我的公开笔记本神经网络。这将 CV 从 0.0608 改善到 0.0599。线性回归模型在捕捉数据中的线性关系方面做得很好。然后它帮助神经网络更好地学习这些关系。
new_target = old_target - LinearRegression_OOFfinal_pred = NN_PRED + LinearRegression_PRED。我在公开神经网络笔记本的残差上训练了带有乘积特征的 XGB。这并没有提高 XGB 的 CV 得分,但它创建了一个新的多样化模型,改善了我的爬山法集成 CV 得分。我们使用与上面“基于线性回归的神经网络”部分类似的要点来实现这一点。
我在所有 Kaggle 竞赛中都使用以下技巧。我的 OOF 是 5 折交叉验证,我们使用爬山法从这些 OOF 中找到模型权重。然后我们使用 100% 的训练数据重新训练所有模型,并使用固定的迭代次数,等于 5 折交叉验证早停的平均迭代次数的 25% (即 1/(K-1)) 以上。然后我们使用基于 5 折交叉验证 OOF 的爬山法找到的权重,对这些 100% 测试预测进行加权平均。这在每个 Kaggle 竞赛中都能带来不错的提升!(我还使用不同的种子训练 K 个这样的模型并平均预测结果)。