恭喜!您已经部署了 unicorn 模型。 您的模型应能全天候运行,而不会出现任何问题。为此 您必须监控机器学习 (ML) 流水线。
编写数据架构以验证原始数据
如需监控数据,您应该根据预期持续检查数据 例如,您可以编写数据必须满足的规则。此集合 称为“数据架构”。按以下方式定义数据架构 具体步骤:
了解特征的范围和分布。对于分类 来理解可能的值的集合。
将您的理解编码到数据架构中。以下是 规则:
- 确保用户提交的评分始终介于 1 到 5 之间。
- 检查单词 the 的出现频率是否最高(对于英语文本) 功能)。
- 检查每个分类特征是否设置为固定集中的值 一组可能的值。
根据数据架构测试数据。您的架构应捕获数据 错误,例如:
- 异常
- 分类变量的意外值
- 意外的数据分布
编写单元测试以验证特征工程
虽然您的原始数据可能会传递数据架构,但您的模型不会训练 原始数据。更确切地说,您的模型使用已 进行过工程设计。例如,您的模型基于归一化的数值特征进行训练 而不是原始数值数据。因为特征工程数据 与原始输入数据不同,您必须检查特征工程数据, 与对原始输入数据的检查分开。
根据您对特征工程数据的理解来编写单元测试。 例如,您可以编写单元测试来检查 以下:
- 所有数字特征都会缩放(例如,介于 0 到 1 之间)。
- 独热编码 它们仅包含一个 1 和 N-1 零。
- 转换后的数据分布符合预期。 例如,如果您使用 Z 分数进行了标准化, Z 得分应为 0。
- 离群值 例如通过扩缩 或剪辑。
查看重要数据切片的指标
成功的整个流程有时会掩盖失败的子集。也就是说, 如果模型的整体指标值较高, 。例如:
独角兽模型在整体上表现良好,但在 对撒哈拉沙漠做出预测
如果您是一位对整体曲线下面积感到满意的工程师,那么 模型在撒哈拉沙漠中存在的问题可能就没有注意到。如果正在进行 在每个区域进行良好预测至关重要,因此您需要 效果数据子集,例如 称为数据切片。
识别感兴趣的数据切片。 然后将这些数据切片的模型指标与 整个数据集中。检查您的模型是否在所有数据切片中表现良好 有助于消除偏见请参阅 公平性:评估偏差 。
使用实际指标
模型指标不一定能衡量模型的实际影响。 例如,更改超参数可能会增加模型的 AUC, 这一变化是否影响了用户体验?若要衡量现实世界的影响,您需要 定义单独的指标例如,你可以对使用你的模型的用户进行问卷调查 模型预测它们是否确实看到了独角兽 。
检查训练-应用偏差
训练-应用偏差 这意味着您在训练期间的输入数据 从输入数据中提取出来。下表介绍了 两种重要的偏差:
类型 | 定义 | 示例 | 解决方案 |
---|---|---|---|
架构偏差 | 训练和传送输入数据不遵循同一架构。 | 投放数据的格式或分布发生变化 而模型会继续使用旧数据进行训练。 | 使用同一架构来验证训练数据和服务数据。 请务必单独检查 未检查的统计信息 您的架构,例如缺失值的比例 |
特征偏差 | 训练和传送的工程数据有所不同。 | 训练和部署的特征工程代码有所不同, 从而产生不同的工程数据。 | 与架构偏差类似,在整个训练中应用相同的统计规则 和提供工程数据。跟踪号码 检测到的偏差特征的百分比,以及每个特征的偏差样本比率。 |
训练-应用偏差的原因可能很细微。 在预测时,请始终考虑哪些数据可供模型使用。 在训练期间,请仅使用您在提供服务时可用的功能。
练习:检查您的理解情况
假设您拥有一家网店,并希望 你某一天能赚多少钱。您的机器学习目标是每天预测 利用客户数量作为一项特征,以此来增加收入。
答:问题在于,您不知道 预测时计算出的客户数量, 。因此,即使此功能已被 能够很好地预测每日收入与此相关的是 训练模型并获得令人惊叹的评估指标(例如 0.99, AUC)、 并找出这些会渗透到标签的特征。
检查标签是否泄露
标签泄露表示 标准答案标签 预测操作意外进入了训练特征。标签 有时很难发现。
练习:检查您的理解情况
假设您构建一个二元分类模型来预测 一位医院新病人患有癌症。您的模型使用如下特征:
- 患者年龄
- 患者性别
- 以往的疾病
- 医院名称
- 生命体征
- 测试结果
- 遗产
标签如下所示:
- 布尔值:患者是否患有癌症?
您需要仔细划分数据,确保训练集运行良好, 与验证集和测试集隔离开来。模型执行 在验证集和测试集上表现出色;指标 太棒了遗憾的是,模型对新患者表现极差 真实世界。
答案:模型的特征之一是医院名称。 有些医院专门治疗癌症。在训练期间, 模型很快了解到,分配到某些医院的患者 可能患有癌症因此,医院名称成为了一个具有高度权重的特征。
在推理时,大多数患者尚未被分配到医院。 毕竟,该模型的用途是诊断 然后根据诊断结果将患者 前往相应医院。因此,在推理过程中, 医院名称特征尚不可用,该模型是强制 依赖于其他功能。
监控整个流水线中的模型存在时间
如果服务数据会随着时间的推移而变化,但您的模型没有定期重新训练, 模型质量会下降。跟踪自从使用该模型 根据新数据重新训练,并设置提醒的阈值。除了监控 模型的存在时间,那么您应该监控整个流水线中的模型的存在时间 找出流水线停滞点
测试模型权重和输出在数值上是否稳定
在模型训练期间,您的权重和层输出不应为 NaN (不是数字)或 Inf(无限)。 编写测试以检查权重和层输出的 NaN 和 Inf 值。 此外,测试确保一个层有超过一半的输出不为零。
监控模型性能
你的独角兽外观预测程序的受欢迎程度超出了预期!您 以获得更多预测请求和训练数据。你觉得 但在发现模型占用的内存越来越多之前 和训练时间。您决定通过以下方式监控模型的性能: 具体步骤:
- 按代码、模型和数据版本跟踪模型性能。此类跟踪 让您可以精确找出导致性能下降的确切原因。
- 根据以下数据测试新模型版本的每秒训练步数: 与固定阈值进行比较。
- 通过设置内存用量阈值来捕获内存泄漏。
- 监控 API 响应时间并跟踪其百分位数。虽然 API 响应 有时响应速度可能超出了您的控制范围,响应速度缓慢可能会导致 实际指标较差。
- 监控每秒应答的查询数。
使用提供的数据测试实时模型的质量
您已验证模型。但如果在现实世界中的情景,比如独角兽 行为,在记录验证数据后发生变化?然后,您的 提供的模型会降级。然而,测试广告投放质量并非易事, 现实世界数据不一定总是带有标签。如果您的投放数据未添加标签 请考虑进行以下测试:
研究在预测中存在显著统计偏差的模型。请参阅 分类 (Classification):预测 偏差。
跟踪模型的实际指标。例如,如果您要对 请将您的预测与用户举报的垃圾邮件进行比较。
通过以下方式缩小训练数据与提供数据之间可能存在的差异: 基于一小部分查询提供新的模型版本。在验证时 逐步将所有查询切换到新版本。
使用这些测试时,请记住在 Cloud SQL 中监控 预测质量。
随机
使数据生成流水线可重现。假设您想添加一项功能 以了解它对模型质量的影响。为了实现公平的实验,您的数据集应 除了这项新功能外,其他部分完全相同 秉承这一理念,确保在数据生成过程中, 确定性:
- 为随机数生成器设定种子 (RNG)。“种子”规则可确保 RNG 每次运行时都会以相同的顺序输出相同的值,重新创建 数据。
- 使用不变的哈希键。 哈希是拆分 或示例数据。你可以对每个样本进行哈希处理,并使用生成的整数 决定将样本放入哪个分块。哈希函数的输入 不应在每次运行数据生成程序时更改。请勿使用 或哈希值 您可以按需重新创建哈希值。
上述方法既适用于数据采样,也适用于拆分数据。
哈希处理的注意事项
再想象一下,您在收集搜索查询并使用哈希技术 来包含或排除查询如果哈希键仅使用查询, 那么对于多日的数据,您可以始终添加 该查询或始终排除该查询。始终包含或始终排除 查询都不好,因为:
- 您的训练集看到的查询会不太多样化。
- 评估集会人为难以评估, 与训练数据重叠的情况。实际上,在投放时 已经从训练数据中看到过一些实时流量, 评估应反映这一点。
相反,您可以针对查询 + 日期进行哈希处理,但这会产生不同的哈希处理 。
![图 7. 直观图示:仅对
查询会导致数据每天都进入同一个存储分区,
加上查询时间会使数据进入
存储分区。三个分区分别为训练、评估和
已忽略。](https://developers.google.cn/static/machine-learning/crash-course/images/hashing_on_query.gif?authuser=4&hl=lt)