实践中的数据可观察性:基于SQL和机器学习的大规模数据监控

Data pipelines can break for a million different reasons, 但是,推荐一个正规滚球网站如何确保实时识别和解决数据质量问题呢在规模? 有时,它所需要的只是一点SQL,一些精度和回忆,以及一个整体的方法 数据可观测性.

在这篇文章中 , 推荐一个正规滚球网站将介绍如何从零开始创建自己的数据可观察性监视器,并利用机器学习的基本原则在数据管道中大规模应用它们.

随着企业依赖越来越多的数据来驱动越来越复杂的管道, it’s imperative that this data is reliable, 准确的, 和值得信赖. When data breaks—whether from schema changes, 空值, 重复, or otherwise—we need to know, 和 . A stale table or erroneous metric, 任其发展, 会给你的生意带来负面影响吗.

If you’re a data professional, 当您试图了解数据的健康状况时,您可能会发现自己会一次又一次地问以下问题:

  • 数据是最新的吗?
  • 数据是否完整?
  • Are fields within expected ranges?
  • Is the null rate higher or lower than it should be?
  • 模式改变了吗?

为了回答这些问题,推荐一个正规滚球网站可以借鉴软件工程师的经验: 数据可观测性. 数据工程师定义 数据可观测性 作为一个组织回答这些问题和评估其数据生态系统健康状况的能力. 数据可观察性的五个支柱反映了数据健康的关键变量: 

  • 新鲜:我的数据是最新的? Are t在这里 gaps in time w在这里 my data has not been updated?
  • 分布: how healthy is my data at the field-level? Is my data within expected ranges?
  • 体积: is my data intake meeting expected thresholds?
  • 模式:我的数据管理系统的正式结构发生了变化?
  • 血统:如果我的一些数据坏了,上游和下游受到什么影响? How do my data sources depend on one another?

In 本系列文章推荐一个正规滚球网站拉开帷幕来研究数据的可观察性是什么样子的 在代码中, 和 in this final installment, 推荐一个正规滚球网站将退一步思考是什么造就了一个好的数据质量监视器 在一般情况下. 也许你读过 部分我II 和 are thinking to yourself, 这些都是有趣的练习, but how can we actually go about applying the concepts in my 真实的生产环境?”

在高水平上,机器学习是数据可观测性的工具. 配备了机器学习的检测器可以更灵活地应用于大量的表格, 随着数据仓库的增长,消除了手动检查和规则的需要(如第1部分和第2部分所讨论的). 也, 机器学习检测器可以实时学习和适应数据, 捕捉复杂的季节模式,否则人类的眼睛是看不见的.

Let’s dive in—no prior machine learning experience required.

推荐一个正规滚球网站的数据环境

本教程基于 练习4 奥莱利的课程 管理数据的停机时间. 欢迎您使用Jupyter笔记本和SQL自己尝试这些练习.

As you may 回忆 from 部分我 和 II, we’re working with 模拟天文数据 关于宜居行星. 不幸的是,这些数据没有任何真实的东西——它是出于教学目的捏造的——但你可以假装它是直接从 毅力 如果你想. 🙂

We generated the dataset with Python, 从推荐一个正规滚球网站在生产环境中遇到的真实事件中建模数据和异常. (This dataset is entirely free to use, 和 the 跑龙套的文件夹 in the repository contains the code that generated the data.)

For this exercise, we’re using SQLite 3.32.3, 这应该使数据库可以从命令提示符或SQL文件与最小的设置. The concepts extend to really any query language, 和 这些实现 可以扩展到MySQL, Snowflake和其他数据库环境的最小变化.

在这篇文章中,推荐一个正规滚球网站将把注意力限制在系外行星表上:

请注意,EXOPLANETS被配置为手动跟踪一个重要的元数据——date_added列——它记录了推荐一个正规滚球网站的系统发现这颗行星的日期,并将其自动添加到推荐一个正规滚球网站的数据库. 在第一部分中,推荐一个正规滚球网站使用了一个简单的SQL查询来可视化每天添加的新条目的数量:

This query yields data that looks like this:

用文字, 太阳系外行星表每天例行更新约100个条目, but goes “offline” on some days when no data is entered. 推荐一个正规滚球网站引入了一个名为DAYS_SINCE_LAST_UPDATE的度量来跟踪表的这个方面:

结果是这样的:

With a small modification, we introduced a 阈值参数 到查询中创建 新鲜探测器. 推荐一个正规滚球网站的探测器返回的所有日期中,最新的数据系外行星超过1天.

图中的峰值代表了系外行星表使用旧数据的实例. 在某些情况下, 这样的中断可能是标准的操作程序——也许推荐一个正规滚球网站的望远镜应该进行维护, so no data was recorded over a weekend. 在其他情况下, 虽然, 停机可能代表数据收集或转换的真正问题——可能推荐一个正规滚球网站将日期更改为ISO格式, 传统上推动新数据的工作现在正在失败. We might have the heuristic that longer outages are worse, 但除此之外, 推荐一个正规滚球网站如何保证推荐一个正规滚球网站只检测到数据中的真正问题?

The short answer: you can’t. 构建一个完美的预测器是不可能的(无论如何,对于任何有趣的预测问题来说). 但, 推荐一个正规滚球网站可以使用机器学习中的一些概念,以一种更结构化的方式来构建问题, 结果就是, deliver 数据可观测性 和 trust 在规模.

Improving alerting with machine learning

每当推荐一个正规滚球网站警告一个破裂的数据管道时,推荐一个正规滚球网站必须怀疑警报是否准确. 警报是否表示 真正的 问题? We might be worried about two scenarios:

  1. An alert was issued, but t在这里 was no 真正的 issue. We’ve wasted the user’s time responding to the alert.
  2. T在这里 was a 真正的 issue, but no alert was issued. We’ve let a real 问题 go undetected.

These two scenarios are described as 假阳性 (predicted anomalous, actually OK) 和 假阴性 (预测OK,实际上是异常的),推荐一个正规滚球网站想要避免它们. 发布假阳性就像在喊狼来了——推荐一个正规滚球网站拉响了警报,但一切都好. 同样的, 发布假阴性结果就像在值勤时睡觉一样肯定出了问题, 但推荐一个正规滚球网站什么都没做.

推荐一个正规滚球网站的目标是尽可能避免这些情况,并专注于最大化 真正的阳性 (predicted anomalous, actually a 问题) 和 真正的底片 (预测OK,实际上OK).

精度和召回

So, we want a good detection scheme to minimize both 假阳性假阴性. 在机器学习实践中,更常见的是思考相关但更深刻的术语, 精度回忆:

Image courtesy of 瑞安·卡恩斯.

一般来说,精确度告诉推荐一个正规滚球网站何时发布警报是正确的. Models with 良好的精度 output 可信的警告因为他们的高精度保证了他们很少会喊“狼来了”.

回忆一下,一般来说,它告诉推荐一个正规滚球网站有多少问题推荐一个正规滚球网站需要提醒. 召回率高的型号是 可靠的因为他们的高记忆力保证了他们在工作时很少睡觉.

Extending our metaphor, a model with 良好的精度 一个模型很少喊狼来了吗?当它发出警报时,你最好相信它. 同样,一个模型 好回忆 就像一只好的看门狗,你可以放心,这个模型会抓住所有真正的问题.

Balancing 精度 和 回忆

当然,问题在于你不可能两全其美. Notice that t在这里’s an explicit tradeoff between these two. How do we get perfect 精度? 简单:警惕 没有什么值班睡觉 所有的时间—forcing us to have a False Positive rate of 0%. 这个问题? 召回将是可怕的,因为推荐一个正规滚球网站的假阴性率将是巨大的.

同样的, how do we get perfect 回忆? 同样简单的是:对一切保持警惕——每一次都有狼叫——迫使假阴性率为0%. 问题是,正如预期的那样,推荐一个正规滚球网站的误报率将受到影响,影响精度.

Solution: a singular objective

Our world of data is run by quantifiable objectives, 和 in most cases we’ll want a singular objective to optimize, 不是两个. 推荐一个正规滚球网站可以将精确度和回忆度合并成一个称为an的指标 F分数:

F_beta叫做a 加权 F分数,因为不同的beta值在计算中对精度和回忆的权重不同.  一般来说,F_beta分数表示:“我认为召回率与准确度同等重要.”

When beta = 1, the equation values each equally. Set beta > 1, 和 回忆 will be more important for a higher score. 换句话说, beta > 1 says, “我更关心的是发现所有的异常情况,而不是偶尔引起错误的警报.” 同样的, set beta < 1, 和 精度 will be more important. beta < 1 says, “I care more about my alarms being 真正的 than about catching every real issue.”

Detecting freshness incidents 

With our new vocabulary in h和, 让推荐一个正规滚球网站回到检测系外行星表中新鲜度事件的任务上来. We’re using a simple prediction algorithm, 因为推荐一个正规滚球网站通过设置一个模型参数X将查询转换为检测器. 推荐一个正规滚球网站的算法表示,“任何超过X天的中断都是异常,推荐一个正规滚球网站将为此发出警报。.“即使是在这样简单的情况下,准确性、回忆性和f 分数都可以帮助推荐一个正规滚球网站!

为了展示,推荐一个正规滚球网站取了系外行星上的新鲜中断并分配 地面实况标签 encoding whether each outage is a 真正的 incident or not. 没有一些基本事实是不可能计算出一个模型的准确性的,所以考虑如何为你的用例生成这些总是有帮助的. 回忆一下,在太阳系外行星表中,总共有6次持续1天以上的中断:

推荐一个正规滚球网站可以任意假设,2020年02月8日和2020年05月14日发生的事件是真实的. 每一个都是8天,所以它们是有问题的是有道理的. 另一方面,假设2020-03-30和2020-06-07的中断不是实际事件. 这些中断分别是4天和3天,所以这并不奇怪. 最后,将2020年06月17日和2020年06月30日的中断时间分别设为5天和3天, 是真实的事件.

Having chosen our 地面实况 in this way, 推荐一个正规滚球网站看到,更长的中断时间更有可能成为实际问题, 但这并不能保证. This weak correlation will make a good model effective, 但是不完美, just as it would be in more complex, 真正的用例.

现在, suppose we begin by setting our threshold to 3 days—in words, “every outage longer than 3 days is an anomaly.“这意味着推荐一个正规滚球网站能正确地探测到2020-02-08、2020-05-14和2020-06-17的异常,所以推荐一个正规滚球网站有3个 真正的阳性. 但是,不幸的是,推荐一个正规滚球网站发现2020-03-30不是一个事件,所以推荐一个正规滚球网站有1个 假阳性. 3个真阳性/(3个真阳性+ 1个假阳性)意味着推荐一个正规滚球网站的精度是0.75. 此外,推荐一个正规滚球网站未能检测到2020年06月30日是一个事件,这意味着推荐一个正规滚球网站有1个 假阴性. 3个真阳性/(3个真阳性+ 1个假阴性)意味着推荐一个正规滚球网站的召回率也是0.75. F_1分数, which is given by the formula

means that our F_1分数 is 也 0.75. 不坏!


现在, let’s assume we set the threshold higher, at 5 days. 现在,推荐一个正规滚球网站只检测到2020-02-08和2020-05-14这两个最长的中断. These turn out to both 是真实的事件, so we have no 假阳性, meaning our 精度 is 1—perfect! 但 note that we fail to detect other 真正的 anomalies, 2020-06-17和2020-06-30, meaning we have 2 假阴性. 2个真阳性/(2个真阳性+ 2个假阴性)意味着推荐一个正规滚球网站的回忆是0.5、比以前更糟. It makes sense that our 回忆 suffered, 因为推荐一个正规滚球网站选择了一个更保守的,阈值更高的分类器. 推荐一个正规滚球网站的F_1分数可以再次用上面的公式计算,结果是0.667.

如果推荐一个正规滚球网站画出精度, 回忆, 和 F_1 in terms of the threshold we set, we see some important patterns. 第一个, 具有低阈值的攻击性探测器召回率最高, 因为他们能更快地发出警报,从而抓住更多真正的问题. 另一方面, more passive detectors have better 精度, 因为它们只会对更可能是真实的最糟糕的异常情况发出警报. F_1评分在这两个极端之间达到峰值——在本例中,在4天的阈值. Finding the sweet spot is key!

Image courtesy of 瑞安·卡恩斯.

Finally, let’s look at one last comparison. 注意,推荐一个正规滚球网站只看了F_1的分数,它对准确率和回忆率的权重相等. What happens when we look at other values of beta?

Image courtesy of 瑞安·卡恩斯.

回想一下,一般的F_beta是说:“回忆是beta时间,与精确度同样重要.“因此, 推荐一个正规滚球网站应该预料到,当回忆被优先排序时,F_2比F_1高——这正是推荐一个正规滚球网站在阈值小于4时所看到的情况. 同时,F_0.5 score is higher for larger thresholds, 显示更多的允许保守分类器与更大的精度.

Data observability 在规模 with machine learning

We’ve taken a quick safari through machine learning concepts. 现在,这些概念如何帮助推荐一个正规滚球网站将检测器应用到生产环境中呢? 关键在于要明白,对于任何异常检测问题,都没有完美的分类器. 有 总是 假阳性和假阴性之间的权衡,或同样的精确度和回忆. 你必须问自己,“我如何权衡这两者之间的权衡。? What determines the ‘sweet spot’ for my model parameters?“选择一个F_beta评分进行优化将隐含地决定你如何衡量这些情况, 和 t在这里by what matters most in your classification 问题.

另外,请记住,任何关于模型准确性的讨论都是不完整的 地面实况 to compare with the model’s predictions. 在您知道有一个好的分类之前,您需要知道是什么构成了一个好的分类.

Here’s wishing you no data downtime!


Interested in learning how you fix data quality 在规模? 接触 巴尔, 瑞安,剩下的 蒙特卡罗 团队.

The associated exercises for this tutorial are available, 在这里, 和 the adapted code shown in this article is available, 在这里.