416. Riiid Answer Correctness Prediction | riiid-test-answer-prediction

首先,我要感谢主办方(Kaggle 和 Riiid)举办这次比赛。
这在很多方面都是一场极具挑战性的比赛,真正考验了我的极限。
这场比赛也非常干净(尽管出现了与此比赛无关的 Private LB bug)。非常干净且合乎逻辑的训练/测试分割和相关性是这场比赛的闪光点。
对于我们的单模,NN(神经网络)得分约为 0.806-810(Private LB),LGBM 为 0.804。
我们将这些单模通过 NN 和 LGBM 进行堆叠,达到了 0.816 的分数。
我怀疑我们的单模在分数上表现平平,是堆叠让我们进入了金牌区。
关于我们在 Private LB 上下降 5 名的情况,我们多少有些预料。我们知道我们的一个模型(SAINT)因为 Private Score 泄露问题导致分数不佳,但我们没能完全修复它。即使在比赛结束后,我们仍然不知道为什么该模型在 Private LB 上表现糟糕。
我们在比赛的大部分时间里都使用了 tito-split。
我们大多经历了良好的 Valid-LB 相关性,我相信其他人也是如此。单模使用了 95M/5M 的分割,堆叠模型使用了这 5M 数据进行训练/验证。
我们在最终提交时也尝试了 user-split 以增加多样性,但这对我们最终分数没有影响。
(在生成提交特征时)
我使用 h5py 处理内存消耗大的特征,如(用户 x 内容特征,用户 x 标签特征)。
h5py 文件使用 user_id 作为键,在预测过程中遇到新用户时读取整个用户特征。
这在内存和运行时间之间创造了良好的平衡。由于测试集中的唯一用户不多(与训练集相比),文件 I/O 的时间并不多,从而节省了大量内存。
所有其他特征在开始时都被 pickle 并加载到内存中。
问题特征:
这些是由完整的训练集(100M)生成的。
显然这是有泄露的,但由于每个问题的计数都 >1000,这种泄露是可以容忍的。
特征示例:问题平均正确率,回答错误用户的平均用户评分。
用户特征:
用户有多强,特别是与部分、标签、内容相关的。
特征示例:用户 x 内容平均正确率。
时间戳特征:
这对我来说有点意外。不仅 t 和 t-1 的时间戳差值是好特征,t-1 和 t-2 直到 t-9 和 t-10 的差值也改进了我的模型。
特征示例:用户距离上次讲座的时间戳差值。
评分特征:
来自这个 notebook 的 Elo 特征(非常感谢)。Trueskill 并没有改进我的模型。
仅有平均正确率,模型无法判断用户是在挑战难题还是简单题,因此对问题和用户进行评分非常有意义。
SVD 特征:
LGBM 在表达类别列方面较差(相比 NN)。所以我提取了 NN 的问题嵌入层,并使用 20 维的 SVD 作为特征。
我的模型使用了大约 70-80 个特征。
由于我们要堆叠很多模型,我不想在 LGBM 上花费太多资源(运行时间、内存),所以我挑选了影响很大的特征,让我的模型对堆叠模型有所贡献。有很多特征对我的模型改进不大,它们都被丢弃了。
我没怎么改动这个,但将 num-leaf 从 127 增加到 1023 让我的分数提高了 0.003,这真是个惊喜。这发生在我添加了大量时间戳特征之后,所以时间戳中可能存在非常复杂的相互作用。
我使用了 GCP,64核CPU,416GB内存。即使使用这台怪兽级机器,在生成完整特征时我也经常内存不足(我通过分块处理避免了这个问题)。
我相信这台实例在整个比赛期间花费了我大约 $1000(这全由