649. Playground Series - Season 5, Episode 4 | playground-series-s5e4
感谢这场有趣且精彩的比赛——数据集足够大以进行有意义的交叉验证(CV),但又足够小,可以在标准本地硬件上舒适地工作。祝贺 @cdeotte 再次取得 exceptional 的表现,以及 @greysky 仅用单个(!!!)LGBM 模型就取得了令人印象深刻的第二名!
我的方法主要依赖于目标编码(Target Encoding)以及一个具有多样化特征和超参数的大型模型集成。
在比赛的大部分时间里,我使用通过 Nelder-Mead 或爬山算法(Hill Climbing)进行的加权平均。作为最后一分钟的实验,我尝试了堆叠(Stacking)——这在 Kaggle 比赛中从未对我起作用过——但仅在第一次也是唯一一次尝试中,我就立即获得了 CV 从 11.66 到 11.62 的提升。我应该更早地探索和优化它。我怀疑堆叠在这里效果更好是因为单个最重要特征中存在高比例的缺失值。
最后,我将我的堆叠集成(80%)与我得分最高的爬山算法集成(20%)进行了混合,有效地将其转变为一种三层方法。
所有模型均使用 5 折交叉验证(简单 KFold)进行训练。我认为使用 7 折或 10 折可能会略微提高分数,但运行时间的权衡对我来说似乎不值得。
我用 Optuna 做了一些快速的超参数调优,但有趣的是,最终的集成受益于包含一些较旧的、未优化的模型。多样性似乎在这场比赛中效果特别好。
第一层:
第二层:
第三层:
有趣的是,HistGradientBoostingRegressor 在爬山算法中始终获得负权重(-0.08 到 -0.21),但从未被丢弃。有人能解释这是为什么吗?其他模型(线性模型)在爬山算法中被拒绝了。
| 模型 | CV 分数 |
|---|---|
| LGBM | 11.79 |
| XGB | 11.81 |
| CatBoost | 11.93 |
| ExtraTrees | 11.96 |
| HistGB | 11.99 |
| RandomForest | 12.05 |
对于特征选择(这次主要是目标编码),我使用了一个非常贪婪的序列特征选择(Sequential Feature Selection)变体,使用具有高 learning_rate 和低 n_estimators 的 LGBM:在对所有候选特征评分后,我选择了得分最高的约 10-20 个特征并重新开始——远非最优,但我的本地硬件不允许更复杂的选择。之后我尝试了一些递归特征消除(Recursive Feature Elimination),但这 simply 耗时太长且没有产生好的结果。不过,我确实移除了与其他特征具有极高相关性的特征。
更新:添加了关于 TE、原始数据集和特征选择的一些细节。