#1 解决方案:交叉验证与多样性致胜
#1 解决方案:交叉验证与多样性致胜
作者:AmbrosM (Grandmaster) | 发布时间:2023-03-14
我的最终解决方案与我在我的 EDA which makes sense 中发布的只有细微差别。它基于以下几个原则:
-
优化交叉验证(CV)分数,不要看公共排行榜! CV 分数基于 5407 个样本,而公共排行榜仅基于 721 个样本。在 Kaggle 比赛中,5407 个样本的平均值是一个测量值,而 721 个样本的平均值是一个随机变量。如果你想测试骰子的质量,最好扔八次而不是只扔一次。这条规则有几个后果:
- 你不需要超过两次提交,因为你无法从公共排行榜分数中获得任何信息。好吧,我用了七次提交,因为我很好奇。
- 不要从高分公共笔记本复制代码,除非该代码的质量体现在良好的交叉验证分数上。得分最高的公共笔记本之所以位于列表顶部,仅仅是因为它们过拟合了公共排行榜。
- 正确进行交叉验证: 对于本次比赛,普通的
KFold 就足够了。train_test_split 则不行。
-
实现一个多样化的集成!
- 每个人都使用梯度提升,但你需要找到好的超参数。Optuna 做不到。只需运行 Optuna,然后更改 KFold 的种子。你会发现 Optuna 找到的超参数无法适应种子的变化。我手动优化了 LGBM 的超参数。
- 使用不止一种梯度提升实现可以增加集成的多样性。我使用了 LightGBM 和
GradientBoostingRegressor。
- 随机森林优化起来很简单:最重要的超参数是
min_samples_leaf。
- 虽然基于树的算法不需要太多的特征工程,但线性回归需要。在 EDA 的偏依赖图显示了游戏的非线性后,我花了不少时间创建特征。重要的是不要仅仅添加特征并抱有最好的希望——在同一过程中,你必须删除那些不能提高交叉验证分数的特征。
- 记住不要针对公共排行榜优化你的集成。优化 CV 分数。
AgeInDays 只有几个不同的值,它与目标的关系是高度非线性且非单调的。我将其视为分类值并进行了目标编码,用相应的平均目标值替换特征值。这种目标编码甚至对一些树模型也有帮助。