返回列表

2nd place solution

604. The Learning Agency Lab - PII Data Detection | pii-detection-removal-from-educational-data

开始: 2024-01-17 结束: 2024-04-23 数据安全与隐私 数据算法赛
第二名解决方案

作者: dott (Grandmaster)

排名: 第2名

发布日期: 2024-04-24

竞赛: PII 检测与移除(来自教育数据)

第二名解决方案

首先,我要感谢 Kaggle 和比赛的主办方为举办比赛所付出的努力,同时也祝贺所有在比赛中取得成功的选手!下面简要介绍一下我的解决方案,其实并不复杂。

TL;DR: 一个使用 deberta‑v3‑large 模型的集成,配合预处理与后处理。

1. 预处理

提供的数据集已经拆分为子字符串,主要是单个单词和标点符号,但也包括不同大小的空白字符。

在分词时,我使用这些子字符串列表而不是原始文本(使用 HuggingFace 的 is_split_into_words=True 选项),并在单词由多个词元表示时取平均输出概率。需要强调的是,空白子字符串会被分词器忽略,默认预测为 O。

接下来,我把目标中的 B- 和 I- 前缀移除,只保留 7 个类别进行预测。空格和其他单词总是会把文本中相邻的 PII 项目分隔开,因此可以精确地将目标和预测转换回 BIO 格式。

我还使用了 @nbroad 生成的数据集,非常感谢他准备并分享!我把它和训练数据混合,权重设为 0.5。

2. 模型

最终只使用了 deberta‑v3‑large 主干网络,因为其他模型在交叉验证和公开排行榜(CV 与 LB)上表现更差。最终提交是 6 个模型的集成,在完整数据上训练,采用了略微不同的超参数:

  • 最大序列长度(max length)512、1024、2048
  • 步长(stride)32
  • 批次大小(batch size)8
  • 学习率 2e‑5,训练 4 个 epoch,使用余弦退火调度器,预热 1 个 epoch
  • AdamW 优化器

其他技巧,例如数据增强,尽管在公开 LB 与 CV 上看似有希望,但并未对最高分的提交产生贡献。

3. 后处理

我使用了两种后处理。

(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 之间。

同比赛其他方案