返回列表

9th place solution

453. MLB Player Digital Engagement Forecasting | mlb-player-digital-engagement-forecasting

开始: 2021-06-10 结束: 2021-09-09 体育商业 数据算法赛
第9名解决方案

第9名解决方案

作者: Mark Tenenholtz
发布时间: 2021-08-02

这真是一场极其激烈的比赛。鉴于数据的广度,任何时候都不乏新的尝试。为此,我要感谢 MLB 和 Kaggle。

高层策略

滞后特征对于本次比赛的重要性已经不是什么秘密了。我也发现了这一点,有一段时间我的解决方案严重依赖滞后的目标变量。我怀疑大多数高分提交也是如此。然而,对于真实数据与推理期间之间的间隔会有多大,存在很多不确定性。我曾考虑过进行一些增强以提高鲁棒性,比如随机丢弃最近 n 天的目标滞后值,但这直接破坏了我的模型性能。所以,我最终放弃了这个策略。虽然我的解决方案中确实包含了一些目标特征聚合,但就滞后特征而言,我的最终提交仅依赖于已知特征的滞后,比如比赛数据、积分榜和比赛特征。

使用的模型

我尝试了很多不同的模型,但都没有奏效。这里是一个快速总结:

完全无效的:

  • 去噪自编码器

效果尚可,但不够好的:

  • LightGBM, CatBoost
  • 一维 CNN (来自 MoA 比赛)
  • 基于滞后目标的时间序列模型 (GRU, Transformer, DeepAR, Temporal Fusion Transformer)

我的最终提交是一个 GRU 和一个 Transformer 的集成,它们依赖于非目标滞后特征。GRU 是我最好的模型,单独得分约 ~1.25。Transformer 单独得分约 ~1.27,但在集成中证明非常有用。

验证

我做了一个简单的时间序列分割。在训练数据更新之前,我使用了 2020 年的 7 月和 8 月,以及 2021 年的 4 月。在更新数据发布后,我使用了 2020 年 8 月以及 2021 年 6 月和 7 月。

使用的特征

下面是我使用的所有类型特征的列表。所有滞后特征回溯 2 周。

  • 上个月每个目标的均值/中位数/标准差/最小值/最大值
  • playerId, teamId, 球员位置和球员状态的嵌入
  • 球员比赛数据滞后
    • 'gamesPlayedBatting', 'hits', 'doubles', 'triples', 'runsScored', 'homeRuns', 'hitByPitch', 'totalBases', 'rbi', 'stolenBases', 'assists', 'gamesPlayedPitching', 'completeGamesPitching', 'shutoutsPitching', 'earnedRuns', 'winsPitching', 'strikeOutsPitching', 'hitsPitching', 'saveOpportunities', 'saves', 'holds', 'inningsPitched'
  • 滞后比赛特征
    • 'gameTimeUTC', 'wasSigned', 'wasTraded', 'teamWins', 'teamLosses', 'teamScore', 'isHome', 'teamWon', 'scoreDiff'
    • 比赛时间特征仅包含比赛进行的小时。这里的想法是,比如下午 1 点的比赛产生的很多数字参与度会体现在比赛当天,而晚间比赛的参与度则会全部发生在第二天。
  • 滞后积分榜特征
    • 'wins', 'losses', 'pct', 'xWinLossPct', 'divisionRank', 'lastTenWins', 'lastTenLosses'
  • 滞后累积特征(按赛季汇总的所有比赛数据特征)
  • 滞后交易特征,这只是一个标志,指示球员在特定日期是否被交易或释放。
  • 球员关注者,球队关注者

我尝试利用数据的缩放特征,比如找出球员目标特征之间的最小增量,并将他们的目标特征重新缩放为非缩放的“实际”特征,但这对我的模型并没有真正的帮助。我对此感到非常惊讶。

最终提交

我注意到包含尽可能多的数据有巨大帮助,所以我知道我想让我的最终解决方案中至少有一个是在 100% 可用数据上训练的模型。然而,我的 Transformer 和 GRU 的训练曲线都相当颠簸。因此,在 100% 数据上进行盲训练时,我从第 1500 步开始每 200 个轮次保存一次检查点。我还跨多个随机种子进行了集成。

为了保险起见,我的第二次提交使用的模型将最后 30 天的可用数据作为验证数据。这实际上只是一种对冲手段,但我很想知道它的表现如何。

其他说明

  • 所有模型均使用 PyTorch Lightning 在 PyTorch 中训练
同比赛其他方案