562. Predict Student Performance from Game Play | predict-student-performance-from-game-play
这次比赛非常激动人心,让我们有机会练习特征工程。非常感谢团队成员 @shinomoriaoshi、@hoangnguyen719 和 @martasprg 的支持与帮助。他们始终陪伴在我身边,我们一起取得了巨大的进步。
我要感谢主办方,特别感谢 @cpmpml 和 @pdnartreb 发现数据泄露问题,使比赛重回正轨。
特别感谢 @cdeotte 提供的优秀入门笔记本和见解,在比赛的早期阶段帮助了我。
以下是每个成员的工作概述:
· 我的主要工作是改进XGBoost模型和处理特征工程。
· Minh Tri Phan开发了一个Transformer模型,CV(交叉验证)分数为0.699,公共排行榜(LB)分数为0.7。
· Hoang处理了外部数据。
· Martin负责选择最相关的特征。
在最终提交中,我们集成了XGBoost和Transformer模型,这帮助我们获得了金牌位置。我们的集成提交公共LB分数为 0.705,私有LB分数约为 0.7025。此外,我们还有两个单XGBoost模型的提交,其中一个公共LB分数为 0.705,私有LB分数为 0.700。
代码:代码有些杂乱,请见谅。如有任何疑问,请通过 LinkedIn 联系我
特征工程代码: https://www.kaggle.com/code/chaudharypriyanshu/mb-fb5-train-xgb-25-11-external-data/notebook
推理代码: https://www.kaggle.com/code/chaudharypriyanshu/inference-xgb-25-11-17/notebook
训练代码: https://www.kaggle.com/code/chaudharypriyanshu/mb-fb5-train-xgb-25-9-training/notebook
我为每个问题创建了5折XGBoost模型(总共90个模型)。我仅使用Kaggle内核训练XGBoost,因为使用Kaggle的P100 GPU训练所有90个模型只需45分钟。
单XGBoost模型公共排行榜(LB)分数达到0.705,推理耗时45-50分钟,但在私有LB上表现不佳。当加入Hoang的外部数据时,模型在私有LB上的分数提升至 0.704。然而,由于公共LB分数异常低至 0.702,我们决定不使用它。
a) 计数特征: 我基于 `Fqid, text_Fqid, room_fqid, level, and event_comb` 创建了计数特征。这些特征捕获特定事件或组合的频率。
b) 索引分箱: 我对索引进行分箱处理,箱大小约为30或50(按排序顺序)。原始索引在私有LB上表现更好,而分箱特征在公共LB上效果更好。
c) 首次和总和特征: 我为所有列生成了 elapsed_time_diff 的首次和总和特征。我发现min、max和std在我的情况下效果不佳。
d) 基于悬停持续时间的聚合。
下表列出了我们取得最佳结果的实验。
| 使用的外部数据 | CV | 公共LB | 私有LB | 最终提交 |
|---|---|---|---|---|
| 否 | 0.6996 | 0.701 | 0.698 | 否 |
| 否 | 0.7001 | 0.702 | 0.700 | 否 |
| 否 | 0.6996 | 0.701 | 0.698 | 否 |
| 是(公共ED) | 0.7015 | 0.705 | 0.700 | 是 |
| 是(Hoang的ED) | 0.7019 | 0.702 | 0.704 | 否 |
| 是(Hoang的ED) | 0.7022 | 0.703 | 0.703 | 否 |
模型如下图所示:

特别是,它包含两部分:
(i) 训练神经网络,然后提取嵌入。
(ii) 将神经网络的嵌入与一组聚合特征连接,然后训练梯度提升模型(XGBoost, CatBoost, LightGBM)。
我受到RIIID竞赛和 @letranduckinh 解决方案的启发,他自定义了多头注意力机制以适应两个动作之间的时间间隔。在我看来,如果将这个问题与NLP问题关联,RIIID竞赛类似于令牌分类任务(例如NER),而本次竞赛类似于文档分类任务。因此,我决定使用Transformer和其他一些循环网络类型。
我使用了仅编码器结构,因为我没有看到使用解码器的动机。
然而,仅Transformer编码器效果不佳,所以我决定在编码器前添加更多(3个)GRU层。详细架构(Pytorch代码)在此 (https://github.com/minhtriphan/Kaggle-competition---Predicting-Student-Performance/blob/main/Transformer/model.py)。
NUM_COLS = ['index', 'time_diff', 'room_coor_x', 'room_coor_y', 'screen_coor_x', 'screen_coor_y', 'hover_duration']
TXT_COLS = ['level', 'event_name', 'name', 'text', 'fqid', 'room_fqid', 'text_fqid']总体而言,神经网络在CV和公共LB上获得 0.695/0.700(在API危机之前,之后我不再检查神经网络在公共LB上的表现,因为它始终与XGBoost结合使用)。
然而,神经网络在我的情况下并不太令人满意。然后我决定从训练好的神经网络中提取嵌入,将其与聚合特征连接,然后使用XGBoost训练模型。这帮助我在CV和LB上都获得了巨大提升。
此方法的总体分数如下表所示:
| 使用的外部数据 | CV | 公共LB | 私有LB |
|---|---|---|---|
| 否 | 0.6993 | 0.702 | 0.697 |
| 是 | 0.6989 | 0.701 | 0.699 |
不幸的是,由于我没有观察到外部数据在CV和公共LB上的任何提升,我决定不选择该模型加入我们的模型池。
推理代码:
无外部数据: https://www.kaggle.com/code/shinomoriaoshi/psp-v7b-infer
使用外部数据: https://www.kaggle.com/code/shinomoriaoshi/psp-v9a-infer
Hoang在单独的帖子中描述了他的工作,包括外部数据的预处理、实验结果以及为什么信任CV而不是LB。
Hoang部分的链接: https://www.kaggle.com/competitions/predict-student-performance-from-game-play/discussion/420315