604. The Learning Agency Lab - PII Data Detection | pii-detection-removal-from-educational-data
首先,我要感谢 Kaggle 和比赛的主办方为举办比赛所付出的努力,同时也祝贺所有在比赛中取得成功的选手!下面简要介绍一下我的解决方案,其实并不复杂。
TL;DR: 一个使用 deberta‑v3‑large 模型的集成,配合预处理与后处理。
提供的数据集已经拆分为子字符串,主要是单个单词和标点符号,但也包括不同大小的空白字符。
在分词时,我使用这些子字符串列表而不是原始文本(使用 HuggingFace 的 is_split_into_words=True 选项),并在单词由多个词元表示时取平均输出概率。需要强调的是,空白子字符串会被分词器忽略,默认预测为 O。
接下来,我把目标中的 B- 和 I- 前缀移除,只保留 7 个类别进行预测。空格和其他单词总是会把文本中相邻的 PII 项目分隔开,因此可以精确地将目标和预测转换回 BIO 格式。
我还使用了 @nbroad 生成的数据集,非常感谢他准备并分享!我把它和训练数据混合,权重设为 0.5。
最终只使用了 deberta‑v3‑large 主干网络,因为其他模型在交叉验证和公开排行榜(CV 与 LB)上表现更差。最终提交是 6 个模型的集成,在完整数据上训练,采用了略微不同的超参数:
其他技巧,例如数据增强,尽管在公开 LB 与 CV 上看似有希望,但并未对最高分的提交产生贡献。
我使用了两种后处理。
(1)NAME_STUDENT 类别后处理:一旦某个子字符串被分类为 NAME_STUDENT,文档中该子字符串的所有其他出现也会被重新标记为 NAME_STUDENT。然而,有时单个 “.” 被预测为 NAME_STUDENT,并会传播到整个文本。为解决这个问题,长度为 1 且不是首字母大写的子字符串会被重新标记为 O。
(2)“\n” 空白子字符串后处理:在整个数据集中,“\n” 只出现了两次,并且这两次都是 STREET_ADDRESS 的一部分。 据显示,PII 数据在数据中是被人为修改的,所以我的猜测是生成的地址中包含了 “\n”,而其余数据恰好没有出现。采用这种方法导致模型预测的地址序列出现缺口,因为 “\n” 没有被分词(如上所述)默认预测为 O。因此,只需强制把 “\n” 预测为 STREET_ADDRESS 即可修复每个地址的 2 个预测(“\n” 本身以及后面的 B-STREET_ADDRESS 会被转换为 I-STREET_ADDRESS)。
概率到硬预测的转换是在对 O 类概率进行缩减后通过 argmax 完成的。缩减系数在公开 LB 分数上进行了调整,但始终在 0.02‑0.03 之间。