返回列表

15 Public, 30 Private - Solution Writeup (Public 0.417 Private 0.427)

631. UM - Game-Playing Strength of MCTS Variants | um-game-playing-strength-of-mcts-variants

开始: 2024-09-05 结束: 2024-12-02 游戏AI 数据算法赛
15 公共榜,30 私有榜 - 解决方案总结 (公共榜 0.417 私有榜 0.427)

15 公共榜,30 私有榜 - 解决方案总结 (公共榜 0.417 私有榜 0.427)

作者: Geremie Yeo
发布日期: 2024-12-03
竞赛排名: 30
团队成员: Geremie Yeo, stefanoclss, Kelvin (xyzdivergence)

首先,我要感谢 @stefanoclss@xyzdivergence 组队合作!
更多内容待补充

数据集 (Dataset)

  • 丢弃了所有 Ludus_Coriovalli 游戏数据
  • 未生成外部数据
  • 进行了数据增强:即通过交换 agent1, agent2, AdvantageP1 和 utility_agent1 使行数翻倍 (交叉验证 CV: +0.005, leaderboard LB: -0.006)

交叉验证 (Cross Validation)

按 GameRulesetName 的首字母进行 StratifiedGroupKFold 分组(例如 Zuz_Mel_7x7 -> Z),重复 3 次。我注意到相似的游戏在 GameRulesetName 中往往具有相同的首字母,因此使用这种方法来减少 CV 中的潜在数据泄露,因为测试数据集可能存在分布偏移。

预处理 (Preprocessing)

在训练前转换了目标变量(以“修正”异常的目标分布)(LB: -0.001)

df["utility_agent1"] = df["utility_agent1"] - (- 1 + 2 * df["AdvantageP1"])

转换前:

目标分布转换前

转换后:

目标分布转换后

对代理特定特征进行独热编码 (LB: -0.000 但速度提升约 70%)

onehot_cols = [
    ['selection1', ['ProgressiveHistory', 'UCB1', 'UCB1GRAVE', 'UCB1Tuned']], 
    ['selection2', ['ProgressiveHistory', 'UCB1GRAVE', 'UCB1', 'UCB1Tuned']], 
    ['exploration_const1', ['0.1', '0.6', '1.41421356237']], 
    ['exploration_const2', ['0.6', '0.1', '1.41421356237']], 
    ['playout1', ['MAST', 'NST', 'Random200']], 
    ['playout2', ['Random200', 'NST', 'MAST']], 
    ['score_bounds1', [True, False]], 
    ['score_bounds2', [True, False]],
]

created_feats = 0
for col, unique in onehot_cols:
    for u in unique:
        df[f'{col}_{u}'] = (df[col] == u).astype(np.int8)
        created_feats += 1

特征工程与选择 (Feature Engineering and Selection)

我们非常节制地使用它们,因为初步实验表明,通过特征工程 (FE) 和特征选择 (FS) 很容易过拟合 CV。

  • 特征工程:添加了 17 个来自 这个公开 Notebook 的特征 (LB: -0.002)
  • 特征选择:在所有交叉验证折叠上进行了 CatBoost RFE,我们选择了在 LB 上表现最好的特征集,而不考虑 CV (LB: -0.002)

使用的模型 (Models used)

  • 主要是 CatBoost
  • 使用了 LightGBM,但如果从特征集中删除 GameRulesetName,我们没有获得令人满意的性能
  • DeepTables 神经网络

后处理 (Postprocessing)

我们尝试了两种后处理方法,两者的改进相似

  1. 将所有预测值乘以 1.15
  2. 训练两个分位数损失模型,一个针对 -1 方向 (alpha=0.2),另一个针对 +1 方向 (alpha=0.8)。初始负预测与 alpha=0.2 模型集成,而初始正预测与 alpha=0.8 模型集成,初始预测权重为 0.8,分位数损失预测权重为 0.2。

CV 和 LB 的改进约为 0.004-0.005

集成 (Ensembling)

基于 CV 分数进行爬山法集成(包括增强和未增强的模型)。如果我们基于 LB 分数来做,我们可能有机会获得金牌 😔,但我们相信 CV 是稳健的且不存在数据泄露。

反思 (Reflection)

我们可以做得更好的地方 (What we could have done better)

  • 如果 CV 和 LB 接近,这可能是一个绿色信号(相比于只优化最佳 CV)
  • 两阶段 stacking
  • 更彻底地分析数据,从一开始就找到更好的 CV 分割方法,而不是在整个第一个月都坚持使用 GroupKFold
  • 我在比赛的前半部分有点过于依赖 CV,如果某些想法在 CV 上不起作用,我就没有提交。我在 10 月初就开始尝试这种增强,但由于 CV 分数显著变差而没有提交(我们几乎放弃了这个想法)。直到最后我们想不出其他主意时,@stefanoclss 决定我们应该提交带有该增强的模型以检查 LB,令我们惊讶的是,它获得了 0.419

失败的想法 (Failed Ideas)

  • TFIDF(在训练集和测试集上)
  • 伪标签 (Pseudo-labelling)
  • 其他目标转换
  • 大多数特征工程想法
  • 使用公开 Notebook。事实上,我们在设计此解决方案时很少参考公开 Notebook。
  • 针对 GameRulesetName 的 RandomOverSampler
  • 在特征工程和特征选择上花费了太多时间
同比赛其他方案