631. UM - Game-Playing Strength of MCTS Variants | um-game-playing-strength-of-mcts-variants
大家好,我很兴奋能分享让我们获得第 10 名的解决方案,在开始之前,我想感谢我的队友 @jawadkc66 @mohammedkhurd @yuanzhezhou
我们还要感谢 @yunsuxiaozi 的公开笔记本 Mcts|starter,它帮助很大,是我们建立基线的基础。
我们从一开始就意识到额外的数据很可能会带来更好的结果,但我没有计算资源去做,而且伪标签也不起作用,可能是因为误差非常高 (>0.4),所以以这种误差率预测假数据并将其视为真实标签并不是一个好主意,所以我想到的主意是通过翻转代理顺序来增强数据集并将其翻倍,取 AdvantageP1 的补数并取 utility_agent1 的负值,如下所示:
augmented_df = train.copy()
augmented_df = augmented_df.rename(columns={
'agent1': 'agent2',
'agent2':'agent1',
# Add additional feature swaps as needed
})
augmented_df['AdvantageP1'] = 1 - augmented_df['AdvantageP1']
augmented_df['utility_agent1'] = -augmented_df['utility_agent1']
train = pd.concat([train, augmented_df], ignore_index=True)
这个简单的技巧将 MCTS|starter 笔记本的公共排行榜分数从 0.427 推到了 0.422,当时我和 @mohammedkhurd 搭档时,这让我们进入了前 20 名,我认为这是我们最好的主意。
我还注意到 advp1 是最重要的特征,但它的收集方式使其有点噪声,所以我想到将其分箱为 10 个数值,这显示了良好的改进,但我没有移除原始特征,同时拥有两者似乎能给出最佳性能,我的朋友 @jawadkc66 @mohammedkhurd 尝试了其他分箱数字,但 10 似乎能给出最佳性能。这增加了交叉验证 (CV) 分数,并将排行榜分数从 0.422 提高到 0.420。
我们的队友 @yuan 建议引入更多的折数以增加集成多样性,所以我们从 5 增加到 10,这将排行榜分数进一步推到了 0.419,这实际上很重要。
在我们使用的公开笔记本中,预测值被乘以了 1.1,这有风险且是过拟合的,但当我在训练集上可视化模型预测时,我注意到我们的 catboost 似乎总是将预测值压缩到接近零,所以将预测值乘以一个数字似乎可以减少 KL 散度,使预测 - 目标分布更接近,这里有一些可视化图表使其更清晰:
预测值 - 目标值
预测值*1.3-目标值
所以基本上将预测值乘以一个数字似乎能使分数更好,但我从未尝试过,即使可视化显示它效果很好,但我们的朋友 @yuanzhezhou 做了这件事,它将排行榜分数从 0.419 提高到了 0.417,他做了两次,一次用 1.25,一次用 1.3,我们选择了 1.25 部分,但两者给出了完全相同的公共和私人排行榜结果,这就是让我们从银牌跳到金牌的原因。
这些是我们的主要想法,除了可能的一些超参数调整外,没有什么值得一提的。
如果我想列出所有我尝试过但没起作用的技术,那需要整整一本书来记录,我的队友也一样,但这里是一些我尝试过但没起作用的:
1) 伪标签(原因很明显)
2) 创建 advp2 并进行一些交互,例如 advp1/advp2 等,可能是 GBDT 已经处理了这些交互,也许更高的交互和更多的特征工程可以让我们从中获得优势
3) 神经网络模型(我、@yuanzhezhou 和 @jawadkc66 尝试过,即使它们给出了良好的交叉验证分数,似乎对我们从来不起作用)
1) 删除某些游戏规则集:可能有一些非常噪声的游戏规则集甚至不存在于测试集中,所以尝试删除它们可能会提高排行榜分数,我很确定某些游戏规则集的数据存在一些错误,我可能会在另一个讨论中谈论它,但我没能从这一点受益
2) 更好的建模:我认为我们只是在建模上没有花费足够的时间,我们在公开笔记本上尝试了我们的技巧,但我们没有建立一个坚实的基线,我们尝试了一点,但似乎我们无法超越我们使用的公开笔记本
3) 更多的特征工程:就这么简单
谢谢大家,希望在另一场比赛中能作为竞赛专家再次见到大家 :)