本次比赛尝试过
- 特征: 特征交叉,
- 模型: LightGBM, TabNet, DAE等方案, 最后由运算资源不足, 放弃调参
最后采用了使用公开的数据进行模型融合
- Public Leaderboard:3/7573, 0.71695
- Private Leaderboard:2/7573(Top 1%), 0.71539
1. CV方案
本次比赛属于表格赛, 数据非常简单, 使用最为传统的KFold就可以完成CV方案, 而且大部分公开的内核也是这样的.
但是本次比赛的target的分布非常奇怪, 具有很多突变的尖峰, 因此参考Continuous Target Stratification[1]这个NoteBook对连续目标进行了StratifiedKFold. 其原理是将连续特征进行分桶之后在进行StratifiedKFold.
使用此方案后, 交叉验证的分数的STD相对较小, 相对来说比简单的KFold好一点.
Target分布
当时使用这个CV方案是因为不同折之间的分数差距较大, 不方便进行超参数优化, 因此其中还有两个问题没能解决
- **
ContinuousTargetStratifiedKFold比简单的KFold**在模型性能方面有多少提升, 还不能确定 ContinuousTargetStratifiedKFold中分桶的数目也属于一个超参数, 此超参数对于最后模型方面有多少提升, 还不能确定
但是我想这个影响应该比较小.
具体的代码及验证可以查看30ML-Continuous Target Stratification [2]
2. 数据
曾经想过做一些特征交叉的特征工程, 但是效果不是很好, 而且由于时间问题没时间进行优化, 所以使用的是原始的特征.
对于类别类特征进行了OrdinalEncoder编码.
3. 基础模型
曾经试验过一些模型SBBTree, TabNet, LightGBM, DAE等. 由于没什么时间调参,所以使用初始的或者应用了一些最简单的参数, 因此效果都不怎么好. 具体的最好的单模型CV-LB如下:
| Model | CV | LB | PB |
|---|---|---|---|
| LGBM | 0.717698 | 0.71894 | 0.71713 |
| SBBTree | 0.717699 | 0.71918 | 0.71738 |
| TabNet | 0.738150 | 0.73728 | 0.73641 |
| DAE with transformer | 0.722951 | 0.72514 | 0.72311 |
最后比赛结果使用的基本都是XGBoost具体的参数来源于开源的NoteBook.
同时在模型训练方面采用两部走战略
- 正常使用参数, 数据进行训练
- 使用伪标签法增强对模型的训练
使用伪标签是因为我看到这篇文章lightgbm[3] 使用伪标签法对模型性能有较好的提升, 所以使用伪标签法.
在训练模型时要分别输出训练集的预测值和测试集的预测值, 方便后续对基础模型的融合[4][5]
4. 模型融合
基础模型融合框架, 箭头代表着预测值的流动
此框架参考于competition part 6: stacking[6], 在其基础上进行修改. 在Level 1层上去掉了GBDT模型, 因为其训练速度较慢, 同时增加了CatBoost, LGBM和一组新参数的XGB[7].
由于没有对Level 1的参数进行优化调整, 只是确保其五个模型的CV分数相近. 因此在Level 2层时不仅输入了Level 1的输出而且还输入了Base Models的数据.
同时发现如果将Level 2的输出重新输入到 Level 2中部分情况下模型性能仍会得到提升.
其中Base Models的参数来源于公开的内核, 使用此参数在上述的CV方案下进行重新训练, 保存数据, 具体的Base Model的训练模型可以从30ML-Base Model处找到(Version, Normal CV/LB/PB, 伪标签 CV/LB/PB)
- XGB(Version 1, 0.716258 / 0.71753 / 0.71587, 0.553695 / 0.71748 / 0.71587) 参数来源于
blending blending blending[5] - XGB(Version 2, 0.716455 / 0.71750 / 0.71590, 0.553715 / 0.71742 / 0.71584) 参数来源于
blending blending blending[5] - XGB(Version 3, 0.716154 / 0.71743 / 0.71581, 0.553615 / 0.71747 / 0.71587) 参数来源于
Tuning params[8] - XGB(Version 4, 0.716419 / 0.71757 / 0.71609, 0.553674 / 0.71752 / 0.71606) 参数来源于
KFold XGBoost - Edited with Optuna tuning[9] - XGB(Version 5, 0.716577 / 0.71792 / 0.71631, 0.553906 / 0.71778 / 0.71620) 参数来源于
30 days ml / XGBR and auto-eda[10] - XGB(Version 8, 0.716238 / 0.71745 / 0.71583, 0.553547 / 0.71737 / 0.71578) 参数来源于
XGBoost tuned hyperparams + EDA[11] - XGB(Version 15, 0.716311 / 0.71741 / 0.71587) 参数来源于
Target Encoding[12], 这个模型除了使用了原始特征外, 还对类别特征进行target聚合(此BaseModel只用于正常建模的融合, 因为伪标签建模可能有问题)
除了上述的BaseModel以外还有部分其他的数据加入BaseModels
- 使用Linear Regression对以上7个BaseModels进行预测后的输出(0.715856 / 0.71709 / 0.71550, 0.714299 / 0.71726 / 0.71570)
- 来自公开NoteBook[6]中的两个输出, 这两个输出是用的五个基础模型进行堆叠生成的, 由于此数据的缘故, 所以这个模型只用于正常建模
将以上7(6)+2(1)个BaseModels进行以上模型融合框架, 得到CV/LB/PB
- 正常建模: 0.715626(0.001116) / 0.71700 / 0.71541
- 伪标签法: 0.713892(0.001154) / 0.71695 / 0.71539
从结果上来看, 使用伪标签对模型有提升, 但是效果不大, 或许这种效果可以通过优化stacking中的参数得到
最后我尝试把正常建模和伪标签法的模型融合起来, 但是失败了.
NoteBook
- CV: 30ML-Continuous Target Stratification
- BaseModel: 30ML-Base Model
更新日志
- 初稿: 2021年08月30日-2021年09月01日