Rank 2 方法 - 一个世纪的特征组件集与深度集成
Rank 2 方法 - 一个世纪的特征组件集与深度集成
Rank 2 方法 - Playground S5E2
大家好,
感谢 Kaggle 带来这一期引人入胜的 Playground 系列赛!这与 usual Playground episodes 非常不同!感谢我的 fellow participants 在整个月中的健康竞争。
我的整体方法是提升树、神经网络和 Ridge 模型的深度混合,辅以深度特征工程,架构如下图所示 -
特征工程
- 正如在几个公开 kernels 和帖子中讨论的那样,这是比赛中最重要和关键的组成部分。
- 我将
WeightCapacitykg 列作为 float 使用,并将其 字符串 twin 作为单独的特征。在我的样本数据集中,该列标记为 WeightCapacity。
- 我在 9 个数据集中准备了总共 1600+ 个特征,并将它们存储在特征 store 中,以便在整个月中检索和使用。
- 我对所有字符串/类别变量使用了 OrdinalEncoder,然后将它们组合成 1-2-3-4-5-6-7 gram 组合,并存储在单独的数据集中以便检索。
- 我还使用了 这里 的 kernel 中的原始特征想法,并将它们与我的工程特征一起在 2 个单独的数据集中使用。我这里只考虑了 bigrams 和 trigrams,因为特征数量爆炸式增长,资源不足以处理生成的数据量。
- 我使用 Colab TPU 来准备这些特征,因为我在 TPU 上获得了一个拥有超过 200GB RAM 的虚拟机。我将所有组件特征存储在单独的 parquet 文件中以便检索和使用,并使用 Polars 进行后续特征检索 和使用。
- 我使用 CuML 的 TargetEncoder 进行所有编码目的,并使用
mean, median, count, nunique 作为聚合器。
- 我已经开源了一组特征供你们查阅 这里。
交叉验证方案
我对所有模型使用了 20 折交叉验证方案,包括分类器,以保持所有单一和混合模型的一致性。
cv = KFold(n_splits = 20, shuffle = True, random_state = 42)
第一层模型训练
- 我在上述特征范围中提取的单独特征集上训练了 CatBoost、XGBoost 和 LightGBM 模型作为我的第一层模型。
- 每个模型包含一个单独的特征集,具有重要的共同特征。某些特征如
WeightCapacity, WeightCapacitykg, Brand, Brand-Color-Size, Brand-Material-Size, Brand-Color-Material-Size 等几乎总是存在,而其他特征是模型特定的。我确定了前 50 个重要特征并将它们保留在所有模型中,并在组件模型中变化其他特征。
- 我设计了总共 65 个提升树模型,单一模型解决方案的 CV 分数如下 -
| 模型类型 |
设计的单一模型数量 |
CV 分数范围 |
| XGB Regressor |
21 |
38.6463 - 38.75856 |
| LGBM Regressor |
20 |
38.6471 - 38.66303 |
| Catboost Regressor |
21 |
38.6480 - 38.74479 |
此外,我还设计了带有自编码器的单独提升树模型,如下所示 -
| 模型类型 |
设计的单一模型数量 |
CV 分数 |
| XGB Regressor |
1 |
38.65556 |
| LGBM Regressor |
1 |
38.65727 |
| Catboost Regressor |
1 |
38.658758 |
- 此外,我还设计了一个简单的密集神经网络 分类器,带有整数目标,以增加集成的多样性。这个模型作为单一提交是一个糟糕的选择,但它为集成增加了所需的多样性,并在混合时产生了轻微的增益。
| 模型类型 |
设计的单一模型数量 |
CV 分数 |
| Dense NN classifier |
1 |
38.891892 |
公共成果
- 我使用了带有少量调整的公共自编码器模型,并执行了 这里 的 kernel,并将它们用于我的集成。
- 感谢这些 kernel 的作者!
第二层模型训练
- 我必须将这些提升树模型混合成一个有意义的集成,并 thought of 使用一个简单的 MLP 作为堆叠器模型。我使用 Kaggle 和 Colab TPU 来训练这些神经网络模型。人们经常使用 CPU 和 GPU 资源,但拖延了每周可用的 20 小时 TPU 时间!本月许多实验的关键是有效地利用这些资源!
- 我创建了总共 35 个堆叠器神经网络模型,具有不同的模型 OOF 特征,CV 范围如下 -
| 模型类型 |
设计的单一模型数量 |
CV 分数范围 |
| NN stacker |
35 |
38.63546 - 38.65008 |
第三层模型训练与后处理
- 这是模型过程中的最后一层,一个简单的 Ridge 模型,混合了 L1 提升树 + L2 神经网络模型、公共成果和 MLP 分类器模型的结果用于提交。
- 我的最终提交包含 100 个模型 的组合,CV 分数为 38.62860836,公共排行榜分数为 38.82326,私有排行榜分数为 38.62947。
- 我还将预测值四舍五入到最接近的整数值 - 这略微降低了 CV 但提高了排行榜分数。由于 CV 不太优化,我选择这个作为替代提交。这个在私有排行榜上的得分略低,分数为 38.63039。
对我无效的方法
- 样本权重 (Sample weights)
- 将原始数据附加到竞赛数据
- 在执行目标编码时在特征中使用方差和标准差聚合器
- 后处理 - 我发现
训练集和测试集 之间以及 训练集和额外训练数据 之间有一些重复的行。在我的提交结果中复制这些 common rows 的目标对我没有任何帮助。
- 在第三层使用 Ridge 以外的任何模型
本次任务的关键收获
- 这是一个 GPU 密集型任务,我学会了如何通过整个月的大量 GPU 导向训练更好地管理我的资源。
- 我学会了在这里使用 TPU 进行特征工程和模型训练的艺术。TPU 与神经网络配合得很好,这是快速迭代多个实验的快速方法!
- 我变得更擅长特征编码,强调目标编码 - 这对工作任务也是一个巨大的增益!
训练 GPU 栈
| 阶段 |
GPU/TPU 使用情况 |
| 特征创建 |
Colab TPU |
| XGBoost |
A6000 Ada + 128 GB RAM |
| LGBM |
A6000 + 128 GB RAM |
| CatBoost |
A6000 Ada x 2 + 256 GB RAM |
| L2-NN |
Colab TPU/ Kaggle TPU |
| Ridge |
本地 CPU |
| 模型参数调优 + 特征实验 |
本地 GPU (3090) + 128GB RAM |
结语
祝贺我的 fellow swag 奖品获得者,祝愿所有参与者一切顺利,祝大家学习愉快!
希望在即将到来的 Playground 剧集以及 across Kaggle 特色竞赛中取得最好的成绩!
致敬,
Ravi Ramakrishnan