读数据质量管理:数据可靠性与数据质量问题解决之道08扩展异常检测
1. Python和机器学习扩展异常检测
1.1. 机器学习有助于大规模数据可观测性和数据监控
-
1.1.1. 配备了机器学习的检测器可以更灵活地应用到更多的数据表上,从而消除了随着数据仓库或数据湖的增长进行手动检查和手动操作的需要
-
1.1.2. 机器学习检测器可以实时学习和适应数据,并且可以捕获到人眼看不到的复杂的季节模式
-
1.1.3. 使用机器学习中的一些概念,用更规整的方式来勾勒问题,从而提供大规模的数据可观测性和数据信任
1.2. 构建一个完美的预测器是不可能的,而且对任何有趣的预测问题都是如此
1.3. 在假阳性和假阴性之间,或者在精确率和召回率之间,总要有所取舍
1.4. 真阳性
- 1.4.1. 当一个数据点确实有问题且我们的检测器也同样发出认为其“异常”的信号时
1.5. 假阳性
-
1.5.1. 预测异常,但实际正常
-
1.5.2. 虽然发出了数据监控警报,但并没有真正出现问题
-
1.5.3. 浪费了用户的时间来对警报做出响应
-
1.5.4. 假阳性是我们检测到异常但存疑的数据点实际上没有异常的情况
-
1.5.5. 假阳性检测就像狼来了,换句话说就是你的算法给出了“异常”的结果,但数据点实际上没有任何问题
-
1.5.5.1. “喊狼来了”的探测器
1.6. 真阴性
- 1.6.1. 当一个数据点一切正常且我们的检测器也没有检测到它(即发出“不异常”的信号)时
1.7. 假阴性
-
1.7.1. 预测正常,但实际异常
-
1.7.2. 确实存在问题,但没有发出数据监控警报
-
1.7.3. 把一个真正的问题忽视了
-
1.7.4. 假阴性是数据点确实有问题但检测器没有检测到的情况
-
1.7.5. 假阴性检测就像一只沉睡的警犬,也就是说你的算法会让问题无法被发现
-
1.7.5.1. “沉睡警犬型”的探测器
-
1.7.5.2. 过于保守的检测器永远不会发出异常检测,这意味着当事情真的出错时,它们也肯定会错过
1.8. 异常检测是一项无监督任务
-
1.8.1. 无监督学习是一种机器学习任务,在该任务中,最优行为在训练时是不可知的
-
1.8.2. 你正在训练的数据并没有附加任何标签
-
1.8.2.1. 你可能不得不把异常检测称为无监督学习,因为异常并没有一个统一的基本事实
-
1.8.2.2. 没有基本事实,你就无法得到错误信号
> 1.8.2.2.1. 你无法得到预测结果和你应该预测的结果之间的差异
-
1.8.3. 对于任何给定的数据点,异常检测器会发出“异常”或“非异常”的预测
-
1.8.4. 存疑的数据点要么是真正的问题,要么完全就不是问题
-
1.8.5. 即使是最训练有素的异常检测算法也不可能完全避免假阳性和假阴性
-
1.8.5.1. 机器学习改进数据监控警报
-
1.8.5.2. 出于简单的统计原因,两者无法同时避免
-
1.8.5.3. 其实更少的假阳性会以更多的假阴性为代价,反之亦然
1.9. 提高精确率和召回率
-
1.9.1. 精确率(又称查准率)被定义为做出正确预测的概率
-
1.9.1.1. 在所有做出的“阳性”预测中,有多少是正确的呢?
-
1.9.1.2. 具有高精确率的检测器是“精确的”,因为当它预测事件异常时,往往是正确的
-
1.9.1.3. 精确率通常告诉我们发出阳性警报时正确的频率
-
1.9.1.4. 具有高精确率的模型会输出可信的警报,因为它们的高精确率保证了它们很少“喊狼来了”
> 1.9.1.4.1. 一个高精确率的模型是一个很少喊狼来了的模型
> 1.9.1.4.2. 它发出警报时,你最好相信它
-
1.9.2. 召回率(又称查全率)被定义为实际异常被检测到的概率
-
1.9.2.1. 在所有真正的异常中,我们捕捉到了多少呢?
-
1.9.2.2. 具有高召回率的检测器能够很好地“召回”,它捕获实际上是真异常的概率很高
-
1.9.2.3. 召回率告诉我们对问题真正发出警报的数量
-
1.9.2.4. 具有高召回率的模型是可靠的,因为它们的高召回率保证了它们很少忽略真正存在的问题
> 1.9.2.4.1. 有良好召回率的模型就像一只敬业的警犬
> 1.9.2.4.2. 你可以放心,这个模型会捕获到所有真正的问题
-
1.9.3. 数据世界是由可量化的目标来运行的,在大多数情况下,我们需要一个单一的目标来进行优化,而不是两个
-
1.9.3.1. 将精确率和召回率组合成一个被称为F分数(F-score)的指标
-
1.9.3.2. Fβ被称为加权F分数,因为不同的β值在计算中权衡精确率和召回率有所不同
-
1.9.3.3. Fβ分数表示:“我认为召回率是精确率重要程度的β倍。”
> 1.9.3.3.1. 当β = 1时,该等式认为两个指标一样重要
> 1.9.3.3.2. 当β > 1时,表示召回率比精确率更重要
> 1.9.3.3.2.1. 我更关心捕捉到所有的异常,而不是偶尔引起的错误警报
> 1.9.3.3.3. 设置β<1,精确率会更重要
> 1.9.3.3.3.1. 我更关心我的警报是真实的,而不是捕捉每一个真正的问题
-
1.9.4. Facebook Prophet是一种预测模型,用于大规模处理时间序列数据中的日、周、月和年的季节性关系
-
1.9.5. TensorFlow是用于各种任务(包括自然语言处理、计算机视觉和时间序列异常检测)的流行机器学习库
-
1.9.5.1. 对高级异常检测算法一些有用且记录完备的实现
-
1.9.5.2. 在行业场景中更受欢迎
-
1.9.6. PyTorch
-
1.9.6.1. 在Facebook开发的另一个机器学习Python库
-
1.9.6.2. 可实现与TensorFlow(由Google开发)类似的用例
-
1.9.6.3. 通常在行业中的学术领域具有较高的知名度
-
1.9.7. scikit-learn是另一个流行的机器学习软件包
-
1.9.7.1. 有k邻近(k-nearest neighbor)算法和孤立森林(isolation forest)算法的版本,这是两种常用的聚类(clustering)方法
-
1.9.7.2. 用Python开发的
-
1.9.8. MLflow
-
1.9.8.1. 由Databricks的创建者开发的一种流行的实验跟踪开源工具
-
1.9.8.2. 实验跟踪是指在开发和生产中管理机器学习模型的过程
-
1.9.8.3. 实验跟踪是管理机器学习模型开发和训练的过程,包括超参数比较、依赖项检查、管理和编排训练作业、保存模型快照和收集日志等任务
-
1.9.8.4. 主要是一个实验跟踪和再现软件
-
1.9.8.5. 开发异常检测软件的一个重要方面是保证代码在不同机器上的运行是相同的
> 1.9.8.5.1. 不会希望在本地解决了一个错误(bug),但在生产环境中却无法应用
-
1.9.9. TensorBoard
-
1.9.9.1. TensorFlow的可视化工具包
-
1.9.9.2. 无须使用TensorFlow建模即可使用该软件
1.10. 检测新鲜度事件
-
1.10.1. 越长的中断就越有可能是真实的事件,但谁也无法保证
-
1.10.2. 弱相关性会让一个好的模型足够有效但并不完美
1.11. F分数
-
1.11.1. F分数是分类准确性指标,旨在兼顾优化精确率和召回率
-
1.11.2. 对于统计学家来说该分数的定义是模型精确率和召回率的调和平均值
-
1.11.3. F1分数旨在平衡精确率和召回率,它认为精确率和召回率同等重要
-
1.11.4. 对于导弹探测系统来说,假阳性比假阴性要好。这意味着召回率比精确率更重要
-
1.11.5. 当β=1时,这个方程与F1分数方程相同
-
1.11.5.1. 当β=1时,这个方程与F1分数方程相同
-
1.11.6. 当召回率更重要时,我们应该预期F2分数高于F1分数
1.12. 模型的准确率重要吗
-
1.12.1. 准确率并不像检测器的平均正确率那么简单,而且对于不同的应用程序来说,其定义也不应该相同
-
1.12.2. 根据设置的阈值来绘制精确率、召回率和F1分数,则会发现一些重要的信息
-
1.12.2.1. 具有低阈值的激进检测器具有最佳的召回率
> 1.12.2.1.1. 它们可以更快地发出警报,从而发现更多真正的问题
- 1.12.2.2. 更保守一些的检测器具有更好的精确率
> 1.12.2.2.1. 它们只对可能是真实的严重异常发出警报
- 1.12.3. 任何关于模型准确率的讨论,如果没有某种基准事实与模型预测进行比较,都是不完整的
2. 异常检测算法
2.1. 近乎实时地检测问题
2.2. 向需要了解情况的人发出警报
2.3. 提供信息以帮助防止未来发生宕机
2.4. 规则定义
-
2.4.1. 规则定义为某些指标值设置了明确的切分点,并确定了相对于阈值的异常值
-
2.4.2. 只有当大多数数据点都在阈值范围内时,这种方法才能被称为“异常”检测
-
2.4.3. 规则定义具有令人难以置信的可扩展性,可用于定义极为明确的服务级别协议、数据正常运行时间保证等
2.5. 自回归模型
-
2.5.1. 自回归适用于时间序列的异常检测,其中数据点使用时间戳对象进行排序
-
2.5.2. 时间戳对象进行排序。自回归模型从以前的时间步长获取数据,将它们输入回归(线性)模型,并使用该输出来预测下一个时间戳的数据将在哪里
-
2.5.3. 偏离自回归预测太远的数据点会被标记为异常
-
2.5.4. 自回归移动平均(ARMA)检测算法和ARIMA检测算法
2.6. 指数平滑
-
2.6.1. 指数平滑法可以从时间序列中消除趋势和季节性,以便人们可以使用更简单的方法(例如,ARIMA)进行后续分析
-
2.6.2. Holt-Winters是一个用于时间序列预测的著名季节性模型,并且还有丰富的分类系统
-
2.6.2.1. 累加性(additive)
-
2.6.2.2. 累乘性(multiplicative)
-
2.6.2.3. 阻尼法(damped,又称衰减法)
-
2.6.2.4. 非阻尼法(nondamped)
2.7. 聚类
- 2.7.1. 聚类技术[如k近邻算法或孤立森林算法]通过将相似的数据点放入同一个数据桶中,并提醒你注意那些“和桶中数据差异较大的数据点”来发现异常
2.8. 超参数调优
-
2.8.1. 有些参数通过数据的使用和训练过程才能获得
-
2.8.2. 被称为超参数的其他参数则不是通过学习过程获得的,反而超参数可以以特定方式去帮助模型的学习和推断过程
2.9. 集成模型框架
- 2.9.1. 集成模型框架充分利用了聚类、指数平滑和自回归节点等各种方法的优点,将它们组合成一个前馈神经网络,并使用多数投票集成算法将它们的预测结合起来
3. 数据质量监控器
3.1. 在为数据系统构建数据质量监控器时,重要的是要区分,你是在使用来自数据仓库的结构化整体数据,还是在使用现代数据湖生态系统中的复杂数据
3.2. 主要区别
-
3.2.1. 你必须考虑的入口点数量
-
3.2.1.1. 数据湖系统往往具有大量的入口点,这意味着应该假设从不同来源输入的数据具有高度的异构性
-
3.2.1.2. 要警惕“一刀切”的建模方法
-
3.2.1.3. 另一种方法是使用集成模型架构,或者简单地为每个用例使用单独的模型
-
3.2.2. 要如何收集并存储元数据
-
3.2.3. 你会如何访问该元数据
3.3. 直接从数据湖中收集的元数据可能需要经过不同级别的预处理后,才能指望异常检测算法从它们当中获得有价值的信息
3.4. 类型可能需要强制(隐式)转换,模式可能需要对齐,而你可能会发现在运行检测器的训练任务之前,自己在数据中获得了全新的增强特征