592. Linking Writing Processes to Writing Quality | linking-writing-processes-to-writing-quality
我的排名原本是第2名,但由于某些原因最终确定为第1名。我认为原第1名的解决方案仍然值得一读。
我要感谢组织者和所有参与者。这是我四年来Kaggle经验中第一个个人金牌和现金奖励,我非常开心 🤩。
训练和推理代码可在此处获取。这段代码包含了许多冗余和/或不必要的部分,但我原样公开以避免额外错误。

在深度学习时代,数据清洗是DS/ML中最被低估的部分之一。由于本次比赛训练数据集非常小,我进行了数据清洗以减少训练集和测试集中的噪声。
总结来说,我进行了以下操作:
我在本次比赛中最先做的事情是从键盘活动重建句子。由于分数完全基于最终文本,我认为这是比赛中最重要的部分。
这个早期讨论主题由@kawaiicoderuwu和这个公开notebook由@jasonheesanglee对我非常有帮助。
为了更好的重建,我改进了一些点:
我已经尽力了,但训练日志中仍有142个事件存在意外错误。
对于特征工程,这个公开notebook由@hengzheng是一个很好的起点。从其他notebook中学习(特别是这个公开notebook由@awqatak令人印象深刻!),我总共使用了378个特征。
总结来说,我使用了:
一旦提取了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和讨论中学到了很多。我列出它们如下,但可能会遗漏一些: