#3 私有8公开方法 - 带探测的简单集成
作者:Ravi Ramakrishnan
竞赛排名:第三名
发布时间:2023-11-14
大家好,
首先,祝大家排灯节快乐!愿这光明节为所有人带来欢乐、健康和成功!我衷心感谢Kaggle举办了这次有趣的竞赛。这确实是一次收获满满的经历,我们学到的许多知识和经验同样适用于Kaggle之外的领域。我也想感谢其他参赛者的慷慨贡献,特别提及以下用户:
- @cv13j0 -- 他的伪标签笔记本非常出色,在竞赛初期为这项任务提供了略有不同的视角
- @arunklenin -- 他的笔记本是本次竞赛中最全面的工作之一,特别是他的EDA和特征工程部分
- @oscarm524 -- 他的笔记本在竞赛开始时提供了很好的参考
- @paddykb -- 我感谢他对任务的持续且有价值的贡献,尤其是他的LightGBM流程
特征工程
- 我最初从我关于次要特征的帖子开始,但发现在合成数据集上不使用它们是更好的选择
- 我使用了与@arunklenin的笔记本非常相似的特征暴力生成方法。我的方法与其相似,但我倾向于将特征限制在80-120个之间。我使用排列重要性来消除特征。这需要很长的执行时间,因此内核时间管理是关键。我使用本地PC来完成这项任务
- 我采用了基于目标类别的10x1分层K折CV策略。我也尝试过10x3重复分层K折策略,但并未给竞赛带来额外优势,因此我 revert 到10x1分层K折并取得了良好效果
- 我仅对模型使用了竞赛合成数据和原始数据。使用其他辅助数据在竞赛初期并未带来好处,因此我决定仅使用这些数据
模型开发
我在管道中使用了多种模型,包括:
- Catboost - 我使用了3个参数各异的模型
- LightGBM - 我使用了5个参数各异的LGBM模型
- XGBoost - 我使用了3个参数不同的模型
- 随机森林
- 逻辑回归
- TabNet分类器 -- 不使用它时我的工作几乎同样出色,因此它只给了我微小的优势
- 多层感知机 -- 神经网络略微改善了我的集成效果
- 广义可加模型
集成方法
我使用以下集成策略将上述单个模型进行组合:
- 爬山算法
- Optuna
- 堆叠
我使用后集成CV分数与其和排行榜的关系来评估集成效果。我发现我的Optuna框架与排行榜相关性良好,能够基于探测微调权重,因此决定采用这种方法。
我的最终提交包含了Optuna集成和探测。我基于排行榜分数手动修改了一些模型在折叠中的权重。我发现这种方法对CV分数影响很小,但或许对我有效。我的最终提交包括一个经过探测的Optuna调优集成和另一个不带探测的版本。两者效果都很好,但带探测的版本略胜一筹,为我赢得了第三名。
不奏效的方法
- 使用超过130-140个特征 -- 我尝试过,但CV分数没有提升,也没有改善排行榜分数,这印证了修剪低重要性特征的必要性
- 神经网络和TabNet -- 它们在最终集成中的权重很小。或许完全不使用它们也不会对整体模型框架产生很大影响
- 盲目探测 -- 我根据一些公开方法尝试过,但考虑到我在playground系列的过往经验没有采用。顶级公开工作的盲目集成很少能泛化,因此探测需要谨慎进行
我的收获
- 信赖CV分数
- 在良好且合适的CV策略上评估模型
- 没有必要时不要过度复杂化 - 简单模型具有强大的能力
- 模型参数调优比特征工程次要得多
- 谨慎探测 - 人们可能会抵制使用对CV没有积极影响的权重来探测公共排行榜的诱惑
此致,祝学习愉快!