第 4 名方案 - 大量特征、大量简单模型和 Ridge 融合
排名第 4 的方案 - 大量特征、大量简单模型和 Ridge 融合!
大家好,
感谢 Kaggle 提供了一个 CV 与 LB 相关性良好的回归表格类任务!同时也感谢其他参赛者在论坛上的贡献!我很高兴在这里展示我获得第 4 名的解决方案,如下所示-
CV 方案
我使用了简单的 10 折交叉验证方案,如下所示-
Kfold(10, random_state = 42, shuffle = True)
整体模型设计
下图描述了我在这次竞赛中的整体模型工作 -
如上图所示,我选择了一个简单的流程,采用暴力特征工程,并将简单模型与 Ridge 回归进行融合。以下部分详细说明了该过程-
特征工程
- 我选择了简单的交互特征,包括整个数据集中的二元组、三元组、4-gram、5-gram、6-gram 和 7-gram。我将数值列转换为字符串数据类型并将它们包含在交互中。
- 我还使用了一些涉及数据中数值列的随机数值列整合。我还创建了一个特征,用于统计行中的空值数量,仅包含起始列。
- 我丢弃了一些基数极低/准恒定的特征。不过这一步对 CV 没有显著影响。
模型训练
我在一个月内训练了 382 个单一模型,混合并提取了上述数据存储中的特征。我选择了一个简单的融合方案,涉及常见的提升树模型,包括 -
Xgboost
- 在竞赛初期表现良好,当时特征存储中的特征较少。
- 随着特征数量的增加,该模型训练时间变长,且 CV 得分不如 LGBM 理想。
- 增加树深度被证明是对 CV-LB 提升有用的策略。
- 整个过程中,0.005 - 0.0075 的学习率范围对我的模型效果最好。
- 550-600 范围的早停轮数平衡了我的硬件限制与合适的模型。
- 在 A6000 GPU 上训练模型是一次很好的体验。整个过程我使用了 128 GB RAM。
LightGBM
- 最好的单一模型选择 - 我使用了 gbdt 和 goss 选项,两者单独表现都非常好。我前 10 名的单一模型都是 LGBM gbdt 和 goss 选项。
- 树深度为 -1 是一个奇怪的选择,但也是一个好的选择。
- 0.01 及以下的学习率是一个好的选择。
- 调整更多参数被证明是性价比低的练习,所以我更喜欢手动调整参数并构建模型。
- 我在 A6000 Ada 128 GB RAM 上训练了这些模型,结果很好。
Catboost
- 在 CV 方案上表现不是特别好,但为集成提供了必要的多样性。
- 随着特征集变宽,出现了内存问题,所以我仅在特征数量较少时使用此模型选项(< 350-400)。
- 0.01 的学习率和 12 的树深度被证明是不错的选择。
- 我更喜欢 A6000 GPU 和 256 GB RAM 用于这些模型。
Autogluon
- 我利用单一树模型提取了特征重要性,并在大多数模型选项中反复筛选出 25-100 个重要特征。
- 我使用这些 主要重要性特征 准备了 8 个特征集,并训练了 Autogluon 模型。
- 我在 Colab 上使用了 L4 GPU,AutoML 运行时间为 12-18 小时。
集成融合
- 我选择了一个简单的 Ridge 模型来融合我的单一模型以进行提交。
- 一个简单的 StandardScaler 确保所有预测在输入 Ridge 模型之前都进行了缩放。
后处理
- 我选择将所有预测四舍五入到最接近的目标值。
- 这带来了非常小的 CV 得分 improvement,但在公共 leaderboard 上的得分相同!
CV-LB 细节
如前所述,我在整个过程中享受了近乎完美的 CV-LB 关系,以下是单一模型和集成后的 CV 得分-
单一模型细节
| 模型算法 |
CV 得分 |
公共 Leaderboard |
特征数量 |
| XgBoost |
11.89035 - 12.76437 |
11.91435 - 12.79546 |
717 - 10 |
| LightGBM gbdt |
11.80357 - 12.87457 |
11.83467 - 12.91435 |
925 - 10 |
| LightGBM goss |
11.83367 - 12.84623 |
11.85891 - 12.87594 |
817 - 10 |
| Catboost |
12.00325 - 12.86532 |
12.00134 - 12.89734 |
385 - 10 |
最终提交细节
| 模型算法 |
CV 得分 |
公共 Leaderboard |
私有 Leaderboard |
特征数量 / 模型组件 |
| Ridge |
11.61414226 |
11.64459 |
11.54182 |
382 |
| Ridge 后处理 |
11.61414171 |
11.64460 |
11.54182 |
382 |
关键收获
- 简单模型拥有强大的力量,应该善用它们以获得好成绩。
- 参加 CV-LB 关系强烈的竞赛感觉很好,非常 enjoyable!
- 构建可复用代码非常有价值!我几乎完全复用了来自 Playground S5-E2 的流程,效果最佳!
- 拥有相关代码的良好 GitHub 仓库堪比黄金!
- 当人们希望快速有效地迭代特征并构建模型时,数据存储非常有价值。
- 这次我在流程中没有使用任何公共代码,因为我认为测试自己的本土模型并进行实验会很棒。我认为我的想法成功了!
参考资料
最后感言
衷心感谢 Kaggle 和我的 fellow 参与者们带来了伟大的体验,祝愿未来的旅程成功!
祝一切顺利,快乐学习,致以问候!
Ravi Ramakrishnan