单位 2 / 11

数据管道:收集、清理、标记和版本控制

收益:

  • 能够设置数据管道(收集、验证、清理、转换、拆分、版本控制)并将模式验证放置在管道的开头
  • 能够根据字段含义和划分做出缺失值和标签决策,以防止数据泄漏(组和时间)
  • 能够通过修复数据版本和随机种子来创建可重现的数据库

每个机器学习系统的真正力量在于数据,而不是模型。经验丰富的工程师知道:“垃圾输入,垃圾输出”——即使是最先进的模型输入错误的数据也会产生错误的结果。在本单元中,我们建立端到端的数据管道(数据管道:使原始数据为模型训练做好准备的步骤链),并了解在这条线的哪一步我们可以安全地使用人工智能。

数据线的步骤

数据线通常经过这些站点:

  1. 收集(摄取):从源(数据库、API、日志文件、事件流)提取数据。
  2. 验证:检查数据是否符合预期的架构、类型和范围。
  3. 清理:处理缺失值、重复记录、异常值和不一致。
  4. 转换:将原始数据转换为属性,例如将分类变量转换为数字,从日期生成“星期几”。
  5. 拆分:分为训练集、验证集和测试集。
  6. 版本控制:记录使用哪些数据训练哪个模型。

人工智能通过生成代码草稿和想法来节省时间,尤其是在步骤 2、3 和 4 中。但是,诸如丢弃哪些记录、填充哪些缺失值以及如何填充等决策,则属于了解数据的工程师;因为不正确的清洁可能会给模型注入隐藏的偏差。

数据验证:及早防御防线

最昂贵的错误不是在生产中开始的,而是在跳过验证步骤的地方开始的。模式验证会自动检查每批传入的数据是否符合预期的结构。例如,年龄列是否在 0-120 之间、电子邮件字段是否为空、列数是否已更改?

提示:将验证放在行的开头。越早发现损坏的数据,修复的成本就越低。在生产中发现的模式错误比在训练阶段发现的模式错误要昂贵许多倍。

使用 pandera(或远大期望)为以下数据模式编写验证方案。列和规则:- user_id:整数,不能为空,唯一 - 年龄:整数,不能为 0-120 - 注册日期:日期,不能为未来 - 国家/地区:分类,来自集合 {TR、DE、US、UK} - 余额:小数,不能为负 对于每个规则违规,生成有意义的错误消息。在代码末尾使用示例断线显示测试。

清洁:由人决定

缺失值是每个数据集都存在的事实。处理方法:

  • 删除:丢弃丢失率非常高的行/列。但存在信息丢失和偏见的风险。
  • 插补:使用平均值、中位数、最常见值或基于模型的预测进行插补。
  • 标志:将“丢失”信息存储在单独的标志列中 - 有时丢失本身就是信号。

哪一个是正确的取决于问题。在医疗数据集中,“未测量血值”的信息应该保留而不是删除;因为即使是医生拒绝测量也是一个信号。 AI可以给你选择和代码;您可以选择适合该领域实际情况的一个。

弱提示/强提示

弱提示:“填写缺失值。”

强烈提示:“以下列中存在缺失值:收入(缺失 12%,右偏分布)、last_login(缺失 30%)。建议用中位数填充收入,但解释为什么用中位数而不是均值。对于 last_login,假设缺失值可能很重要(用户可能从未登录过);考虑生成 never_logged_in 标志而不是删除。写下任一方法都会添加到模型中的偏差。”

区别:强烈提示给出分布信息和区域含义;人工智能提供决策支持,而不是机械填充。

标签:质量是衡量的

在监督学习(给出示例并给出正确答案的学习)中,模型学习的是标签(标签:每个示例的正确答案)。标签质量设定了上限——如果人们的标签不一致,模型的学习就会不一致。

注释者间一致性衡量不同人对同一样本给予相同标签的比率;它用 Cohen's Kappa 等系数来表示。依从性低表明任务不明确或指示薄弱。

人工智能以两种方式帮助标记:(1)起草注释指南,(2)预先标记并让人类仅纠正它。但使用 LLM 进行预标记有一个陷阱:模型的系统误差可能会泄漏到整个标签集中。这就是为什么人们总是检查一些 LLM 标签。

注意:不要将 LLM 制作的标签视为“基本事实”。与人类一起检查样本并测量法学硕士与人类的契合度。如果合规性较低,预先贴标签弊大于利。

数据分区:防止泄露

将数据拆分为训练/验证/测试时最危险的错误是数据泄漏:将测试信息混合到训练中。示例:

  • 同一用户的记录同时属于训练和测试(组泄漏)。
  • 在时间序列中使用未来进行训练,使用过去进行测试(时间泄漏)。
  • 从所有数据计算缩放(归一化)参数,然后除法。

时间分割对于涉及时间的问题至关重要:用过去进行训练,在未来进行测试。随机分割带来了生产中永远不会发生的“未来”好处,并夸大了指标。

数据版本控制和再现性

“我们用什么数据训练这个模型?”能够在几个月后回答问题是严肃的机器学习工程的标志。数据版本控制使用 ID(哈希或版本标签)存储每个数据快照。 DVC(Data Version Control)等工具版本数据如代码。

要重现模型的结果,必须修复三件事:数据版本、代码版本和随机种子。如果没有这三个人,就不可能说“我得到了相同的结果”。我们将在第 11 单元深化再现性;但修复数据管道中的种子从这里开始。

三个迷你箱子

情况 1 - 模式验证保存的日期。当一个团队将上游系统价格字段从便士转换为里拉时,所有价格都下降了 100 倍。架构验证因“价格超出范围”而拒绝该批次,并且模型未使用损坏的数据进行训练。如果没有验证,错误只会在生产中被发现,并且预测不正确。

案例 2 - 错误填充的偏差。在信用模型中,缺失的收入值由平均值填充。但收入缺失主要集中在低收入群体;平均人为地“丰富”了这一群体,而该模型为他们提供了不公平的高限制。修复了中位数+缺失标志的问题。

案例 3 - 颞叶渗漏。需求预测模型在测试集上看起来很棒(准确度为 95%),但在生产中却崩溃了。原因:由于随机分裂,模型看到了未来。切换到时间分箱后,测试准确度下降至 78%,但这就是真实的性能,并使其能够在生产中使用。

可复制模板

将以下数据集分成三组:training/validation/testing。Constraint:这是一个时间序列;使用临时分裂(过去训练,未来测试)。防止批量泄漏:仅在一个集群中具有相同的“customer_id”。仅从训练集中计算缩放参数,然后应用于所有参数。打印每一步代码中还剩下多少行,并添加一个断言来检查是否存在泄漏。

为此标记任务编写注释指南草案。任务:[例如将客户评论标记为正面/负面/中立]澄清边界情况:讽刺、混合情绪、如何标记与产品无关的评论?给出 5 个示例和 3 个困难的边缘情况,以提高标记者之间的一致性。

为此数据管道生成可重复性检查表:- 应如何修复数据版本?- 应在何处设置哪些随机种子?- 应记录哪些元数据(数据哈希、行计数、日期)?我的代码库:[语言/库]

检查此清理代码是否存在数据泄漏。具体看一下:缩放/编码参数是在分割之前计算的吗?是否有根据所有数据或仅根据训练计算出的统计数据?代码:[代码]

决策表:缺失值策略

状态

推荐方法

为什么

数值,偏态分布

用中位数填充

平均值受到异常值的影响

数字,对称

用平均值填充

保护信息

缺陷可能很严重

标志栏+填充

缺乏是一个信号

漏检率 > 60%

评估/丢弃列

噪音太大

分类的

“未知”类别

不创造虚假多数

常见错误

  • 跳过验证。如果没有架构控制,损坏的数据就会悄悄潜入。
  • 分割前缩放。它将测试统计数据泄露到教育领域。
  • 在时间序列中使用随机分割。它会产生虚假的高指标。
  • 盲目相信LLM标签。系统误差遍布整个数据。
  • 不保存数据版本。您无法重现结果。
  • 机械灌装平均。它忽略了字段含义,增加了偏见。

综上所述

数据管道是机器学习系统的基础,值得比模型付出更多的努力。将验证放在顶部;利用领域知识做出清洁和标签决策;防止隔间内泄漏(组泄漏和颞泄漏);修复数据版本和种子。人工智能在这条线上生成代码和想法,但由你决定处理哪些数据以及如何处理——因为这里的每个错误决定都会作为隐藏的缺陷传递到模型中。

应用任务

在您自己的数据集上编写一个验证方案(pandera/远大前程),并故意添加一个坏行并表明它被捕获。然后暂时或批量分割数据,仅根据训练计算缩放参数,并通过断言验证是否存在泄漏。将数据版本和行计数写入元数据文件。

清单

  • [ ] 模式验证在行顶部运行。
  • [ ] 我根据字段含义选择了缺失值策略,我没有机械地填写。
  • [ ] 我测量了标签质量(合规性);我人工检查了 LLM 标签。
  • [ ] 我防止了窗格中的组和时间泄漏。
  • [ ] 仅根据训练集计算的缩放/编码。
  • [ ] 记录的数据版本、行数和种子。