返回列表

8th Place Solution and Code

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

开始: 2023-02-06 结束: 2023-06-28 学习效果预测 数据算法赛
机器学习笔记:8th Place Solution and Code

机器学习笔记:8th Place Solution and Code

比赛排名: 第8名
团队成员: Priyanshu Chaudhary, MartinBarus, Minh Tri Phan, Hoang Nguyen

这次比赛非常激动人心,让我们有机会练习特征工程。非常感谢团队成员 @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,我们决定不使用它。

特征工程

  1. 会话长度: 简单记录每个级别组的总会话长度。
  2. 实例特征: 我创建了基于对象点击的特征(首次点击对象、该点击的房间坐标,我称其为实例特征),这些特征非常重要,与标准特征结合使用时提升了0.0007。由于有12个存在对象点击的实例,我总共创建了36个特征。
  3. 魔术宾果特征: 受公开笔记本启发,我为所有3个级别组创建了更多此类特征,CV提升了 0.0003
  4. 标准特征:

    a) 计数特征: 我基于 `Fqid, text_Fqid, room_fqid, level, and event_comb` 创建了计数特征。这些特征捕获特定事件或组合的频率。

    b) 索引分箱: 我对索引进行分箱处理,箱大小约为30或50(按排序顺序)。原始索引在私有LB上表现更好,而分箱特征在公共LB上效果更好。

    c) 首次和总和特征: 我为所有列生成了 elapsed_time_diff 的首次和总和特征。我发现min、max和std在我的情况下效果不佳。

    d) 基于悬停持续时间的聚合。

  5. 顶级组特征: 在不同级别组中使用前15-25个特征(根据特征重要性)、持续时间和实例特征。
  6. 元特征: 使用过去问题的预测来预测当前问题。即对于问题` t `,我使用问题` (1 to t-1) `的所有预测。使用它们带来了约 0.001 的提升。

特征选择(Martin的部分)

  1. 我基于Gain和Shapley特征重要性分数消除了零重要性的特征。
  2. 执行特征选择后,我将学习率从 0.05 调整至 0.03,并添加了更多特征。
  3. 此外,我删除了重复特征以及空值超过 95% 的特征。

外部数据

  1. 我们使用了公开可用数据,约有7500个会话,其中所有18个问题都已回答。
  2. 添加此外部数据使我们的模型在交叉验证中提升了0.0005,在排行榜上提升了0.002。
  3. Hoang还创建了处理的外部数据,在私有排行榜上表现良好(分数0.704)。如果我们包含它,我们的单XGBoost模型可能进入前5名。然而,由于公共排行榜分数较低,我们决定不使用它(一个错误的决定)。

推理

  1. 我们进行了改进以保持推理过程中序列的原始顺序。
  2. 我们发现大约有250个会话的索引异常(有趣的是,它们都来自2020年12月5日和6日)。
  3. 创建了一个函数来为99.5%的序列保留原始顺序,只有一小部分(0.5%)的事件错位不超过实际索引的4-5个位置。
  4. 重新索引这些异常会话,略微提升了排行榜上的分数。

未生效的方法

  1. 与LGBM、Catboost的集成无效。
  2. 创建了一个使用模型应有的基准真阳性和真阴性作为自定义评估指标。它使CV提升了0.001,但LB下降,可能由于过拟合。
  3. 每个问题使用不同的阈值。(CV上升,LB下降)。

下表列出了我们取得最佳结果的实验。

使用的外部数据 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

Tri的部分

模型如下图所示:

模型架构图

特别是,它包含两部分:
(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)。

关于训练的一些说明

  1. 我为3个级别组使用了3个模型。在每个级别,我使用之前级别的序列(例如,0-4级别的模型使用0-4序列,5-12级别的模型使用0-4和5-12序列,依此类推。)
  2. 我使用所有给定特征训练模型:
    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']
  3. 我认为学生在高级别(例如13-22级)的表现可能包含预测其低级(0-4级)表现的信息。我将此称为学生的"全局知识",并希望网络能够捕捉到这一点。因此,神经网络以多任务方式训练,其中主输出对应级别的问题集(例如,对于0-4级,主输出是问题1、2、3的3维向量),辅助头用于预测所有其他问题。此技巧帮助CV提升了 +0.002

总体而言,神经网络在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://github.com/minhtriphan/Kaggle-competition---Predicting-Student-Performance----part-of--8th-solution.git

推理代码:
无外部数据: https://www.kaggle.com/code/shinomoriaoshi/psp-v7b-infer
使用外部数据: https://www.kaggle.com/code/shinomoriaoshi/psp-v9a-infer

Hoang的部分

Hoang在单独的帖子中描述了他的工作,包括外部数据的预处理、实验结果以及为什么信任CV而不是LB。
Hoang部分的链接: https://www.kaggle.com/competitions/predict-student-performance-from-game-play/discussion/420315

同比赛其他方案