返回列表

12th place Solution

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

开始: 2020-10-05 结束: 2021-01-07 学习效果预测 数据算法赛
第12名解决方案

第12名解决方案

作者: pocket (团队成员: sakami, owruby, lyakaap)
比赛: Riiid! Answer Correctness Prediction
排名: 12th (Private Leaderboard)

riiid-solution

首先,我要感谢主办方(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 以增加多样性,但这对我们最终分数没有影响。


LGBM 细节:

资源管理

(在生成提交特征时)
我使用 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(这全由

同比赛其他方案