比赛复盘总结-Kaggle-30 Days of ML-2-个人解决方案

516 阅读4分钟

本次比赛尝试过

  • 特征: 特征交叉,
  • 模型: 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方案是因为不同折之间的分数差距较大, 不方便进行超参数优化, 因此其中还有两个问题没能解决

  1. **ContinuousTargetStratifiedKFold比简单的KFold**在模型性能方面有多少提升, 还不能确定
  2. ContinuousTargetStratifiedKFold中分桶的数目也属于一个超参数, 此超参数对于最后模型方面有多少提升, 还不能确定

但是我想这个影响应该比较小.

具体的代码及验证可以查看30ML-Continuous Target Stratification [2]


2. 数据

曾经想过做一些特征交叉的特征工程, 但是效果不是很好, 而且由于时间问题没时间进行优化, 所以使用的是原始的特征.

对于类别类特征进行了OrdinalEncoder编码.


3. 基础模型

曾经试验过一些模型SBBTreeTabNetLightGBMDAE等. 由于没什么时间调参,所以使用初始的或者应用了一些最简单的参数, 因此效果都不怎么好. 具体的最好的单模型CV-LB如下:

ModelCVLBPB
LGBM0.7176980.718940.71713
SBBTree0.7176990.719180.71738
TabNet0.7381500.737280.73641
DAE with transformer0.7229510.725140.72311

最后比赛结果使用的基本都是XGBoost具体的参数来源于开源的NoteBook.

同时在模型训练方面采用两部走战略

  1. 正常使用参数, 数据进行训练
  2. 使用伪标签法增强对模型的训练

使用伪标签是因为我看到这篇文章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)

  1. XGB(Version 1, 0.716258 / 0.71753 / 0.71587, 0.553695 / 0.71748 / 0.71587) 参数来源于blending blending blending[5]
  2. XGB(Version 2, 0.716455 / 0.71750 / 0.71590, 0.553715 / 0.71742 / 0.71584) 参数来源于blending blending blending[5]
  3. XGB(Version 3, 0.716154 / 0.71743 / 0.71581, 0.553615 / 0.71747 / 0.71587) 参数来源于Tuning params[8]
  4. XGB(Version 4, 0.716419 / 0.71757 / 0.71609, 0.553674 / 0.71752 / 0.71606) 参数来源于KFold XGBoost - Edited with Optuna tuning[9]
  5. XGB(Version 5, 0.716577 / 0.71792 / 0.71631, 0.553906 / 0.71778 / 0.71620) 参数来源于30 days ml / XGBR and auto-eda[10]
  6. XGB(Version 8, 0.716238 / 0.71745 / 0.71583, 0.553547 / 0.71737 / 0.71578) 参数来源于XGBoost tuned hyperparams + EDA[11]
  7. XGB(Version 15, 0.716311 / 0.71741 / 0.71587) 参数来源于Target Encoding[12], 这个模型除了使用了原始特征外, 还对类别特征进行target聚合(此BaseModel只用于正常建模的融合, 因为伪标签建模可能有问题)

除了上述的BaseModel以外还有部分其他的数据加入BaseModels

  1. 使用Linear Regression对以上7个BaseModels进行预测后的输出(0.715856 / 0.71709 / 0.71550, 0.714299 / 0.71726 / 0.71570)
  2. 来自公开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


更新日志

  • 初稿: 2021年08月30日-2021年09月01日