返回列表

3rd place solution: Ensembles of deep (49 layer) MLPs

451. Jane Street Market Prediction | jane-street-market-prediction

开始: 2020-11-23 结束: 2021-08-23 量化投资 数据算法赛
第三名方案:深度(49层)MLP 集成

第三名方案:深度(49层)MLP 集成

作者:Martin BB  |  排名:第3名  |  发布时间:2021-03-09

在经历了许多或繁或简的初步实验后,我最终采用了几乎不做特征工程、没有交叉验证(CV),而是由15个深度MLP组成的集成模型,每个模型都包含49层。

数据

  • 移除前85天的数据
  • 包含了 weight=0 的行
  • NaN填充:基于 f0 的条件中位数(我认为这是我在整个比赛中最好的想法 :D)

模型

  • 输入块:批归一化 + 对数特征扩展(→ 130个标准特征,130个对数特征)
  • 块 0:3个全连接层,每层100个单元,批归一化,Dropout (0.35) 和 Mish 激活函数
  • 块 1-23:2个全连接层,每层100个单元,批归一化,Dropout (0.35) 和 Mish 激活函数
  • 块 0 和块 i (i=[1,..,23]) 之间的跳跃连接
  • 输出:具有5个单元的全连接层(所有5个‘resps’) - Sigmoid 激活
  • 15个此类深度模型的集成
  • 动作:所有 15x5 输出的平均值;阈值 = 0.5

训练

  • 批次大小 = 30k
  • 优化器:Adam,学习率 lr = 1e-3
  • 轮次:200
  • 损失函数:BCE(标签平滑 = 0.1)和“类效用”损失的混合

推理

模型被转换为 tf-lite 解释器。这确实加快了提交速度。否则,绝不可能评估如此多的深度模型。

验证

基本的模型形状和超参数是在我本地机器上通过简单的训练/验证分割选择的。中间我也曾使用过 GKF CV(分组K折交叉验证),但效果并不理想,所以我回到了这个非常简单的训练/验证分割(训练:85-300天,验证:350-500天)。

为了减少不同种子的影响,我将测试重新运行了多达8次。这让我对新实现的性能有了相当不错的估计。

对于最终模型,训练的轮次数是通过重新训练模型并提交来确定的。所以可以说我使用了公共 LB(排行榜)数据进行早停。由于公共集中有100万行数据,这在我看来是合理的。

集成

人们常说,只有当模型学习到不同的东西(即用不同的数据训练)时,集成才能提高性能。我认为这通常是正确的,但这里的情况略有不同。我们看到不同的公共模型对种子有极端的依赖性。我也在我的单一模型中发现了这一点。使用许多由不同种子训练的模型在某种程度上解决了这个问题。就像以火攻火,用随机性对抗随机性。

同比赛其他方案