返回列表

7th Place Solution (Efficiency 1st)

562. Predict Student Performance from Game Play | predict-student-performance-from-game-play

开始: 2023-02-06 结束: 2023-06-28 学习效果预测 数据算法赛
第7名解决方案(效率第一)

第7名解决方案(效率第一)

作者:Jack (Japan) | 排名:第7名 | 发布时间:2023-06-29

我很高兴能够与在座的各位一起经历了这场漫长而艰苦的比赛。在此,我将概述我的解决方案。

概述

  • 为了对18个问题进行预测,我针对每个level_group训练了3个LightGBM模型。没有为每个问题单独构建模型的主要目的是减少推理时间。
  • 我创建的大部分特征都是基于两个连续操作之间的时间差。(后面会详细说明。)
  • 通过添加比赛主办方发布的原始数据,CV分数提高了约0.002。
  • 出乎意料的是,获得效率奖的提交在私人排行榜上取得了最佳分数。其推理时间约为3分钟。

特征工程

将六个变量(level、name、event_name、room_fqid、fqid和text)连接起来作为聚合键,对每个键计算其与前后记录的时间差之和作为特征。如果用类似pandas的代码表示:
df.groupby(['level', 'name', 'event_name', 'room_fqid', 'fqid', 'text'])['elapsed_time_diff'].sum()

除了与前后记录的时间差之外,每个键的出现次数也作为特征添加。由于这些特征可以通过按顺序读取用户的会话来计算,因此将数据处理为Python列表而不是使用Pandas可以非常高效地计算它们。

此外,将event_name为'notification_click'的记录视为重要事件,并添加两个此类事件之间的时间差作为特征。

这些特征的详细计算过程可在我的第三个发布的笔记本中查看。

建模

由于键(六个变量的组合)的种类非常多,我在训练前通过排除仅出现在少数会话中的稀有组合来减少特征。然而,由于特征数量仍然达到数千个,我首先使用较大的学习率(0.1)训练LightGBM,并基于增益特征重要性进行特征选择。然后使用500到700个特征以较小的学习率(0.02)重新训练。

在第二次建模中,加入了主办方发布的原始数据(https://fielddaylab.wisc.edu/opengamedata/)。虽然我无法完全重现主办方的train.csv文件,但通过第二个发布的笔记本,我能够大致重现它。

该数据中包含的许多会话与比赛数据性质不同,因为它们没有完成游戏直到结束。事实上,中途离开游戏的用户正确回答问题的比例往往较低。为了反映这种差异,我将每个会话的最大级别作为特征加入。

在训练最后一个level_group的模型时,我增加了第二个level_group的标签,这有助于提高准确性。我认为这样做的原因是通过使用更多数据来确定决策树节点分裂时的分割点,从而抑制了过拟合。然而,对于第一个和第二个level_group,这种数据增强方法在本地验证中没有提高准确性的效果。

我的最佳提交的CV/LB分数如下:

  • CV: 0.7034
  • Public LB: 0.703
  • Private LB: 0.703

其他说明

  • 为了评估的稳定性,使用不同的种子重复了4折交叉验证三次。
  • 根据验证结果,阈值设为0.625。未针对每个问题进行调整。
  • 为了减少推理时间,未使用在CV中训练的模型,而是使用基于全部数据重新训练的模型进行推理。
同比赛其他方案