Yirun's Solution (1st place): Training Supervised Autoencoder with MLP
Yirun 的解决方案(第 1 名):使用 MLP 训练监督自编码器
作者:Yirun Zhang (Grandmaster) | 排名:第 1 名 | 发布时间:2021-03-08
更新:单模型 AE-MLP 在私有排行榜上得分为 6022.202,这仍然是第 1 名的成绩!
在这次比赛中,我使用了监督自编码器 MLP(Supervised Autoencoder MLP)方法,我的队友使用了 XGBoost。我们的最终提交是这两个模型的简单融合。在这里,我想详细解释一下我的方法。
监督自编码器方法最初是在 Bottleneck encoder + MLP + Keras Tuner 8601c5 中提出的,其中一个监督自编码器在交叉验证(CV)分割之前单独训练。我意识到这种训练可能会导致标签泄露,因为自编码器在每个 CV 分割中已经看到了验证集部分的数据,它可以生成标签泄露特征从而导致过拟合。因此,我的方法是在每个 CV 分割中,在一个模型中同时训练监督自编码器和 MLP。训练过程和解释在笔记本和以下陈述中给出。
交叉验证(CV)策略与特征工程:
- 5 折 31 间隔清除分组时间序列分割(5-fold 31-gap purged group time-series split)
- 删除前 85 天的训练数据,因为它们具有不同的特征方差
- 对缺失值进行前向填充
- 将所有 resp 目标(resp, resp_1, resp_2, resp_3, resp_4)转换为用于多标签分类的 action
- 使用所有 resp 目标绝对值的平均值作为训练的样本权重,以便模型可以专注于捕捉具有大绝对 resp 的样本。
- 在推理期间,取所有预测 action 的平均值作为最终概率
深度学习模型:
- 使用自编码器创建新特征,与原始特征拼接作为下游 MLP 模型的输入
- 在每个 CV 分割中一起训练自编码器和 MLP 以防止数据泄露
- 将目标信息添加到自编码器(监督学习)以强制其生成更相关的特征,并为梯度的反向传播创建捷径
- 在编码器之前添加高斯噪声层以进行数据增强并防止过拟合
- 使用 swish 激活函数代替 ReLU 以防止“神经元死亡”并平滑梯度
- MLP 中使用了批归一化和 Dropout
- 使用 3 个不同的随机种子训练模型并取平均值以减少预测方差
- 只使用在最后两个 CV 分割中训练的模型(具有不同的种子),因为它们看到了更多的数据
- 仅监控 MLP 的 BCE 损失而不是整体损失来进行早停
- 使用 Hyperopt 寻找最优超参数集