大家好,
问候!
我非常高兴能够展示我在 Playground 第 5 季第 8 集竞赛中排名第 5 的解决方案和 writeup。我想向 Kaggle 提供本次竞赛以及公共论坛上丰富多样的分享的 fellow 参与者表示诚挚的感谢。我的最终解决方案是以下 kernels 中提出的想法与我自己的输入的结合 -
- https://www.kaggle.com/code/mikhailnaumov/no-blending-bank-classification-xgb-lgbm-cat-ydf
- https://www.kaggle.com/code/itasps/0-97705-cv-0-97604-pg-s5e8-single-xgb
- https://www.kaggle.com/code/mahoganybuttstrings/pg-s5e8-single-xgb-cv-0-975782-lb-0-97681
- https://www.kaggle.com/code/bizen250/bank-term-deposit-single-catboost
- https://www.kaggle.com/code/yekenot/ps-s5-e8-deeptables-nn
- https://www.kaggle.com/code/molozhenko/playground-s5e8-advanced-lightgbm
- https://www.kaggle.com/code/cdeotte/xgboost-using-original-data-cv-0-976
- https://www.kaggle.com/code/cdeotte/train-more-xgb-nn-lb-0-9774
请查阅下方的解决方案方法 -
特征工程
- 我基于给 ChatGPT 的简单提示创建了特征并使用它们 - 没有任何特征在大范围内有效!
- 我使用了 2-gram、3-gram 和 4-gram 特征,并将它们作为输入,原始数据作为行和列。为了避免内存限制,我避免了将 4-gram 特征用于原始数据作为列的情况。
- 正如许多公共 kernels 所示,我将所有类别列作为字符串使用,并在交叉验证期间使用基于树的内部编码器来处理它们。
- 我在 fold 内部使用均值和计数编码器作为主要特征。我还在 fold 外部使用计数编码器,将
train + test set作为一个组合实体。我观察到这是一个数据泄漏不会损害模型的罕见例子。这可以说明如下:
(
pl.concat( [ train.select(pl.col(col, "id")), test.select(pl.col(col, "id"))] , how = "vertical_relaxed" ).
group_by(pl.col(col)).
agg("id").count()
)
- 我使用 polars 进行特征工程,并使用 parquet 文件和 hive 分区存储结果数据集。这有助于我轻松快速地检索信息。每个分区有 50,000 行。我还 wherever applicable 使用向下转换技术减少了内存。
交叉验证方案 (CV-scheme)
- 我使用了 state = 42 的分层 5 折交叉验证方案。
- 我所有的模型运行在整个过程中都遵循相同的交叉验证方案。
- 我没有在此管道中进行任何完全重新拟合和随机状态调整,而是转而使用具有不同特征的模型。
离线模型训练 - 单模型
- 我使用了提升树、MLP、TABM 模型,使用了一系列特征,始终将原始数据作为行/列。
- 我还为这些模型创建了伪标签,并使用/不使用伪标签训练了 2 阶段管道。
- 我还在原始和编码特征上训练了 1 个 Autogluon 模型,并仅将结果包含在伪标签中 - 这些模型未用于任何后续步骤。
离线模型训练 - 第 2 阶段集成
- 我在此阶段使用了 Autogluon。我训练了 7 个 autogluon 模型,运行时间为 16 小时,使用不同的特征和模型作为堆叠集成。
- 我在此处尝试了其他 AutoML 工具如 H20.ai,但 Autogluon 表现要好得多,我只在最终阶段集成中使用了 Autogluon。
- 这是集成中非常有效的元素,尽管提供了巨大的 CV 提升。
离线模型训练 - 第 3 阶段集成
- 我使用几个候选模型作为输入进行了爬山法 (hill-climb)。我设计了 10 个爬山法,使用负权重和正权重作为选项。
- 我还使用了 5 个逻辑回归,使用来自单模型和第 2 阶段集成的几个模型候选者。
- 我的最终提交是爬山法和逻辑回归结果的 50-50 混合。
- 我的替代提交是带有 320 个模型候选者的第 2 阶段 Autogluon 的结果。我的 CV 分数在此处最大化,我将此候选者用作最终提交。
交叉验证结果
without 伪标签
| 模型算法 | CV 分数范围 |
|---|---|
| XGB | 0.97161 - 0.97645 |
| LGBM gbdt | 0.9712 - 0.9762 |
| LGBM goss | 0.9713 - 0.97625 |
| Catboost | 0.9707 - 0.9751 |
| MLP | 0.9728 - 0.9741 |
| TABM | 0.9731 - 0.9758 |
带伪标签
| 模型算法 | CV 分数范围 |
|---|---|
| XGB | 0.9718 - 0.97652 |
| LGBM gbdt | 0.97125 - 0.9763 |
| LGBM goss | 0.9714 - 0.9763 |
| Catboost | 0.9708 - 0.97545 |
集成
| 模型算法 | CV 分数范围 |
|---|---|
| Autogluon | 0.97656 - 0.97745 |
| Hill-climbers (爬山法) | 0.97676 - 0.97746 |
| Logistic Regression (逻辑回归) | 0.97635 - 0.9773 |
GPU 配置
| 模型算法 | GPU |
|---|---|
| Autogluon | L4 Colab |
| Hill-climbers (爬山法) | L4 Colab |
| XGB | A6000 Ada, A6000, A5000, 4090 |
| LGBM | 4090 |
| Catboost | L4, A100 |
| MLP | T4 X 2 |
| TABM | T4 X 2 |
最终评论
祝您未来的竞赛、个人和职业发展一切顺利!在接下来的 playground 剧集中再见!
致敬,
Ravi Ramakrishnan