562. Predict Student Performance from Game Play | predict-student-performance-from-game-play
我很高兴能够与在座的各位一起经历了这场漫长而艰苦的比赛。在此,我将概述我的解决方案。
重现我提交结果的笔记本如下:
psp-1-save-data https://www.kaggle.com/code/rsakata/psp-1-save-data psp-2-process-raw-data https://www.kaggle.com/code/rsakata/psp-2-process-raw-data psp-3-fe-and-train-lgb https://www.kaggle.com/code/rsakata/psp-3-fe-and-train-lgb psp-4-test-inference https://www.kaggle.com/code/rsakata/psp-4-test-inference将六个变量(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分数如下: