返回列表

[1st place solution] Data Cleaning+FE+External Data+Model Ensemble

592. Linking Writing Processes to Writing Quality | linking-writing-processes-to-writing-quality

开始: 2023-10-02 结束: 2024-01-09 智能评测 数据算法赛
1st place solution - 数据清洗+特征工程+外部数据+模型融合
作者:tomoo inubushi(Kaggle MASTER级)
发布时间:2024-01-10
最后更新:2024-01-21

致后来的参赛者

我的排名原本是第2名,但由于某些原因最终确定为第1名。我认为原第1名的解决方案仍然值得一读。

感谢所有人!

我要感谢组织者和所有参与者。这是我四年来Kaggle经验中第一个个人金牌和现金奖励,我非常开心 🤩。

训练和推理代码可在此处获取。这段代码包含了许多冗余和/或不必要的部分,但我原样公开以避免额外错误。

解决方案概述

解决方案概述

数据清洗

在深度学习时代,数据清洗是DS/ML中最被低估的部分之一。由于本次比赛训练数据集非常小,我进行了数据清洗以减少训练集和测试集中的噪声。

总结来说,我进行了以下操作:

句子重建与特征工程

我在本次比赛中最先做的事情是从键盘活动重建句子。由于分数完全基于最终文本,我认为这是比赛中最重要的部分。
这个早期讨论主题@kawaiicoderuwu这个公开notebook@jasonheesanglee对我非常有帮助。
为了更好的重建,我改进了一些点:

  • 如果光标位置和文本更改信息与重建文本不匹配,则搜索最近似的模糊匹配序列
  • 如果光标位置和文本更改信息与重建文本不匹配,则修正撤销(ctrl+Z)操作

我已经尽力了,但训练日志中仍有142个事件存在意外错误。

对于特征工程,这个公开notebook@hengzheng是一个很好的起点。从其他notebook中学习(特别是这个公开notebook@awqatak令人印象深刻!),我总共使用了378个特征。

总结来说,我使用了:

  • 间隔为1的Inter Key Latency、Press Latency和Release Latency的统计量
  • 每种活动和事件的总数
  • 首次达到200、300、400和500个单词的时间
  • 暂停相关特征
  • 单词时间比、单词事件比等
  • 重建文本的统计量(例如,每句单词数、单词长度等)
  • 重建文本中标点符号错误的总数(例如,"qq qqq ,qqq"应为"qq qqq, qqq",以及"qq qqq .qqq"应为"qq qqq. Qqq")
  • 暂停和修订爆发相关特征
  • 活动、事件和分类Inter Key Latency的Tf-idf特征
  • 重建文本的单词级和字符级tf-idf特征
  • 基于单词级和字符级tf-idf特征的外部文章分数预测(稍后解释)

一旦提取了tf-idf特征,我就使用截断SVD将其维度降至64。

这是light GBM的特征重要性图(部分),尽管我在整个比赛中从未检查过它:

使用外部数据

由于训练数据集非常小,我使用了关于文章评估的外部数据。我匿名化所有文章,并使用与训练数据集相同的特征提取器提取tf-idf特征。然后,我训练light GBM模型来预测外部分数。

下图是使用commonlit-evaluate-student-summaries数据训练的模型结果:


令我惊讶的是,预测的外部分数(x轴)与本次比赛的分数(y轴)相关性很好。请注意,light GBM模型仅使用匿名化的外部文章进行训练。我使用这些预测的外部分数作为特征来提高模型的泛化能力。我尝试了transformer模型(例如deverta-v3),但它们从未优于tf-idf+light GBM模型。

我使用了由24种文章类型组成的8个数据集:

我也尝试了keystroke数据集,但没有效果。

构建多种模型并融合

同时使用树模型和神经网络模型对于提高分数很重要。我从这个公开notebook@alexryzhkov学习了light autoML。对于分类器模型,我使用了此讨论中展示的框架。

模型 CV 公开LB 私有LB
LGBRegressor 0.576 0.576995(延迟提交) 0.558459(延迟提交)
LGBClassifier 0.582 - -
XGBRegressor 0.580 - -
XGBClassifier 0.583 - -
CatBoostRegressor 0.582 - -
BaggingRegressor 0.594 - -
tabnet 0.609 - -
light autoML densenet 0.593 - -
light autoML resnet 0.587 - -
light autoML fttransformer 0.603 - -

融合:

模型 CV 公开LB 私有LB
LinearRegressor 0.572 0.579468(延迟提交) 0.557741(延迟提交)
LogisticClassifier 0.575 - -
Mean 0.573 0.578796 0.559289

对于融合,我也尝试了这个公开notebook中展示的前向融合。实际上,前向融合给了我更好的公开LB分数0.575,但CV(0.575)和私有LB分数(0.560)更差。我使用了嵌套CV(6个bags x 5折,按分数分层)进行最终提交。

后处理

我只是将预测值限制在0.5到6.0之间。四舍五入到0.5、1.0...从未奏效。

一些说明

CV-LB主题中的许多人不同,我的LB分数总是比CV分数差。正如我所示,公开LB数据集的得分分布与训练集相似,我在比赛中始终信任CV分数。

由于我决定使用外部数据(这会增加推理时间),我放弃了效率奖。我选择了三个GPU模型进行提交。在这三个模型中,获胜的是公开LB分数最差的模型(0.578)。虽然我已经尽力提高模型的泛化能力,但我必须承认我太幸运了 😅。

我从许多公开notebook和讨论中学到了很多。我列出它们如下,但可能会遗漏一些:

同比赛其他方案